MC: Switch MCContext value table to storing MCExprs.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 16 Oct 2009 01:33:11 +0000 (01:33 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 16 Oct 2009 01:33:11 +0000 (01:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84228 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCContext.h
lib/MC/MCContext.cpp
lib/MC/MCExpr.cpp

index 955aa8b0838880733c56698f182f7ce928da2597..d5c240438916049903b9577db862ae995bd3c3df 100644 (file)
@@ -15,7 +15,7 @@
 #include "llvm/Support/Allocator.h"
 
 namespace llvm {
-  class MCValue;
+  class MCExpr;
   class MCSection;
   class MCSymbol;
   class StringRef;
@@ -36,7 +36,7 @@ namespace llvm {
     /// SymbolValues - Bindings of symbols to values.
     //
     // FIXME: Is there a good reason to not just put this in the MCSymbol?
-    DenseMap<const MCSymbol*, MCValue> SymbolValues;
+    DenseMap<const MCSymbol*, const MCExpr*> SymbolValues;
 
     /// Allocator - Allocator object used for creating machine code objects.
     ///
@@ -63,7 +63,7 @@ namespace llvm {
     /// @param IsTemporary - Whether this symbol is an assembler temporary,
     /// which should not survive into the symbol table for the translation unit.
     MCSymbol *GetOrCreateSymbol(const StringRef &Name);
-    
+
     /// CreateTemporarySymbol - Create a new temporary symbol with the specified
     /// @param Name.
     ///
@@ -79,22 +79,30 @@ namespace llvm {
     /// @name Symbol Value Table
     /// @{
 
-    /// ClearSymbolValue - Erase a value binding for @arg Symbol, if one exists.
-    void ClearSymbolValue(const MCSymbol *Symbol);
+    /// ClearSymbolValue - Erase the variable binding for @arg Symbol, if one
+    /// exists.
+    void ClearSymbolValue(const MCSymbol *Symbol) {
+      SymbolValues.erase(Symbol);
+    }
 
-    /// SetSymbolValue - Set the value binding for @arg Symbol to @arg Value.
-    void SetSymbolValue(const MCSymbol *Symbol, const MCValue &Value);
+    /// SetSymbolValue - Set the variable binding for @arg Symbol to @arg Value.
+    void SetSymbolValue(const MCSymbol *Symbol, const MCExpr *Value) {
+      assert(Value && "Invalid variable assignment!");
+      SymbolValues.insert(std::make_pair(Symbol, Value));
+    }
 
-    /// GetSymbolValue - Return the current value for @arg Symbol, or null if
-    /// none exists.
-    const MCValue *GetSymbolValue(const MCSymbol *Symbol) const;
+    /// GetSymbolValue - Return the current variable value for @arg Symbol, or
+    /// null if @arg Symbol is not a variable.
+    const MCExpr *GetSymbolValue(const MCSymbol *Symbol) const {
+      return SymbolValues.lookup(Symbol);
+    }
 
     /// @}
 
     void *Allocate(unsigned Size, unsigned Align = 8) {
       return Allocator.Allocate(Size, Align);
     }
-    void Deallocate(void *Ptr) { 
+    void Deallocate(void *Ptr) {
     }
   };
 
index f36564a6afaebee11da17dcbecaac41066a9ad40..db59f7f505c6d39976fb8ca2809eb31071c43899 100644 (file)
@@ -52,20 +52,3 @@ MCSymbol *MCContext::CreateTemporarySymbol(const StringRef &Name) {
 MCSymbol *MCContext::LookupSymbol(const StringRef &Name) const {
   return Symbols.lookup(Name);
 }
-
-void MCContext::ClearSymbolValue(const MCSymbol *Sym) {
-  SymbolValues.erase(Sym);
-}
-
-void MCContext::SetSymbolValue(const MCSymbol *Sym, const MCValue &Value) {
-  SymbolValues[Sym] = Value;
-}
-
-const MCValue *MCContext::GetSymbolValue(const MCSymbol *Sym) const {
-  DenseMap<const MCSymbol*, MCValue>::iterator it = SymbolValues.find(Sym);
-
-  if (it == SymbolValues.end())
-    return 0;
-
-  return &it->second;
-}
index 0f3e053de8ec809f90641988bfff560e3aa7d88d..4c92bbb0a50db063630af5eaef31e4fd6cd312f2 100644 (file)
@@ -181,10 +181,9 @@ bool MCExpr::EvaluateAsRelocatable(MCContext &Ctx, MCValue &Res) const {
 
   case SymbolRef: {
     const MCSymbol &Sym = cast<MCSymbolRefExpr>(this)->getSymbol();
-    if (const MCValue *Value = Ctx.GetSymbolValue(&Sym))
-      Res = *Value;
-    else
-      Res = MCValue::get(&Sym, 0, 0);
+    if (const MCExpr *Value = Ctx.GetSymbolValue(&Sym))
+      return Value->EvaluateAsRelocatable(Ctx, Res);
+    Res = MCValue::get(&Sym, 0, 0);
     return true;
   }