aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-10-16 01:33:11 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-10-16 01:33:11 +0000
commite579849652f2ba062e6c91a3af4d9a3843411b44 (patch)
tree47c1f916722dbb2cd73459c9563f3cfab15dceef
parenta846a8a1dcb8ab28e75e364c0cf0272634d023f2 (diff)
downloadexternal_llvm-e579849652f2ba062e6c91a3af4d9a3843411b44.zip
external_llvm-e579849652f2ba062e6c91a3af4d9a3843411b44.tar.gz
external_llvm-e579849652f2ba062e6c91a3af4d9a3843411b44.tar.bz2
MC: Switch MCContext value table to storing MCExprs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84228 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/MC/MCContext.h30
-rw-r--r--lib/MC/MCContext.cpp17
-rw-r--r--lib/MC/MCExpr.cpp7
3 files changed, 22 insertions, 32 deletions
diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h
index 955aa8b..d5c2404 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<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) {
}
};
diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp
index f36564a..db59f7f 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<const MCSymbol*, MCValue>::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 0f3e053..4c92bbb 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<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;
}