1 //===-- ARMAsmBackend.h - ARM Assembler Backend -----------------*- 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 #ifndef LLVM_LIB_TARGET_ARM_ARMASMBACKEND_H 10 #define LLVM_LIB_TARGET_ARM_ARMASMBACKEND_H 11 12 #include "MCTargetDesc/ARMFixupKinds.h" 13 #include "MCTargetDesc/ARMMCTargetDesc.h" 14 #include "llvm/MC/MCAsmBackend.h" 15 #include "llvm/MC/MCSubtargetInfo.h" 16 #include "llvm/Support/TargetRegistry.h" 17 18 namespace llvm { 19 20 class ARMAsmBackend : public MCAsmBackend { 21 // The STI from the target triple the MCAsmBackend was instantiated with 22 // note that MCFragments may have a different local STI that should be 23 // used in preference. 24 const MCSubtargetInfo &STI; 25 bool isThumbMode; // Currently emitting Thumb code. 26 public: ARMAsmBackend(const Target & T,const MCSubtargetInfo & STI,support::endianness Endian)27 ARMAsmBackend(const Target &T, const MCSubtargetInfo &STI, 28 support::endianness Endian) 29 : MCAsmBackend(Endian), STI(STI), 30 isThumbMode(STI.getTargetTriple().isThumb()) {} 31 getNumFixupKinds()32 unsigned getNumFixupKinds() const override { 33 return ARM::NumTargetFixupKinds; 34 } 35 36 // FIXME: this should be calculated per fragment as the STI may be 37 // different. hasNOP()38 bool hasNOP() const { return STI.getFeatureBits()[ARM::HasV6T2Ops]; } 39 40 Optional<MCFixupKind> getFixupKind(StringRef Name) const override; 41 42 const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override; 43 44 bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup, 45 const MCValue &Target) override; 46 47 unsigned adjustFixupValue(const MCAssembler &Asm, const MCFixup &Fixup, 48 const MCValue &Target, uint64_t Value, 49 bool IsResolved, MCContext &Ctx, 50 const MCSubtargetInfo *STI) const; 51 52 void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, 53 const MCValue &Target, MutableArrayRef<char> Data, 54 uint64_t Value, bool IsResolved, 55 const MCSubtargetInfo *STI) const override; 56 57 unsigned getRelaxedOpcode(unsigned Op, const MCSubtargetInfo &STI) const; 58 59 bool mayNeedRelaxation(const MCInst &Inst, 60 const MCSubtargetInfo &STI) const override; 61 62 const char *reasonForFixupRelaxation(const MCFixup &Fixup, 63 uint64_t Value) const; 64 65 bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, 66 const MCRelaxableFragment *DF, 67 const MCAsmLayout &Layout) const override; 68 69 void relaxInstruction(MCInst &Inst, 70 const MCSubtargetInfo &STI) const override; 71 72 bool writeNopData(raw_ostream &OS, uint64_t Count) const override; 73 74 void handleAssemblerFlag(MCAssemblerFlag Flag) override; 75 getPointerSize()76 unsigned getPointerSize() const { return 4; } isThumb()77 bool isThumb() const { return isThumbMode; } setIsThumb(bool it)78 void setIsThumb(bool it) { isThumbMode = it; } 79 }; 80 } // end namespace llvm 81 82 #endif 83