//===-- ARMMCAsmInfo.h - ARM 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 declaration of the ARMMCAsmInfo class. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCASMINFO_H #define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCASMINFO_H #include "llvm/MC/MCAsmInfoCOFF.h" #include "llvm/MC/MCAsmInfoDarwin.h" #include "llvm/MC/MCAsmInfoELF.h" #include "llvm/MC/MCExpr.h" namespace llvm { class Triple; namespace ARM { void printSpecifierExpr(const MCAsmInfo &MAI, raw_ostream &OS, const MCSpecifierExpr &Expr); } class ARMMCAsmInfoDarwin : public MCAsmInfoDarwin { virtual void anchor(); public: explicit ARMMCAsmInfoDarwin(const Triple &TheTriple); void printSpecifierExpr(raw_ostream &OS, const MCSpecifierExpr &Expr) const override { ARM::printSpecifierExpr(*this, OS, Expr); } bool evaluateAsRelocatableImpl(const MCSpecifierExpr &, MCValue &, const MCAssembler *) const override { return false; } }; class ARMELFMCAsmInfo : public MCAsmInfoELF { void anchor() override; public: explicit ARMELFMCAsmInfo(const Triple &TT); void setUseIntegratedAssembler(bool Value) override; void printSpecifierExpr(raw_ostream &OS, const MCSpecifierExpr &Expr) const override { ARM::printSpecifierExpr(*this, OS, Expr); } bool evaluateAsRelocatableImpl(const MCSpecifierExpr &, MCValue &, const MCAssembler *) const override { return false; } }; class ARMCOFFMCAsmInfoMicrosoft : public MCAsmInfoMicrosoft { void anchor() override; public: explicit ARMCOFFMCAsmInfoMicrosoft(); void printSpecifierExpr(raw_ostream &OS, const MCSpecifierExpr &Expr) const override { ARM::printSpecifierExpr(*this, OS, Expr); } bool evaluateAsRelocatableImpl(const MCSpecifierExpr &, MCValue &, const MCAssembler *) const override { return false; } }; class ARMCOFFMCAsmInfoGNU : public MCAsmInfoGNUCOFF { void anchor() override; public: explicit ARMCOFFMCAsmInfoGNU(); void printSpecifierExpr(raw_ostream &OS, const MCSpecifierExpr &Expr) const override { ARM::printSpecifierExpr(*this, OS, Expr); } bool evaluateAsRelocatableImpl(const MCSpecifierExpr &, MCValue &, const MCAssembler *) const override { return false; } }; namespace ARM { using Specifier = uint16_t; enum { S_None, S_COFF_SECREL, S_HI16 = MCSymbolRefExpr::FirstTargetSpecifier, // The R_ARM_MOVT_ABS relocation // (:upper16: in the .s file) S_LO16, // The R_ARM_MOVW_ABS_NC relocation (:lower16: in the .s file) S_HI_8_15, // The R_ARM_THM_ALU_ABS_G3 relocation (:upper8_15: in // the .s file) S_HI_0_7, // The R_ARM_THM_ALU_ABS_G2_NC relocation (:upper0_8: in the // .s file) S_LO_8_15, // The R_ARM_THM_ALU_ABS_G1_NC relocation (:lower8_15: in // the .s file) S_LO_0_7, // The R_ARM_THM_ALU_ABS_G0_NC relocation (:lower0_7: in the // .s file) S_ARM_NONE, S_FUNCDESC, S_GOT, S_GOTFUNCDESC, S_GOTOFF, S_GOTOFFFUNCDESC, S_GOTTPOFF, S_GOTTPOFF_FDPIC, S_GOT_PREL, S_PLT, S_PREL31, S_SBREL, S_TARGET1, S_TARGET2, S_TLSCALL, S_TLSDESC, S_TLSDESCSEQ, S_TLSGD, S_TLSGD_FDPIC, S_TLSLDM, S_TLSLDM_FDPIC, S_TLSLDO, S_TPOFF, }; const MCSpecifierExpr *createUpper16(const MCExpr *Expr, MCContext &Ctx); const MCSpecifierExpr *createLower16(const MCExpr *Expr, MCContext &Ctx); const MCSpecifierExpr *createUpper8_15(const MCExpr *Expr, MCContext &Ctx); const MCSpecifierExpr *createUpper0_7(const MCExpr *Expr, MCContext &Ctx); const MCSpecifierExpr *createLower8_15(const MCExpr *Expr, MCContext &Ctx); const MCSpecifierExpr *createLower0_7(const MCExpr *Expr, MCContext &Ctx); } } // namespace llvm #endif