Home | History | Annotate | Download | only in MC
      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/MC/MCExpr.h"
     18 #include "llvm/MC/MCSymbol.h"
     19 #include "llvm/Support/DataTypes.h"
     20 #include <cassert>
     21 
     22 namespace llvm {
     23 class MCAsmInfo;
     24 class raw_ostream;
     25 
     26 /// \brief This represents an "assembler immediate".
     27 ///
     28 ///  In its most general form, this can hold ":Kind:(SymbolA - SymbolB +
     29 ///  imm64)".  Not all targets supports relocations of this general form, but we
     30 ///  need to represent this anyway.
     31 ///
     32 /// In general both SymbolA and SymbolB will also have a modifier
     33 /// analogous to the top-level Kind. Current targets are not expected
     34 /// to make use of both though. The choice comes down to whether
     35 /// relocation modifiers apply to the closest symbol or the whole
     36 /// expression.
     37 ///
     38 /// Note that this class must remain a simple POD value class, because we need
     39 /// it to live in unions etc.
     40 class MCValue {
     41   const MCSymbolRefExpr *SymA, *SymB;
     42   int64_t Cst;
     43   uint32_t RefKind;
     44 public:
     45 
     46   int64_t getConstant() const { return Cst; }
     47   const MCSymbolRefExpr *getSymA() const { return SymA; }
     48   const MCSymbolRefExpr *getSymB() const { return SymB; }
     49   uint32_t getRefKind() const { return RefKind; }
     50 
     51   /// \brief Is this an absolute (as opposed to relocatable) value.
     52   bool isAbsolute() const { return !SymA && !SymB; }
     53 
     54   /// \brief Print the value to the stream \p OS.
     55   void print(raw_ostream &OS) const;
     56 
     57   /// \brief Print the value to stderr.
     58   void dump() const;
     59 
     60   MCSymbolRefExpr::VariantKind getAccessVariant() const;
     61 
     62   static MCValue get(const MCSymbolRefExpr *SymA,
     63                      const MCSymbolRefExpr *SymB = nullptr,
     64                      int64_t Val = 0, uint32_t RefKind = 0) {
     65     MCValue R;
     66     R.Cst = Val;
     67     R.SymA = SymA;
     68     R.SymB = SymB;
     69     R.RefKind = RefKind;
     70     return R;
     71   }
     72 
     73   static MCValue get(int64_t Val) {
     74     MCValue R;
     75     R.Cst = Val;
     76     R.SymA = nullptr;
     77     R.SymB = nullptr;
     78     R.RefKind = 0;
     79     return R;
     80   }
     81 
     82 };
     83 
     84 } // end namespace llvm
     85 
     86 #endif
     87