Home | History | Annotate | Line # | Download | only in MCTargetDesc
      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:
     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