Home | History | Annotate | Download | only in MCTargetDesc
      1 //====- SparcMCExpr.h - Sparc specific MC expression classes --*- 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 describes Sparc-specific MCExprs, used for modifiers like
     11 // "%hi" or "%lo" etc.,
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H
     16 #define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H
     17 
     18 #include "SparcFixupKinds.h"
     19 #include "llvm/MC/MCExpr.h"
     20 
     21 namespace llvm {
     22 
     23 class StringRef;
     24 class SparcMCExpr : public MCTargetExpr {
     25 public:
     26   enum VariantKind {
     27     VK_Sparc_None,
     28     VK_Sparc_LO,
     29     VK_Sparc_HI,
     30     VK_Sparc_H44,
     31     VK_Sparc_M44,
     32     VK_Sparc_L44,
     33     VK_Sparc_HH,
     34     VK_Sparc_HM,
     35     VK_Sparc_PC22,
     36     VK_Sparc_PC10,
     37     VK_Sparc_GOT22,
     38     VK_Sparc_GOT10,
     39     VK_Sparc_GOT13,
     40     VK_Sparc_13,
     41     VK_Sparc_WPLT30,
     42     VK_Sparc_R_DISP32,
     43     VK_Sparc_TLS_GD_HI22,
     44     VK_Sparc_TLS_GD_LO10,
     45     VK_Sparc_TLS_GD_ADD,
     46     VK_Sparc_TLS_GD_CALL,
     47     VK_Sparc_TLS_LDM_HI22,
     48     VK_Sparc_TLS_LDM_LO10,
     49     VK_Sparc_TLS_LDM_ADD,
     50     VK_Sparc_TLS_LDM_CALL,
     51     VK_Sparc_TLS_LDO_HIX22,
     52     VK_Sparc_TLS_LDO_LOX10,
     53     VK_Sparc_TLS_LDO_ADD,
     54     VK_Sparc_TLS_IE_HI22,
     55     VK_Sparc_TLS_IE_LO10,
     56     VK_Sparc_TLS_IE_LD,
     57     VK_Sparc_TLS_IE_LDX,
     58     VK_Sparc_TLS_IE_ADD,
     59     VK_Sparc_TLS_LE_HIX22,
     60     VK_Sparc_TLS_LE_LOX10
     61   };
     62 
     63 private:
     64   const VariantKind Kind;
     65   const MCExpr *Expr;
     66 
     67   explicit SparcMCExpr(VariantKind Kind, const MCExpr *Expr)
     68       : Kind(Kind), Expr(Expr) {}
     69 
     70 public:
     71   /// @name Construction
     72   /// @{
     73 
     74   static const SparcMCExpr *create(VariantKind Kind, const MCExpr *Expr,
     75                                  MCContext &Ctx);
     76   /// @}
     77   /// @name Accessors
     78   /// @{
     79 
     80   /// getOpcode - Get the kind of this expression.
     81   VariantKind getKind() const { return Kind; }
     82 
     83   /// getSubExpr - Get the child of this expression.
     84   const MCExpr *getSubExpr() const { return Expr; }
     85 
     86   /// getFixupKind - Get the fixup kind of this expression.
     87   Sparc::Fixups getFixupKind() const { return getFixupKind(Kind); }
     88 
     89   /// @}
     90   void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
     91   bool evaluateAsRelocatableImpl(MCValue &Res,
     92                                  const MCAsmLayout *Layout,
     93                                  const MCFixup *Fixup) const override;
     94   void visitUsedExpr(MCStreamer &Streamer) const override;
     95   MCFragment *findAssociatedFragment() const override {
     96     return getSubExpr()->findAssociatedFragment();
     97   }
     98 
     99   void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
    100 
    101   static bool classof(const MCExpr *E) {
    102     return E->getKind() == MCExpr::Target;
    103   }
    104 
    105   static bool classof(const SparcMCExpr *) { return true; }
    106 
    107   static VariantKind parseVariantKind(StringRef name);
    108   static bool printVariantKind(raw_ostream &OS, VariantKind Kind);
    109   static Sparc::Fixups getFixupKind(VariantKind Kind);
    110 };
    111 
    112 } // end namespace llvm.
    113 
    114 #endif
    115