1 //===-- llvm/MC/MCValue.h - MCValue class -----------------------*- 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 MCValue class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_MC_MCVALUE_H 15 #define LLVM_MC_MCVALUE_H 16 17 #include "llvm/Support/DataTypes.h" 18 #include "llvm/MC/MCSymbol.h" 19 #include <cassert> 20 21 namespace llvm { 22 class MCAsmInfo; 23 class MCSymbol; 24 class MCSymbolRefExpr; 25 class raw_ostream; 26 27 /// MCValue - This represents an "assembler immediate". In its most general 28 /// form, this can hold "SymbolA - SymbolB + imm64". Not all targets supports 29 /// relocations of this general form, but we need to represent this anyway. 30 /// 31 /// In the general form, SymbolB can only be defined if SymbolA is, and both 32 /// must be in the same (non-external) section. The latter constraint is not 33 /// enforced, since a symbol's section may not be known at construction. 34 /// 35 /// Note that this class must remain a simple POD value class, because we need 36 /// it to live in unions etc. 37 class MCValue { 38 const MCSymbolRefExpr *SymA, *SymB; 39 int64_t Cst; 40 public: 41 getConstant()42 int64_t getConstant() const { return Cst; } getSymA()43 const MCSymbolRefExpr *getSymA() const { return SymA; } getSymB()44 const MCSymbolRefExpr *getSymB() const { return SymB; } 45 46 /// isAbsolute - Is this an absolute (as opposed to relocatable) value. isAbsolute()47 bool isAbsolute() const { return !SymA && !SymB; } 48 49 /// getAssociatedSection - For relocatable values, return the section the 50 /// value is associated with. 51 /// 52 /// @result - The value's associated section, or null for external or constant 53 /// values. 54 // 55 // FIXME: Switch to a tagged section, so this can return the tagged section 56 // value. 57 const MCSection *getAssociatedSection() const; 58 59 /// print - Print the value to the stream \arg OS. 60 void print(raw_ostream &OS, const MCAsmInfo *MAI) const; 61 62 /// dump - Print the value to stderr. 63 void dump() const; 64 65 static MCValue get(const MCSymbolRefExpr *SymA, const MCSymbolRefExpr *SymB=0, 66 int64_t Val = 0) { 67 MCValue R; 68 assert((!SymB || SymA) && "Invalid relocatable MCValue!"); 69 R.Cst = Val; 70 R.SymA = SymA; 71 R.SymB = SymB; 72 return R; 73 } 74 get(int64_t Val)75 static MCValue get(int64_t Val) { 76 MCValue R; 77 R.Cst = Val; 78 R.SymA = 0; 79 R.SymB = 0; 80 return R; 81 } 82 83 }; 84 85 } // end namespace llvm 86 87 #endif 88