mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
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:
parent
e579849652
commit
7c3600de94
@ -33,11 +33,6 @@ namespace llvm {
|
|||||||
/// Symbols - Bindings of names to symbols.
|
/// Symbols - Bindings of names to symbols.
|
||||||
StringMap<MCSymbol*> 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.
|
/// Allocator - Allocator object used for creating machine code objects.
|
||||||
///
|
///
|
||||||
/// We use a bump pointer allocator to avoid the need to track all allocated
|
/// 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.
|
/// LookupSymbol - Get the symbol for @param Name, or null.
|
||||||
MCSymbol *LookupSymbol(const StringRef &Name) const;
|
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) {
|
void *Allocate(unsigned Size, unsigned Align = 8) {
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
class MCAsmInfo;
|
class MCAsmInfo;
|
||||||
|
class MCExpr;
|
||||||
class MCSection;
|
class MCSection;
|
||||||
class MCContext;
|
class MCContext;
|
||||||
class raw_ostream;
|
class raw_ostream;
|
||||||
@ -45,6 +46,9 @@ namespace llvm {
|
|||||||
/// absolute symbols.
|
/// absolute symbols.
|
||||||
const MCSection *Section;
|
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
|
/// IsTemporary - True if this is an assembler temporary label, which
|
||||||
/// typically does not survive in the .o file's symbol table. Usually
|
/// typically does not survive in the .o file's symbol table. Usually
|
||||||
/// "Lfoo" or ".foo".
|
/// "Lfoo" or ".foo".
|
||||||
@ -53,7 +57,7 @@ namespace llvm {
|
|||||||
private: // MCContext creates and uniques these.
|
private: // MCContext creates and uniques these.
|
||||||
friend class MCContext;
|
friend class MCContext;
|
||||||
MCSymbol(const StringRef &_Name, bool _IsTemporary)
|
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
|
MCSymbol(const MCSymbol&); // DO NOT IMPLEMENT
|
||||||
void operator=(const MCSymbol&); // DO NOT IMPLEMENT
|
void operator=(const MCSymbol&); // DO NOT IMPLEMENT
|
||||||
@ -69,6 +73,10 @@ namespace llvm {
|
|||||||
return IsTemporary;
|
return IsTemporary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
/// @name Associated Sections
|
||||||
|
/// @{
|
||||||
|
|
||||||
/// isDefined - Check if this symbol is defined (i.e., it has an address).
|
/// isDefined - Check if this symbol is defined (i.e., it has an address).
|
||||||
///
|
///
|
||||||
/// Defined symbols are either absolute or in some section.
|
/// Defined symbols are either absolute or in some section.
|
||||||
@ -104,6 +112,23 @@ namespace llvm {
|
|||||||
/// setAbsolute - Mark the symbol as absolute.
|
/// setAbsolute - Mark the symbol as absolute.
|
||||||
void setAbsolute() { Section = AbsolutePseudoSection; }
|
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.
|
/// print - Print the value to the stream \arg OS.
|
||||||
|
@ -181,8 +181,11 @@ bool MCExpr::EvaluateAsRelocatable(MCContext &Ctx, MCValue &Res) const {
|
|||||||
|
|
||||||
case SymbolRef: {
|
case SymbolRef: {
|
||||||
const MCSymbol &Sym = cast<MCSymbolRefExpr>(this)->getSymbol();
|
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);
|
Res = MCValue::get(&Sym, 0, 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user