Fix a [-Werror,-Winconsistent-missing-override] problem in the
[oota-llvm.git] / lib / Target / NVPTX / NVPTXMCExpr.h
1 //===-- NVPTXMCExpr.h - NVPTX 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 // Modeled after ARMMCExpr
11
12 #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXMCEXPR_H
13 #define LLVM_LIB_TARGET_NVPTX_NVPTXMCEXPR_H
14
15 #include "llvm/ADT/APFloat.h"
16 #include "llvm/MC/MCExpr.h"
17
18 namespace llvm {
19
20 class NVPTXFloatMCExpr : public MCTargetExpr {
21 public:
22   enum VariantKind {
23     VK_NVPTX_None,
24     VK_NVPTX_SINGLE_PREC_FLOAT,   // FP constant in single-precision
25     VK_NVPTX_DOUBLE_PREC_FLOAT    // FP constant in double-precision
26   };
27
28 private:
29   const VariantKind Kind;
30   const APFloat Flt;
31
32   explicit NVPTXFloatMCExpr(VariantKind Kind, APFloat Flt)
33       : Kind(Kind), Flt(Flt) {}
34
35 public:
36   /// @name Construction
37   /// @{
38
39   static const NVPTXFloatMCExpr *Create(VariantKind Kind, APFloat Flt,
40                                         MCContext &Ctx);
41
42   static const NVPTXFloatMCExpr *CreateConstantFPSingle(APFloat Flt,
43                                                         MCContext &Ctx) {
44     return Create(VK_NVPTX_SINGLE_PREC_FLOAT, Flt, Ctx);
45   }
46
47   static const NVPTXFloatMCExpr *CreateConstantFPDouble(APFloat Flt,
48                                                         MCContext &Ctx) {
49     return Create(VK_NVPTX_DOUBLE_PREC_FLOAT, Flt, Ctx);
50   }
51
52   /// @}
53   /// @name Accessors
54   /// @{
55
56   /// getOpcode - Get the kind of this expression.
57   VariantKind getKind() const { return Kind; }
58
59   /// getSubExpr - Get the child of this expression.
60   APFloat getAPFloat() const { return Flt; }
61
62 /// @}
63
64   void PrintImpl(raw_ostream &OS) const override;
65   bool EvaluateAsRelocatableImpl(MCValue &Res,
66                                  const MCAsmLayout *Layout,
67                                  const MCFixup *Fixup) const override {
68     return false;
69   }
70   void visitUsedExpr(MCStreamer &Streamer) const override {};
71   const MCSection *FindAssociatedSection() const override {
72     return nullptr;
73   }
74
75   // There are no TLS NVPTXMCExprs at the moment.
76   void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {}
77
78   static bool classof(const MCExpr *E) {
79     return E->getKind() == MCExpr::Target;
80   }
81 };
82
83 /// A wrapper for MCSymbolRefExpr that tells the assembly printer that the
84 /// symbol should be enclosed by generic().
85 class NVPTXGenericMCSymbolRefExpr : public MCTargetExpr {
86 private:
87   const MCSymbolRefExpr *SymExpr;
88
89   explicit NVPTXGenericMCSymbolRefExpr(const MCSymbolRefExpr *_SymExpr)
90       : SymExpr(_SymExpr) {}
91
92 public:
93   /// @name Construction
94   /// @{
95
96   static const NVPTXGenericMCSymbolRefExpr
97   *Create(const MCSymbolRefExpr *SymExpr, MCContext &Ctx);
98
99   /// @}
100   /// @name Accessors
101   /// @{
102
103   /// getOpcode - Get the kind of this expression.
104   const MCSymbolRefExpr *getSymbolExpr() const { return SymExpr; }
105
106   /// @}
107
108   void PrintImpl(raw_ostream &OS) const override;
109   bool EvaluateAsRelocatableImpl(MCValue &Res,
110                                  const MCAsmLayout *Layout,
111                                  const MCFixup *Fixup) const override {
112     return false;
113   }
114   void visitUsedExpr(MCStreamer &Streamer) const override {};
115   const MCSection *FindAssociatedSection() const override {
116     return nullptr;
117   }
118
119   // There are no TLS NVPTXMCExprs at the moment.
120   void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {}
121
122   static bool classof(const MCExpr *E) {
123     return E->getKind() == MCExpr::Target;
124   }
125   };
126 } // end namespace llvm
127
128 #endif