MC: Move assembler variable values from MCContext to MCSymbol.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84229 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2009-10-16 01:33:57 +00:00
parent e579849652
commit 7c3600de94
3 changed files with 33 additions and 32 deletions

View File

@ -33,11 +33,6 @@ namespace llvm {
/// Symbols - Bindings of names to symbols.
StringMap<MCSymbol*> Symbols;
/// SymbolValues - Bindings of symbols to values.
//
// FIXME: Is there a good reason to not just put this in the MCSymbol?
DenseMap<const MCSymbol*, const MCExpr*> 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) {

View File

@ -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".
@ -53,7 +57,7 @@ namespace llvm {
private: // MCContext creates and uniques these.
friend class MCContext;
MCSymbol(const StringRef &_Name, bool _IsTemporary)
: Name(_Name), Section(0), IsTemporary(_IsTemporary) {}
: Name(_Name), Section(0), Value(0), IsTemporary(_IsTemporary) {}
MCSymbol(const MCSymbol&); // DO NOT IMPLEMENT
void operator=(const MCSymbol&); // DO NOT IMPLEMENT
@ -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.

View File

@ -181,8 +181,11 @@ bool MCExpr::EvaluateAsRelocatable(MCContext &Ctx, MCValue &Res) const {
case SymbolRef: {
const MCSymbol &Sym = cast<MCSymbolRefExpr>(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;
}