MCSymbol.h revision daf97333697e1d243e531f4be648b1640d6a58bb
1//===- MCSymbol.h - Machine Code Symbols ------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains the declaration of the MCSymbol class. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_MC_MCSYMBOL_H 15#define LLVM_MC_MCSYMBOL_H 16 17#include "llvm/ADT/StringRef.h" 18 19namespace llvm { 20 class MCExpr; 21 class MCSection; 22 class MCContext; 23 class raw_ostream; 24 25 /// MCSymbol - Instances of this class represent a symbol name in the MC file, 26 /// and MCSymbols are created and unique'd by the MCContext class. MCSymbols 27 /// should only be constructed with valid names for the object file. 28 /// 29 /// If the symbol is defined/emitted into the current translation unit, the 30 /// Section member is set to indicate what section it lives in. Otherwise, if 31 /// it is a reference to an external entity, it has a null section. 32 class MCSymbol { 33 // Special sentinal value for the absolute pseudo section. 34 // 35 // FIXME: Use a PointerInt wrapper for this? 36 static const MCSection *AbsolutePseudoSection; 37 38 /// Name - The name of the symbol. The referred-to string data is actually 39 /// held by the StringMap that lives in MCContext. 40 StringRef Name; 41 42 /// Section - The section the symbol is defined in. This is null for 43 /// undefined symbols, and the special AbsolutePseudoSection value for 44 /// absolute symbols. 45 const MCSection *Section; 46 47 /// Value - If non-null, the value for a variable symbol. 48 const MCExpr *Value; 49 50 /// IsTemporary - True if this is an assembler temporary label, which 51 /// typically does not survive in the .o file's symbol table. Usually 52 /// "Lfoo" or ".foo". 53 unsigned IsTemporary : 1; 54 55 private: // MCContext creates and uniques these. 56 friend class MCContext; 57 MCSymbol(StringRef name, bool isTemporary) 58 : Name(name), Section(0), Value(0), IsTemporary(isTemporary) {} 59 60 MCSymbol(const MCSymbol&); // DO NOT IMPLEMENT 61 void operator=(const MCSymbol&); // DO NOT IMPLEMENT 62 public: 63 /// getName - Get the symbol name. 64 StringRef getName() const { return Name; } 65 66 /// @name Symbol Type 67 /// @{ 68 69 /// isTemporary - Check if this is an assembler temporary symbol. 70 bool isTemporary() const { 71 return IsTemporary; 72 } 73 74 /// @} 75 /// @name Associated Sections 76 /// @{ 77 78 /// isDefined - Check if this symbol is defined (i.e., it has an address). 79 /// 80 /// Defined symbols are either absolute or in some section. 81 bool isDefined() const { 82 return Section != 0; 83 } 84 85 /// isInSection - Check if this symbol is defined in some section (i.e., it 86 /// is defined but not absolute). 87 bool isInSection() const { 88 return isDefined() && !isAbsolute(); 89 } 90 91 /// isUndefined - Check if this symbol undefined (i.e., implicitly defined). 92 bool isUndefined() const { 93 return !isDefined(); 94 } 95 96 /// isAbsolute - Check if this is an absolute symbol. 97 bool isAbsolute() const { 98 return Section == AbsolutePseudoSection; 99 } 100 101 /// getSection - Get the section associated with a defined, non-absolute 102 /// symbol. 103 const MCSection &getSection() const { 104 assert(isInSection() && "Invalid accessor!"); 105 return *Section; 106 } 107 108 /// setSection - Mark the symbol as defined in the section \arg S. 109 void setSection(const MCSection &S) { Section = &S; } 110 111 /// setUndefined - Mark the symbol as undefined. 112 void setUndefined() { 113 Section = 0; 114 } 115 116 /// setAbsolute - Mark the symbol as absolute. 117 void setAbsolute() { Section = AbsolutePseudoSection; } 118 119 /// @} 120 /// @name Variable Symbols 121 /// @{ 122 123 /// isVariable - Check if this is a variable symbol. 124 bool isVariable() const { 125 return Value != 0; 126 } 127 128 /// getValue() - Get the value for variable symbols, or null if the symbol 129 /// is not a variable. 130 const MCExpr *getValue() const { return Value; } 131 132 void setValue(const MCExpr *Value) { 133 this->Value = Value; 134 } 135 136 /// @} 137 138 /// print - Print the value to the stream \arg OS. 139 void print(raw_ostream &OS) const; 140 141 /// dump - Print the value to stderr. 142 void dump() const; 143 }; 144 145 inline raw_ostream &operator<<(raw_ostream &OS, const MCSymbol &Sym) { 146 Sym.print(OS); 147 return OS; 148 } 149} // end namespace llvm 150 151#endif 152