diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index d5c24043891..e577ef53d13 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -33,11 +33,6 @@ namespace llvm { /// Symbols - Bindings of names to symbols. StringMap Symbols; - /// SymbolValues - Bindings of symbols to values. - // - // FIXME: Is there a good reason to not just put this in the MCSymbol? - DenseMap SymbolValues; - /// Allocator - Allocator object used for creating machine code objects. /// /// We use a bump pointer allocator to avoid the need to track all allocated @@ -75,28 +70,6 @@ namespace llvm { /// LookupSymbol - Get the symbol for @param Name, or null. MCSymbol *LookupSymbol(const StringRef &Name) const; - /// @} - /// @name Symbol Value Table - /// @{ - - /// ClearSymbolValue - Erase the variable binding for @arg Symbol, if one - /// exists. - void ClearSymbolValue(const MCSymbol *Symbol) { - SymbolValues.erase(Symbol); - } - - /// 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 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) { diff --git a/include/llvm/MC/MCSymbol.h b/include/llvm/MC/MCSymbol.h index 5dd7d68585c..d08f0e5f8ed 100644 --- a/include/llvm/MC/MCSymbol.h +++ b/include/llvm/MC/MCSymbol.h @@ -20,6 +20,7 @@ namespace llvm { class MCAsmInfo; + class MCExpr; class MCSection; class MCContext; class raw_ostream; @@ -45,6 +46,9 @@ namespace llvm { /// absolute symbols. const MCSection *Section; + /// Value - If non-null, the value for a variable symbol. + const MCExpr *Value; + /// IsTemporary - True if this is an assembler temporary label, which /// typically does not survive in the .o file's symbol table. Usually /// "Lfoo" or ".foo". @@ -52,9 +56,9 @@ namespace llvm { private: // MCContext creates and uniques these. friend class MCContext; - MCSymbol(const StringRef &_Name, bool _IsTemporary) - : Name(_Name), Section(0), IsTemporary(_IsTemporary) {} - + MCSymbol(const StringRef &_Name, bool _IsTemporary) + : Name(_Name), Section(0), Value(0), IsTemporary(_IsTemporary) {} + MCSymbol(const MCSymbol&); // DO NOT IMPLEMENT void operator=(const MCSymbol&); // DO NOT IMPLEMENT public: @@ -69,6 +73,10 @@ namespace llvm { return IsTemporary; } + /// @} + /// @name Associated Sections + /// @{ + /// isDefined - Check if this symbol is defined (i.e., it has an address). /// /// Defined symbols are either absolute or in some section. @@ -104,6 +112,23 @@ namespace llvm { /// setAbsolute - Mark the symbol as absolute. void setAbsolute() { Section = AbsolutePseudoSection; } + /// @} + /// @name Variable Symbols + /// @{ + + /// isVariable - Check if this is a variable symbol. + bool isVariable() const { + return Value != 0; + } + + /// getValue() - Get the value for variable symbols, or null if the symbol + /// is not a variable. + const MCExpr *getValue() const { return Value; } + + void setValue(const MCExpr *Value) { + this->Value = Value; + } + /// @} /// print - Print the value to the stream \arg OS. diff --git a/lib/MC/MCExpr.cpp b/lib/MC/MCExpr.cpp index 4c92bbb0a50..d6e545fa78c 100644 --- a/lib/MC/MCExpr.cpp +++ b/lib/MC/MCExpr.cpp @@ -181,8 +181,11 @@ bool MCExpr::EvaluateAsRelocatable(MCContext &Ctx, MCValue &Res) const { case SymbolRef: { const MCSymbol &Sym = cast(this)->getSymbol(); - if (const MCExpr *Value = Ctx.GetSymbolValue(&Sym)) - return Value->EvaluateAsRelocatable(Ctx, Res); + + // Evaluate recursively if this is a variable. + if (Sym.isVariable()) + return Sym.getValue()->EvaluateAsRelocatable(Ctx, Res); + Res = MCValue::get(&Sym, 0, 0); return true; }