147 lines · c
1//===-- ARMMCAsmInfo.h - ARM 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-exception6//7//===----------------------------------------------------------------------===//8//9// This file contains the declaration of the ARMMCAsmInfo class.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCASMINFO_H14#define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCASMINFO_H15 16#include "llvm/MC/MCAsmInfoCOFF.h"17#include "llvm/MC/MCAsmInfoDarwin.h"18#include "llvm/MC/MCAsmInfoELF.h"19#include "llvm/MC/MCExpr.h"20 21namespace llvm {22class Triple;23 24namespace ARM {25void printSpecifierExpr(const MCAsmInfo &MAI, raw_ostream &OS,26 const MCSpecifierExpr &Expr);27}28 29class ARMMCAsmInfoDarwin : public MCAsmInfoDarwin {30 virtual void anchor();31 32public:33 explicit ARMMCAsmInfoDarwin(const Triple &TheTriple);34 void printSpecifierExpr(raw_ostream &OS,35 const MCSpecifierExpr &Expr) const override {36 ARM::printSpecifierExpr(*this, OS, Expr);37 }38 bool evaluateAsRelocatableImpl(const MCSpecifierExpr &, MCValue &,39 const MCAssembler *) const override {40 return false;41 }42};43 44class ARMELFMCAsmInfo : public MCAsmInfoELF {45 void anchor() override;46 47public:48 explicit ARMELFMCAsmInfo(const Triple &TT);49 50 void setUseIntegratedAssembler(bool Value) override;51 void printSpecifierExpr(raw_ostream &OS,52 const MCSpecifierExpr &Expr) const override {53 ARM::printSpecifierExpr(*this, OS, Expr);54 }55 bool evaluateAsRelocatableImpl(const MCSpecifierExpr &, MCValue &,56 const MCAssembler *) const override {57 return false;58 }59};60 61class ARMCOFFMCAsmInfoMicrosoft : public MCAsmInfoMicrosoft {62 void anchor() override;63 64public:65 explicit ARMCOFFMCAsmInfoMicrosoft();66 void printSpecifierExpr(raw_ostream &OS,67 const MCSpecifierExpr &Expr) const override {68 ARM::printSpecifierExpr(*this, OS, Expr);69 }70 bool evaluateAsRelocatableImpl(const MCSpecifierExpr &, MCValue &,71 const MCAssembler *) const override {72 return false;73 }74};75 76class ARMCOFFMCAsmInfoGNU : public MCAsmInfoGNUCOFF {77 void anchor() override;78 79public:80 explicit ARMCOFFMCAsmInfoGNU();81 void printSpecifierExpr(raw_ostream &OS,82 const MCSpecifierExpr &Expr) const override {83 ARM::printSpecifierExpr(*this, OS, Expr);84 }85 bool evaluateAsRelocatableImpl(const MCSpecifierExpr &, MCValue &,86 const MCAssembler *) const override {87 return false;88 }89};90 91namespace ARM {92using Specifier = uint16_t;93enum {94 S_None,95 S_COFF_SECREL,96 97 S_HI16 =98 MCSymbolRefExpr::FirstTargetSpecifier, // The R_ARM_MOVT_ABS relocation99 // (:upper16: in the .s file)100 S_LO16, // The R_ARM_MOVW_ABS_NC relocation (:lower16: in the .s file)101 102 S_HI_8_15, // The R_ARM_THM_ALU_ABS_G3 relocation (:upper8_15: in103 // the .s file)104 S_HI_0_7, // The R_ARM_THM_ALU_ABS_G2_NC relocation (:upper0_8: in the105 // .s file)106 S_LO_8_15, // The R_ARM_THM_ALU_ABS_G1_NC relocation (:lower8_15: in107 // the .s file)108 S_LO_0_7, // The R_ARM_THM_ALU_ABS_G0_NC relocation (:lower0_7: in the109 // .s file)110 111 S_ARM_NONE,112 S_FUNCDESC,113 S_GOT,114 S_GOTFUNCDESC,115 S_GOTOFF,116 S_GOTOFFFUNCDESC,117 S_GOTTPOFF,118 S_GOTTPOFF_FDPIC,119 S_GOT_PREL,120 S_PLT,121 S_PREL31,122 S_SBREL,123 S_TARGET1,124 S_TARGET2,125 S_TLSCALL,126 S_TLSDESC,127 S_TLSDESCSEQ,128 S_TLSGD,129 S_TLSGD_FDPIC,130 S_TLSLDM,131 S_TLSLDM_FDPIC,132 S_TLSLDO,133 S_TPOFF,134};135 136const MCSpecifierExpr *createUpper16(const MCExpr *Expr, MCContext &Ctx);137const MCSpecifierExpr *createLower16(const MCExpr *Expr, MCContext &Ctx);138const MCSpecifierExpr *createUpper8_15(const MCExpr *Expr, MCContext &Ctx);139const MCSpecifierExpr *createUpper0_7(const MCExpr *Expr, MCContext &Ctx);140const MCSpecifierExpr *createLower8_15(const MCExpr *Expr, MCContext &Ctx);141const MCSpecifierExpr *createLower0_7(const MCExpr *Expr, MCContext &Ctx);142}143 144} // namespace llvm145 146#endif147