| 1 | //===-- PPCMCAsmInfo.h - PPC asm properties --------------------*- C++ -*--===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file contains the declarations of the PowerPC MCAsmInfo classes. |
| 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
| 13 | #ifndef LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCASMINFO_H |
| 14 | #define LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCASMINFO_H |
| 15 | |
| 16 | #include "llvm/MC/MCAsmInfoELF.h" |
| 17 | #include "llvm/MC/MCAsmInfoXCOFF.h" |
| 18 | #include "llvm/MC/MCExpr.h" |
| 19 | #include "llvm/MC/MCValue.h" |
| 20 | |
| 21 | namespace llvm { |
| 22 | class Triple; |
| 23 | |
| 24 | class PPCELFMCAsmInfo : public MCAsmInfoELF { |
| 25 | void anchor() override; |
| 26 | |
| 27 | public: |
| 28 | explicit PPCELFMCAsmInfo(bool is64Bit, const Triple &); |
| 29 | void printSpecifierExpr(raw_ostream &OS, |
| 30 | const MCSpecifierExpr &Expr) const override; |
| 31 | bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, |
| 32 | const MCAssembler *Asm) const override; |
| 33 | }; |
| 34 | |
| 35 | class PPCXCOFFMCAsmInfo : public MCAsmInfoXCOFF { |
| 36 | void anchor() override; |
| 37 | |
| 38 | public: |
| 39 | explicit PPCXCOFFMCAsmInfo(bool is64Bit, const Triple &); |
| 40 | void printSpecifierExpr(raw_ostream &OS, |
| 41 | const MCSpecifierExpr &Expr) const override; |
| 42 | bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, |
| 43 | const MCAssembler *Asm) const override; |
| 44 | }; |
| 45 | |
| 46 | namespace PPC { |
| 47 | enum Specifier { |
| 48 | S_None, |
| 49 | |
| 50 | S_LO, |
| 51 | S_HI, |
| 52 | S_HA, |
| 53 | S_HIGH, |
| 54 | S_HIGHA, |
| 55 | S_HIGHER, |
| 56 | S_HIGHERA, |
| 57 | S_HIGHEST, |
| 58 | S_HIGHESTA, |
| 59 | |
| 60 | S_AIX_TLSGD, // symbol@gd |
| 61 | S_AIX_TLSGDM, // symbol@m |
| 62 | S_AIX_TLSIE, // symbol@ie |
| 63 | S_AIX_TLSLD, // symbol@ld |
| 64 | S_AIX_TLSLE, // symbol@le |
| 65 | S_AIX_TLSML, // symbol@ml |
| 66 | S_DTPMOD, // symbol@dtpmod |
| 67 | S_DTPREL, // symbol@dprel |
| 68 | S_DTPREL_HA, // symbol@dtprel@ha |
| 69 | S_DTPREL_HI, // symbol@dtprel@h |
| 70 | S_DTPREL_HIGH, // symbol@dtprel@high |
| 71 | S_DTPREL_HIGHA, // symbol@dtprel@higha |
| 72 | S_DTPREL_HIGHER, // symbol@dtprel@higher |
| 73 | S_DTPREL_HIGHERA, // symbol@dtprel@highera |
| 74 | S_DTPREL_HIGHEST, // symbol@dtprel@highest |
| 75 | S_DTPREL_HIGHESTA, // symbol@dtprel@highesta |
| 76 | S_DTPREL_LO, // symbol@dtprel@l |
| 77 | S_GOT, // symbol@got |
| 78 | S_GOT_DTPREL, // symbol@got@dtprel |
| 79 | S_GOT_DTPREL_HA, // symbol@got@dtprel@ha |
| 80 | S_GOT_DTPREL_HI, // symbol@got@dtprel@h |
| 81 | S_GOT_DTPREL_LO, // symbol@got@dtprel@l |
| 82 | S_GOT_HA, // symbol@got@ha |
| 83 | S_GOT_HI, // symbol@got@h |
| 84 | S_GOT_LO, // symbol@got@l |
| 85 | S_GOT_PCREL, // symbol@got@pcrel |
| 86 | S_GOT_TLSGD, // symbol@got@tlsgd |
| 87 | S_GOT_TLSGD_HA, // symbol@got@tlsgd@ha |
| 88 | S_GOT_TLSGD_HI, // symbol@got@tlsgd@h |
| 89 | S_GOT_TLSGD_LO, // symbol@got@tlsgd@l |
| 90 | S_GOT_TLSGD_PCREL, // symbol@got@tlsgd@pcrel |
| 91 | S_GOT_TLSLD, // symbol@got@tlsld |
| 92 | S_GOT_TLSLD_HA, // symbol@got@tlsld@ha |
| 93 | S_GOT_TLSLD_HI, // symbol@got@tlsld@h |
| 94 | S_GOT_TLSLD_LO, // symbol@got@tlsld@l |
| 95 | S_GOT_TLSLD_PCREL, // symbol@got@tlsld@pcrel |
| 96 | S_GOT_TPREL, // symbol@got@tprel |
| 97 | S_GOT_TPREL_HA, // symbol@got@tprel@ha |
| 98 | S_GOT_TPREL_HI, // symbol@got@tprel@h |
| 99 | S_GOT_TPREL_LO, // symbol@got@tprel@l |
| 100 | S_GOT_TPREL_PCREL, // symbol@got@tprel@pcrel |
| 101 | S_L, // symbol@l |
| 102 | S_LOCAL, // symbol@local |
| 103 | S_NOTOC, // symbol@notoc |
| 104 | S_PCREL, |
| 105 | S_PCREL_OPT, // .reloc expr, R_PPC64_PCREL_OPT, expr |
| 106 | S_PLT, // symbol@plt |
| 107 | S_TLS, // symbol@tls |
| 108 | S_TLSGD, // symbol@tlsgd |
| 109 | S_TLSLD, // symbol@tlsld |
| 110 | S_TLS_PCREL, // symbol@tls@pcrel |
| 111 | S_TOC, // symbol@toc |
| 112 | S_TOCBASE, // symbol@tocbase |
| 113 | S_TOC_HA, // symbol@toc@ha |
| 114 | S_TOC_HI, // symbol@toc@h |
| 115 | S_TOC_LO, // symbol@toc@l |
| 116 | S_TPREL, // symbol@tprel |
| 117 | S_TPREL_HA, // symbol@tprel@ha |
| 118 | S_TPREL_HI, // symbol@tprel@h |
| 119 | S_TPREL_HIGH, // symbol@tprel@high |
| 120 | S_TPREL_HIGHA, // symbol@tprel@higha |
| 121 | S_TPREL_HIGHER, // symbol@tprel@higher |
| 122 | S_TPREL_HIGHERA, // symbol@tprel@highera |
| 123 | S_TPREL_HIGHEST, // symbol@tprel@highest |
| 124 | S_TPREL_HIGHESTA, // symbol@tprel@highesta |
| 125 | S_TPREL_LO, // symbol@tprel@l |
| 126 | S_U, // symbol@u |
| 127 | }; |
| 128 | |
| 129 | bool evaluateAsConstant(const MCSpecifierExpr &Expr, int64_t &Res); |
| 130 | } |
| 131 | |
| 132 | namespace PPCMCExpr { |
| 133 | using Specifier = uint16_t; |
| 134 | } |
| 135 | |
| 136 | static inline uint16_t getSpecifier(const MCSymbolRefExpr *SRE) { |
| 137 | return SRE->getKind(); |
| 138 | } |
| 139 | } // namespace llvm |
| 140 | |
| 141 | #endif |
| 142 | |