1*9880d681SAndroid Build Coastguard Worker //===-- ARMAsmBackend.h - ARM Assembler Backend -----------------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_ARM_ARMASMBACKEND_H 11*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_ARM_ARMASMBACKEND_H 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/ARMFixupKinds.h" 14*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/ARMMCTargetDesc.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCAsmBackend.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSubtargetInfo.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h" 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker namespace llvm { 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker class ARMAsmBackend : public MCAsmBackend { 22*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo *STI; 23*9880d681SAndroid Build Coastguard Worker bool isThumbMode; // Currently emitting Thumb code. 24*9880d681SAndroid Build Coastguard Worker bool IsLittleEndian; // Big or little endian. 25*9880d681SAndroid Build Coastguard Worker public: ARMAsmBackend(const Target & T,const Triple & TT,bool IsLittle)26*9880d681SAndroid Build Coastguard Worker ARMAsmBackend(const Target &T, const Triple &TT, bool IsLittle) 27*9880d681SAndroid Build Coastguard Worker : MCAsmBackend(), STI(ARM_MC::createARMMCSubtargetInfo(TT, "", "")), 28*9880d681SAndroid Build Coastguard Worker isThumbMode(TT.getArchName().startswith("thumb")), 29*9880d681SAndroid Build Coastguard Worker IsLittleEndian(IsLittle) {} 30*9880d681SAndroid Build Coastguard Worker ~ARMAsmBackend()31*9880d681SAndroid Build Coastguard Worker ~ARMAsmBackend() override { delete STI; } 32*9880d681SAndroid Build Coastguard Worker getNumFixupKinds()33*9880d681SAndroid Build Coastguard Worker unsigned getNumFixupKinds() const override { 34*9880d681SAndroid Build Coastguard Worker return ARM::NumTargetFixupKinds; 35*9880d681SAndroid Build Coastguard Worker } 36*9880d681SAndroid Build Coastguard Worker hasNOP()37*9880d681SAndroid Build Coastguard Worker bool hasNOP() const { return STI->getFeatureBits()[ARM::HasV6T2Ops]; } 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override; 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker /// processFixupValue - Target hook to process the literal value of a fixup 42*9880d681SAndroid Build Coastguard Worker /// if necessary. 43*9880d681SAndroid Build Coastguard Worker void processFixupValue(const MCAssembler &Asm, const MCAsmLayout &Layout, 44*9880d681SAndroid Build Coastguard Worker const MCFixup &Fixup, const MCFragment *DF, 45*9880d681SAndroid Build Coastguard Worker const MCValue &Target, uint64_t &Value, 46*9880d681SAndroid Build Coastguard Worker bool &IsResolved) override; 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value, bool IsPCRel, 49*9880d681SAndroid Build Coastguard Worker MCContext *Ctx, bool IsLittleEndian, 50*9880d681SAndroid Build Coastguard Worker bool IsResolved) const; 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, 53*9880d681SAndroid Build Coastguard Worker uint64_t Value, bool IsPCRel) const override; 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker unsigned getRelaxedOpcode(unsigned Op) const; 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker bool mayNeedRelaxation(const MCInst &Inst) const override; 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker const char *reasonForFixupRelaxation(const MCFixup &Fixup, 60*9880d681SAndroid Build Coastguard Worker uint64_t Value) const; 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, 63*9880d681SAndroid Build Coastguard Worker const MCRelaxableFragment *DF, 64*9880d681SAndroid Build Coastguard Worker const MCAsmLayout &Layout) const override; 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo &STI, 67*9880d681SAndroid Build Coastguard Worker MCInst &Res) const override; 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override; 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker void handleAssemblerFlag(MCAssemblerFlag Flag) override; 72*9880d681SAndroid Build Coastguard Worker getPointerSize()73*9880d681SAndroid Build Coastguard Worker unsigned getPointerSize() const { return 4; } isThumb()74*9880d681SAndroid Build Coastguard Worker bool isThumb() const { return isThumbMode; } setIsThumb(bool it)75*9880d681SAndroid Build Coastguard Worker void setIsThumb(bool it) { isThumbMode = it; } isLittle()76*9880d681SAndroid Build Coastguard Worker bool isLittle() const { return IsLittleEndian; } 77*9880d681SAndroid Build Coastguard Worker }; 78*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker #endif 81