diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index 955aa8b0838..d5c24043891 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -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 SymbolValues; + DenseMap 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) { } }; diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index f36564a6afa..db59f7f505c 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -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::iterator it = SymbolValues.find(Sym); - - if (it == SymbolValues.end()) - return 0; - - return &it->second; -} diff --git a/lib/MC/MCExpr.cpp b/lib/MC/MCExpr.cpp index 0f3e053de8e..4c92bbb0a50 100644 --- a/lib/MC/MCExpr.cpp +++ b/lib/MC/MCExpr.cpp @@ -181,10 +181,9 @@ bool MCExpr::EvaluateAsRelocatable(MCContext &Ctx, MCValue &Res) const { case SymbolRef: { const MCSymbol &Sym = cast(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; }