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
18namespace llvm {
19
20class 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.
26public:
27  ARMAsmBackend(const Target &T, const MCSubtargetInfo &STI,
28                support::endianness Endian)
29      : MCAsmBackend(Endian), STI(STI),
30        isThumbMode(STI.getTargetTriple().isThumb()) {}
31
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.
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
76  unsigned getPointerSize() const { return 4; }
77  bool isThumb() const { return isThumbMode; }
78  void setIsThumb(bool it) { isThumbMode = it; }
79};
80} // end namespace llvm
81
82#endif
83