1 //===-- ARMAsmBackend.h - ARM Assembler Backend -----------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_LIB_TARGET_ARM_ARMASMBACKEND_H
10 #define LLVM_LIB_TARGET_ARM_ARMASMBACKEND_H
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"
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.
27 ARMAsmBackend(const Target
&T
, const MCSubtargetInfo
&STI
,
28 support::endianness Endian
)
29 : MCAsmBackend(Endian
), STI(STI
),
30 isThumbMode(STI
.getTargetTriple().isThumb()) {}
32 unsigned getNumFixupKinds() const override
{
33 return ARM::NumTargetFixupKinds
;
36 // FIXME: this should be calculated per fragment as the STI may be
38 bool hasNOP() const { return STI
.getFeatureBits()[ARM::HasV6T2Ops
]; }
40 Optional
<MCFixupKind
> getFixupKind(StringRef Name
) const override
;
42 const MCFixupKindInfo
&getFixupKindInfo(MCFixupKind Kind
) const override
;
44 bool shouldForceRelocation(const MCAssembler
&Asm
, const MCFixup
&Fixup
,
45 const MCValue
&Target
) override
;
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;
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
;
57 unsigned getRelaxedOpcode(unsigned Op
, const MCSubtargetInfo
&STI
) const;
59 bool mayNeedRelaxation(const MCInst
&Inst
,
60 const MCSubtargetInfo
&STI
) const override
;
62 const char *reasonForFixupRelaxation(const MCFixup
&Fixup
,
63 uint64_t Value
) const;
65 bool fixupNeedsRelaxation(const MCFixup
&Fixup
, uint64_t Value
,
66 const MCRelaxableFragment
*DF
,
67 const MCAsmLayout
&Layout
) const override
;
69 void relaxInstruction(const MCInst
&Inst
, const MCSubtargetInfo
&STI
,
70 MCInst
&Res
) const override
;
72 bool writeNopData(raw_ostream
&OS
, uint64_t Count
) const override
;
74 void handleAssemblerFlag(MCAssemblerFlag Flag
) override
;
76 unsigned getPointerSize() const { return 4; }
77 bool isThumb() const { return isThumbMode
; }
78 void setIsThumb(bool it
) { isThumbMode
= it
; }
80 } // end namespace llvm