10b57cec5SDimitry Andric //===-- ARMAsmBackend.h - ARM Assembler Backend -----------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_ARM_ARMASMBACKEND_H 100b57cec5SDimitry Andric #define LLVM_LIB_TARGET_ARM_ARMASMBACKEND_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "MCTargetDesc/ARMFixupKinds.h" 130b57cec5SDimitry Andric #include "MCTargetDesc/ARMMCTargetDesc.h" 140b57cec5SDimitry Andric #include "llvm/MC/MCAsmBackend.h" 150b57cec5SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 16349cc55cSDimitry Andric #include "llvm/MC/TargetRegistry.h" 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric namespace llvm { 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric class ARMAsmBackend : public MCAsmBackend { 210b57cec5SDimitry Andric bool isThumbMode; // Currently emitting Thumb code. 220b57cec5SDimitry Andric public: 235f757f3fSDimitry Andric ARMAsmBackend(const Target &T, bool isThumb, llvm::endianness Endian) 24349cc55cSDimitry Andric : MCAsmBackend(Endian), isThumbMode(isThumb) {} 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric unsigned getNumFixupKinds() const override { 270b57cec5SDimitry Andric return ARM::NumTargetFixupKinds; 280b57cec5SDimitry Andric } 290b57cec5SDimitry Andric 30349cc55cSDimitry Andric bool hasNOP(const MCSubtargetInfo *STI) const { 3106c3fb27SDimitry Andric return STI->hasFeature(ARM::HasV6T2Ops); 32349cc55cSDimitry Andric } 330b57cec5SDimitry Andric 34bdd1243dSDimitry Andric std::optional<MCFixupKind> getFixupKind(StringRef Name) const override; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup, 395f757f3fSDimitry Andric const MCValue &Target, 405f757f3fSDimitry Andric const MCSubtargetInfo *STI) override; 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric unsigned adjustFixupValue(const MCAssembler &Asm, const MCFixup &Fixup, 430b57cec5SDimitry Andric const MCValue &Target, uint64_t Value, 440b57cec5SDimitry Andric bool IsResolved, MCContext &Ctx, 450b57cec5SDimitry Andric const MCSubtargetInfo *STI) const; 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, 480b57cec5SDimitry Andric const MCValue &Target, MutableArrayRef<char> Data, 490b57cec5SDimitry Andric uint64_t Value, bool IsResolved, 500b57cec5SDimitry Andric const MCSubtargetInfo *STI) const override; 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric unsigned getRelaxedOpcode(unsigned Op, const MCSubtargetInfo &STI) const; 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric bool mayNeedRelaxation(const MCInst &Inst, 550b57cec5SDimitry Andric const MCSubtargetInfo &STI) const override; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric const char *reasonForFixupRelaxation(const MCFixup &Fixup, 580b57cec5SDimitry Andric uint64_t Value) const; 590b57cec5SDimitry Andric 60*0fca6ea1SDimitry Andric bool fixupNeedsRelaxation(const MCFixup &Fixup, 61*0fca6ea1SDimitry Andric uint64_t Value) const override; 620b57cec5SDimitry Andric 635ffd83dbSDimitry Andric void relaxInstruction(MCInst &Inst, 645ffd83dbSDimitry Andric const MCSubtargetInfo &STI) const override; 650b57cec5SDimitry Andric 66349cc55cSDimitry Andric bool writeNopData(raw_ostream &OS, uint64_t Count, 67349cc55cSDimitry Andric const MCSubtargetInfo *STI) const override; 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric void handleAssemblerFlag(MCAssemblerFlag Flag) override; 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric unsigned getPointerSize() const { return 4; } 720b57cec5SDimitry Andric bool isThumb() const { return isThumbMode; } 730b57cec5SDimitry Andric void setIsThumb(bool it) { isThumbMode = it; } 740b57cec5SDimitry Andric }; 750b57cec5SDimitry Andric } // end namespace llvm 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric #endif 78