171 lines · c
1//===-- ARMAsmPrinter.h - ARM implementation of AsmPrinter ------*- 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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_TARGET_ARM_ARMASMPRINTER_H10#define LLVM_LIB_TARGET_ARM_ARMASMPRINTER_H11 12#include "llvm/CodeGen/AsmPrinter.h"13#include "llvm/Target/TargetMachine.h"14 15namespace llvm {16 17class ARMFunctionInfo;18class ARMBaseTargetMachine;19class MCOperand;20class MachineConstantPool;21class MachineOperand;22class MCSymbol;23 24namespace ARM {25 enum DW_ISA {26 DW_ISA_ARM_thumb = 1,27 DW_ISA_ARM_arm = 228 };29}30 31class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter {32public:33 static char ID;34 35private:36 /// AFI - Keep a pointer to ARMFunctionInfo for the current37 /// MachineFunction.38 ARMFunctionInfo *AFI;39 40 /// MCP - Keep a pointer to constantpool entries of the current41 /// MachineFunction.42 const MachineConstantPool *MCP;43 44 /// InConstantPool - Maintain state when emitting a sequence of constant45 /// pool entries so we can properly mark them as data regions.46 bool InConstantPool;47 48 /// ThumbIndirectPads - These maintain a per-function list of jump pad49 /// labels used for ARMv4t thumb code to make register indirect calls.50 SmallVector<std::pair<unsigned, MCSymbol*>, 4> ThumbIndirectPads;51 52 /// OptimizationGoals - Maintain a combined optimization goal for all53 /// functions in a module: one of Tag_ABI_optimization_goals values,54 /// -1 if uninitialized, 0 if conflicting goals55 int OptimizationGoals;56 57 /// List of globals that have had their storage promoted to a constant58 /// pool. This lives between calls to runOnMachineFunction and collects59 /// data from every MachineFunction. It is used during doFinalization60 /// when all non-function globals are emitted.61 SmallPtrSet<const GlobalVariable*,2> PromotedGlobals;62 /// Set of globals in PromotedGlobals that we've emitted labels for.63 /// We need to emit labels even for promoted globals so that DWARF64 /// debug info can link properly.65 SmallPtrSet<const GlobalVariable*,2> EmittedPromotedGlobalLabels;66 67public:68 explicit ARMAsmPrinter(TargetMachine &TM,69 std::unique_ptr<MCStreamer> Streamer);70 71 StringRef getPassName() const override {72 return "ARM Assembly Printer";73 }74 75 const ARMBaseTargetMachine &getTM() const;76 77 void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O);78 79 void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &O) override;80 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,81 const char *ExtraCode, raw_ostream &O) override;82 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,83 const char *ExtraCode, raw_ostream &O) override;84 85 void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,86 const MCSubtargetInfo *EndInfo) const override;87 88 void emitJumpTableAddrs(const MachineInstr *MI);89 void emitJumpTableInsts(const MachineInstr *MI);90 void emitJumpTableTBInst(const MachineInstr *MI, unsigned OffsetWidth);91 void emitInstruction(const MachineInstr *MI) override;92 bool runOnMachineFunction(MachineFunction &F) override;93 std::tuple<const MCSymbol *, uint64_t, const MCSymbol *,94 codeview::JumpTableEntrySize>95 getCodeViewJumpTableInfo(int JTI, const MachineInstr *BranchInstr,96 const MCSymbol *BranchLabel) const override;97 98 void emitConstantPool() override {99 // we emit constant pools customly!100 }101 void emitFunctionBodyEnd() override;102 void emitFunctionEntryLabel() override;103 void emitStartOfAsmFile(Module &M) override;104 void emitEndOfAsmFile(Module &M) override;105 void emitXXStructor(const DataLayout &DL, const Constant *CV) override;106 void emitGlobalVariable(const GlobalVariable *GV) override;107 108 MCSymbol *GetCPISymbol(unsigned CPID) const override;109 110 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.111 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);112 113 //===------------------------------------------------------------------===//114 // XRay implementation115 //===------------------------------------------------------------------===//116public:117 // XRay-specific lowering for ARM.118 void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI);119 void LowerPATCHABLE_FUNCTION_EXIT(const MachineInstr &MI);120 void LowerPATCHABLE_TAIL_CALL(const MachineInstr &MI);121 122 // KCFI check lowering123 void LowerKCFI_CHECK(const MachineInstr &MI);124 125private:126 void EmitSled(const MachineInstr &MI, SledKind Kind);127 128 // KCFI check emission helpers129 void EmitKCFI_CHECK_ARM32(Register AddrReg, int64_t Type,130 const MachineInstr &Call, int64_t PrefixNops);131 void EmitKCFI_CHECK_Thumb2(Register AddrReg, int64_t Type,132 const MachineInstr &Call, int64_t PrefixNops);133 void EmitKCFI_CHECK_Thumb1(Register AddrReg, int64_t Type,134 const MachineInstr &Call, int64_t PrefixNops);135 136 // Helpers for emitStartOfAsmFile() and emitEndOfAsmFile()137 void emitAttributes();138 139 void EmitUnwindingInstruction(const MachineInstr *MI);140 141 // tblgen'erated.142 bool lowerPseudoInstExpansion(const MachineInstr *MI, MCInst &Inst);143 144public:145 unsigned getISAEncoding() override {146 // ARM/Darwin adds ISA to the DWARF info for each function.147 const Triple &TT = TM.getTargetTriple();148 if (!TT.isOSBinFormatMachO())149 return 0;150 bool isThumb = TT.isThumb() ||151 TT.getSubArch() == Triple::ARMSubArch_v7m ||152 TT.getSubArch() == Triple::ARMSubArch_v6m;153 return isThumb ? ARM::DW_ISA_ARM_thumb : ARM::DW_ISA_ARM_arm;154 }155 156private:157 MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol);158 MCSymbol *GetARMJTIPICJumpTableLabel(unsigned uid) const;159 160 MCSymbol *GetARMGVSymbol(const GlobalValue *GV, unsigned char TargetFlags);161 162public:163 /// EmitMachineConstantPoolValue - Print a machine constantpool value to164 /// the .s file.165 void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) override;166};167 168} // end namespace llvm169 170#endif171