1//===- llvm/MC/MCAsmBackend.h - MC Asm Backend ------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef LLVM_MC_MCASMBACKEND_H 11#define LLVM_MC_MCASMBACKEND_H 12 13#include "llvm/ADT/ArrayRef.h" 14#include "llvm/ADT/Optional.h" 15#include "llvm/ADT/StringRef.h" 16#include "llvm/MC/MCDirectives.h" 17#include "llvm/MC/MCFixup.h" 18#include <cstdint> 19 20namespace llvm { 21 22class MCAsmLayout; 23class MCAssembler; 24class MCCFIInstruction; 25struct MCFixupKindInfo; 26class MCFragment; 27class MCInst; 28class MCObjectWriter; 29class MCRelaxableFragment; 30class MCSubtargetInfo; 31class MCValue; 32class raw_pwrite_stream; 33 34/// Generic interface to target specific assembler backends. 35class MCAsmBackend { 36protected: // Can only create subclasses. 37 MCAsmBackend(); 38 39public: 40 MCAsmBackend(const MCAsmBackend &) = delete; 41 MCAsmBackend &operator=(const MCAsmBackend &) = delete; 42 virtual ~MCAsmBackend(); 43 44 /// lifetime management 45 virtual void reset() {} 46 47 /// Create a new MCObjectWriter instance for use by the assembler backend to 48 /// emit the final object file. 49 virtual std::unique_ptr<MCObjectWriter> 50 createObjectWriter(raw_pwrite_stream &OS) const = 0; 51 52 /// \name Target Fixup Interfaces 53 /// @{ 54 55 /// Get the number of target specific fixup kinds. 56 virtual unsigned getNumFixupKinds() const = 0; 57 58 /// Map a relocation name used in .reloc to a fixup kind. 59 virtual Optional<MCFixupKind> getFixupKind(StringRef Name) const; 60 61 /// Get information on a fixup kind. 62 virtual const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const; 63 64 /// Hook to check if a relocation is needed for some target specific reason. 65 virtual bool shouldForceRelocation(const MCAssembler &Asm, 66 const MCFixup &Fixup, 67 const MCValue &Target) { 68 return false; 69 } 70 71 /// Apply the \p Value for given \p Fixup into the provided data fragment, at 72 /// the offset specified by the fixup and following the fixup kind as 73 /// appropriate. Errors (such as an out of range fixup value) should be 74 /// reported via \p Ctx. 75 virtual void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, 76 const MCValue &Target, MutableArrayRef<char> Data, 77 uint64_t Value, bool IsResolved) const = 0; 78 79 /// @} 80 81 /// \name Target Relaxation Interfaces 82 /// @{ 83 84 /// Check whether the given instruction may need relaxation. 85 /// 86 /// \param Inst - The instruction to test. 87 virtual bool mayNeedRelaxation(const MCInst &Inst) const = 0; 88 89 /// Target specific predicate for whether a given fixup requires the 90 /// associated instruction to be relaxed. 91 virtual bool fixupNeedsRelaxationAdvanced(const MCFixup &Fixup, bool Resolved, 92 uint64_t Value, 93 const MCRelaxableFragment *DF, 94 const MCAsmLayout &Layout) const; 95 96 /// Simple predicate for targets where !Resolved implies requiring relaxation 97 virtual bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, 98 const MCRelaxableFragment *DF, 99 const MCAsmLayout &Layout) const = 0; 100 101 /// Relax the instruction in the given fragment to the next wider instruction. 102 /// 103 /// \param Inst The instruction to relax, which may be the same as the 104 /// output. 105 /// \param STI the subtarget information for the associated instruction. 106 /// \param [out] Res On return, the relaxed instruction. 107 virtual void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo &STI, 108 MCInst &Res) const = 0; 109 110 /// @} 111 112 /// Returns the minimum size of a nop in bytes on this target. The assembler 113 /// will use this to emit excess padding in situations where the padding 114 /// required for simple alignment would be less than the minimum nop size. 115 /// 116 virtual unsigned getMinimumNopSize() const { return 1; } 117 118 /// Write an (optimal) nop sequence of Count bytes to the given output. If the 119 /// target cannot generate such a sequence, it should return an error. 120 /// 121 /// \return - True on success. 122 virtual bool writeNopData(uint64_t Count, MCObjectWriter *OW) const = 0; 123 124 /// Give backend an opportunity to finish layout after relaxation 125 virtual void finishLayout(MCAssembler const &Asm, 126 MCAsmLayout &Layout) const {} 127 128 /// Handle any target-specific assembler flags. By default, do nothing. 129 virtual void handleAssemblerFlag(MCAssemblerFlag Flag) {} 130 131 /// \brief Generate the compact unwind encoding for the CFI instructions. 132 virtual uint32_t 133 generateCompactUnwindEncoding(ArrayRef<MCCFIInstruction>) const { 134 return 0; 135 } 136}; 137 138} // end namespace llvm 139 140#endif // LLVM_MC_MCASMBACKEND_H 141