Home | History | Annotate | Download | only in MCTargetDesc
      1 //===-- PPCMCExpr.h - PPC 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 #ifndef PPCMCEXPR_H
     11 #define PPCMCEXPR_H
     12 
     13 #include "llvm/MC/MCAsmLayout.h"
     14 #include "llvm/MC/MCExpr.h"
     15 #include "llvm/MC/MCValue.h"
     16 
     17 namespace llvm {
     18 
     19 class PPCMCExpr : public MCTargetExpr {
     20 public:
     21   enum VariantKind {
     22     VK_PPC_None,
     23     VK_PPC_LO,
     24     VK_PPC_HI,
     25     VK_PPC_HA,
     26     VK_PPC_HIGHER,
     27     VK_PPC_HIGHERA,
     28     VK_PPC_HIGHEST,
     29     VK_PPC_HIGHESTA
     30   };
     31 
     32 private:
     33   const VariantKind Kind;
     34   const MCExpr *Expr;
     35   bool IsDarwin;
     36 
     37   explicit PPCMCExpr(VariantKind _Kind, const MCExpr *_Expr,
     38                      bool _IsDarwin)
     39     : Kind(_Kind), Expr(_Expr), IsDarwin(_IsDarwin) {}
     40 
     41 public:
     42   /// @name Construction
     43   /// @{
     44 
     45   static const PPCMCExpr *Create(VariantKind Kind, const MCExpr *Expr,
     46                                  bool isDarwin, MCContext &Ctx);
     47 
     48   static const PPCMCExpr *CreateLo(const MCExpr *Expr,
     49                                    bool isDarwin, MCContext &Ctx) {
     50     return Create(VK_PPC_LO, Expr, isDarwin, Ctx);
     51   }
     52 
     53   static const PPCMCExpr *CreateHi(const MCExpr *Expr,
     54                                    bool isDarwin, MCContext &Ctx) {
     55     return Create(VK_PPC_HI, Expr, isDarwin, Ctx);
     56   }
     57 
     58   static const PPCMCExpr *CreateHa(const MCExpr *Expr,
     59                                    bool isDarwin, MCContext &Ctx) {
     60     return Create(VK_PPC_HA, Expr, isDarwin, Ctx);
     61   }
     62 
     63   /// @}
     64   /// @name Accessors
     65   /// @{
     66 
     67   /// getOpcode - Get the kind of this expression.
     68   VariantKind getKind() const { return Kind; }
     69 
     70   /// getSubExpr - Get the child of this expression.
     71   const MCExpr *getSubExpr() const { return Expr; }
     72 
     73   /// isDarwinSyntax - True if expression is to be printed using Darwin syntax.
     74   bool isDarwinSyntax() const { return IsDarwin; }
     75 
     76 
     77   /// @}
     78 
     79   void PrintImpl(raw_ostream &OS) const override;
     80   bool EvaluateAsRelocatableImpl(MCValue &Res,
     81                                  const MCAsmLayout *Layout) const override;
     82   void visitUsedExpr(MCStreamer &Streamer) const override;
     83   const MCSection *FindAssociatedSection() const override {
     84     return getSubExpr()->FindAssociatedSection();
     85   }
     86 
     87   // There are no TLS PPCMCExprs at the moment.
     88   void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {}
     89 
     90   static bool classof(const MCExpr *E) {
     91     return E->getKind() == MCExpr::Target;
     92   }
     93 };
     94 } // end namespace llvm
     95 
     96 #endif
     97