| //===-- PPCMCAsmInfo.h - PPC asm properties --------------------*- C++ -*--===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains the declarations of the PowerPC MCAsmInfo classes. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCASMINFO_H |
| #define LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCASMINFO_H |
| |
| #include "llvm/MC/MCAsmInfoELF.h" |
| #include "llvm/MC/MCAsmInfoXCOFF.h" |
| #include "llvm/MC/MCExpr.h" |
| #include "llvm/MC/MCValue.h" |
| |
| namespace llvm { |
| class Triple; |
| |
| class PPCELFMCAsmInfo : public MCAsmInfoELF { |
| void anchor() override; |
| |
| public: |
| explicit PPCELFMCAsmInfo(bool is64Bit, const Triple &); |
| void printSpecifierExpr(raw_ostream &OS, |
| const MCSpecifierExpr &Expr) const override; |
| bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, |
| const MCAssembler *Asm) const override; |
| }; |
| |
| class PPCXCOFFMCAsmInfo : public MCAsmInfoXCOFF { |
| public: |
| explicit PPCXCOFFMCAsmInfo(bool is64Bit, const Triple &); |
| void printSpecifierExpr(raw_ostream &OS, |
| const MCSpecifierExpr &Expr) const override; |
| bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, |
| const MCAssembler *Asm) const override; |
| }; |
| |
| namespace PPC { |
| enum Specifier { |
| S_None, |
| |
| S_LO, |
| S_HI, |
| S_HA, |
| S_HIGH, |
| S_HIGHA, |
| S_HIGHER, |
| S_HIGHERA, |
| S_HIGHEST, |
| S_HIGHESTA, |
| |
| S_AIX_TLSGD, // symbol@gd |
| S_AIX_TLSGDM, // symbol@m |
| S_AIX_TLSIE, // symbol@ie |
| S_AIX_TLSLD, // symbol@ld |
| S_AIX_TLSLE, // symbol@le |
| S_AIX_TLSML, // symbol@ml |
| S_DTPMOD, // symbol@dtpmod |
| S_DTPREL, // symbol@dprel |
| S_DTPREL_HA, // symbol@dtprel@ha |
| S_DTPREL_HI, // symbol@dtprel@h |
| S_DTPREL_HIGH, // symbol@dtprel@high |
| S_DTPREL_HIGHA, // symbol@dtprel@higha |
| S_DTPREL_HIGHER, // symbol@dtprel@higher |
| S_DTPREL_HIGHERA, // symbol@dtprel@highera |
| S_DTPREL_HIGHEST, // symbol@dtprel@highest |
| S_DTPREL_HIGHESTA, // symbol@dtprel@highesta |
| S_DTPREL_LO, // symbol@dtprel@l |
| S_GOT, // symbol@got |
| S_GOT_DTPREL, // symbol@got@dtprel |
| S_GOT_DTPREL_HA, // symbol@got@dtprel@ha |
| S_GOT_DTPREL_HI, // symbol@got@dtprel@h |
| S_GOT_DTPREL_LO, // symbol@got@dtprel@l |
| S_GOT_HA, // symbol@got@ha |
| S_GOT_HI, // symbol@got@h |
| S_GOT_LO, // symbol@got@l |
| S_GOT_PCREL, // symbol@got@pcrel |
| S_GOT_TLSGD, // symbol@got@tlsgd |
| S_GOT_TLSGD_HA, // symbol@got@tlsgd@ha |
| S_GOT_TLSGD_HI, // symbol@got@tlsgd@h |
| S_GOT_TLSGD_LO, // symbol@got@tlsgd@l |
| S_GOT_TLSGD_PCREL, // symbol@got@tlsgd@pcrel |
| S_GOT_TLSLD, // symbol@got@tlsld |
| S_GOT_TLSLD_HA, // symbol@got@tlsld@ha |
| S_GOT_TLSLD_HI, // symbol@got@tlsld@h |
| S_GOT_TLSLD_LO, // symbol@got@tlsld@l |
| S_GOT_TLSLD_PCREL, // symbol@got@tlsld@pcrel |
| S_GOT_TPREL, // symbol@got@tprel |
| S_GOT_TPREL_HA, // symbol@got@tprel@ha |
| S_GOT_TPREL_HI, // symbol@got@tprel@h |
| S_GOT_TPREL_LO, // symbol@got@tprel@l |
| S_GOT_TPREL_PCREL, // symbol@got@tprel@pcrel |
| S_L, // symbol@l |
| S_LOCAL, // symbol@local |
| S_NOTOC, // symbol@notoc |
| S_PCREL, |
| S_PCREL_OPT, // .reloc expr, R_PPC64_PCREL_OPT, expr |
| S_PLT, // symbol@plt |
| S_TLS, // symbol@tls |
| S_TLSGD, // symbol@tlsgd |
| S_TLSLD, // symbol@tlsld |
| S_TLS_PCREL, // symbol@tls@pcrel |
| S_TOC, // symbol@toc |
| S_TOCBASE, // symbol@tocbase |
| S_TOC_HA, // symbol@toc@ha |
| S_TOC_HI, // symbol@toc@h |
| S_TOC_LO, // symbol@toc@l |
| S_TPREL, // symbol@tprel |
| S_TPREL_HA, // symbol@tprel@ha |
| S_TPREL_HI, // symbol@tprel@h |
| S_TPREL_HIGH, // symbol@tprel@high |
| S_TPREL_HIGHA, // symbol@tprel@higha |
| S_TPREL_HIGHER, // symbol@tprel@higher |
| S_TPREL_HIGHERA, // symbol@tprel@highera |
| S_TPREL_HIGHEST, // symbol@tprel@highest |
| S_TPREL_HIGHESTA, // symbol@tprel@highesta |
| S_TPREL_LO, // symbol@tprel@l |
| S_U, // symbol@u |
| }; |
| |
| bool evaluateAsConstant(const MCSpecifierExpr &Expr, int64_t &Res); |
| } |
| |
| namespace PPCMCExpr { |
| using Specifier = uint16_t; |
| } |
| |
| static inline uint16_t getSpecifier(const MCSymbolRefExpr *SRE) { |
| return SRE->getKind(); |
| } |
| } // namespace llvm |
| |
| #endif |