MCSymbol.h revision db9835d0895337eb94c19e3a30b7d3fc8fcddfd5
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 /// IsUsed - True if this symbol has been used. 56 mutable unsigned IsUsed : 1; 57 58 private: // MCContext creates and uniques these. 59 friend class MCContext; 60 MCSymbol(StringRef name, bool isTemporary) 61 : Name(name), Section(0), Value(0), 62 IsTemporary(isTemporary), IsUsed(false) {} 63 64 MCSymbol(const MCSymbol&); // DO NOT IMPLEMENT 65 void operator=(const MCSymbol&); // DO NOT IMPLEMENT 66 public: 67 /// getName - Get the symbol name. 68 StringRef getName() const { return Name; } 69 70 /// @name Accessors 71 /// @{ 72 73 /// isTemporary - Check if this is an assembler temporary symbol. 74 bool isTemporary() const { return IsTemporary; } 75 76 /// isUsed - Check if this is used. 77 bool isUsed() const { return IsUsed; } 78 void setUsed(bool Value) const { IsUsed = Value; } 79 80 /// @} 81 /// @name Associated Sections 82 /// @{ 83 84 /// isDefined - Check if this symbol is defined (i.e., it has an address). 85 /// 86 /// Defined symbols are either absolute or in some section. 87 bool isDefined() const { 88 return Section != 0; 89 } 90 91 /// isInSection - Check if this symbol is defined in some section (i.e., it 92 /// is defined but not absolute). 93 bool isInSection() const { 94 return isDefined() && !isAbsolute(); 95 } 96 97 /// isUndefined - Check if this symbol undefined (i.e., implicitly defined). 98 bool isUndefined() const { 99 return !isDefined(); 100 } 101 102 /// isAbsolute - Check if this is an absolute symbol. 103 bool isAbsolute() const { 104 return Section == AbsolutePseudoSection; 105 } 106 107 /// getSection - Get the section associated with a defined, non-absolute 108 /// symbol. 109 const MCSection &getSection() const { 110 assert(isInSection() && "Invalid accessor!"); 111 return *Section; 112 } 113 114 /// setSection - Mark the symbol as defined in the section \arg S. 115 void setSection(const MCSection &S) { Section = &S; } 116 117 /// setUndefined - Mark the symbol as undefined. 118 void setUndefined() { 119 Section = 0; 120 } 121 122 /// setAbsolute - Mark the symbol as absolute. 123 void setAbsolute() { Section = AbsolutePseudoSection; } 124 125 /// @} 126 /// @name Variable Symbols 127 /// @{ 128 129 /// isVariable - Check if this is a variable symbol. 130 bool isVariable() const { 131 return Value != 0; 132 } 133 134 /// getValue() - Get the value for variable symbols. 135 const MCExpr *getVariableValue() const { 136 assert(isVariable() && "Invalid accessor!"); 137 IsUsed = true; 138 return Value; 139 } 140 141 void setVariableValue(const MCExpr *Value); 142 143 /// @} 144 145 /// print - Print the value to the stream \arg OS. 146 void print(raw_ostream &OS) const; 147 148 /// dump - Print the value to stderr. 149 void dump() const; 150 }; 151 152 inline raw_ostream &operator<<(raw_ostream &OS, const MCSymbol &Sym) { 153 Sym.print(OS); 154 return OS; 155 } 156} // end namespace llvm 157 158#endif 159