diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-08-22 07:22:36 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-08-22 07:22:36 +0000 |
commit | 1c2ee9fae0b962831b69f9d567469bfbebc1bbf6 (patch) | |
tree | 9cd4a02e407a6ac0751c459bb5327f1f6f3cc07e /include | |
parent | 65d16d94c9ba5433456c7764c091ef0a63a88500 (diff) | |
download | external_llvm-1c2ee9fae0b962831b69f9d567469bfbebc1bbf6.zip external_llvm-1c2ee9fae0b962831b69f9d567469bfbebc1bbf6.tar.gz external_llvm-1c2ee9fae0b962831b69f9d567469bfbebc1bbf6.tar.bz2 |
llvm-mc: Clean up some handling of symbol/section association to be more correct
(external was really undefined and there wasn't an explicit representation for
absolute symbols).
- This still needs some cleanup to how the absolute "pseudo" section is dealt
with, but I haven't figured out the nicest approach yet.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79733 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/MC/MCSymbol.h | 59 | ||||
-rw-r--r-- | include/llvm/MC/MCValue.h | 7 |
2 files changed, 49 insertions, 17 deletions
diff --git a/include/llvm/MC/MCSymbol.h b/include/llvm/MC/MCSymbol.h index a5176bc..2b570a7 100644 --- a/include/llvm/MC/MCSymbol.h +++ b/include/llvm/MC/MCSymbol.h @@ -16,6 +16,7 @@ #include <string> #include "llvm/ADT/StringRef.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class MCSection; @@ -30,38 +31,68 @@ namespace llvm { /// it is a reference to an external entity, it has a null section. /// class MCSymbol { + // Special sentinal value for the absolute pseudo section. + // + // FIXME: Use a PointerInt wrapper for this? + static const MCSection *AbsolutePseudoSection; + /// Name - The name of the symbol. std::string Name; - /// Section - The section the symbol is defined in, or null if the symbol - /// has not been defined in the associated translation unit. + + /// Section - The section the symbol is defined in. This is null for + /// undefined symbols, and the special AbsolutePseudoSection value for + /// absolute symbols. const MCSection *Section; /// 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". unsigned IsTemporary : 1; - - /// IsExternal - True if this symbol has been implicitly defined as an - /// external, for example by using it in an expression without ever emitting - /// it as a label. The @var Section for an external symbol is always null. - unsigned IsExternal : 1; private: // MCContext creates and uniques these. friend class MCContext; MCSymbol(const StringRef &_Name, bool _IsTemporary) - : Name(_Name), Section(0), IsTemporary(_IsTemporary), IsExternal(false) {} + : Name(_Name), Section(0), + IsTemporary(_IsTemporary) {} MCSymbol(const MCSymbol&); // DO NOT IMPLEMENT void operator=(const MCSymbol&); // DO NOT IMPLEMENT public: - - const MCSection *getSection() const { return Section; } - void setSection(const MCSection *S) { Section = S; } + /// getName - Get the symbol name. + const std::string &getName() const { return Name; } - bool isExternal() const { return IsExternal; } - void setExternal(bool Value) { IsExternal = Value; } + /// @name Symbol Location Functions + /// @{ - const std::string &getName() const { return Name; } + /// isUndefined - Check if this symbol undefined (i.e., implicitly defined). + bool isUndefined() const { + return Section == 0; + } + + /// isAbsolute - Check if this this is an absolute symbol. + bool isAbsolute() const { + return Section == AbsolutePseudoSection; + } + + /// getSection - Get the section associated with a defined, non-absolute + /// symbol. + const MCSection &getSection() const { + assert(!isUndefined() && !isAbsolute() && "Invalid accessor!"); + return *Section; + } + + /// setSection - Mark the symbol as defined in the section \arg S. + void setSection(const MCSection &S) { Section = &S; } + + /// setUndefined - Mark the symbol as undefined. + void setUndefined() { + Section = 0; + } + + /// setAbsolute - Mark the symbol as absolute. + void setAbsolute() { Section = AbsolutePseudoSection; } + + /// @} /// print - Print the value to the stream \arg OS. void print(raw_ostream &OS) const; diff --git a/include/llvm/MC/MCValue.h b/include/llvm/MC/MCValue.h index ec323fe..af56eed 100644 --- a/include/llvm/MC/MCValue.h +++ b/include/llvm/MC/MCValue.h @@ -49,9 +49,10 @@ public: /// /// @result - The value's associated section, or null for external or constant /// values. - const MCSection *getAssociatedSection() const { - return SymA ? SymA->getSection() : 0; - } + // + // FIXME: Switch to a tagged section, so this can return the tagged section + // value. + const MCSection *getAssociatedSection() const; /// print - Print the value to the stream \arg OS. void print(raw_ostream &OS) const; |