MC: Switch MCContext value table to storing MCExprs.

llvm-svn: 84228
This commit is contained in:
Daniel Dunbar 2009-10-16 01:33:11 +00:00
parent 54b34ff68d
commit c5165c4258
3 changed files with 22 additions and 32 deletions

View 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) {
}
};

View 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;
}

View 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;
}