Line data Source code
1 : //===-- ARMAsmPrinter.h - ARM implementation of AsmPrinter ------*- 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_LIB_TARGET_ARM_ARMASMPRINTER_H
11 : #define LLVM_LIB_TARGET_ARM_ARMASMPRINTER_H
12 :
13 : #include "ARMSubtarget.h"
14 : #include "llvm/CodeGen/AsmPrinter.h"
15 : #include "llvm/Target/TargetMachine.h"
16 :
17 : namespace llvm {
18 :
19 : class ARMFunctionInfo;
20 : class MCOperand;
21 : class MachineConstantPool;
22 : class MachineOperand;
23 : class MCSymbol;
24 :
25 : namespace ARM {
26 : enum DW_ISA {
27 : DW_ISA_ARM_thumb = 1,
28 : DW_ISA_ARM_arm = 2
29 : };
30 : }
31 :
32 : class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter {
33 :
34 : /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
35 : /// make the right decision when printing asm code for different targets.
36 : const ARMSubtarget *Subtarget;
37 :
38 : /// AFI - Keep a pointer to ARMFunctionInfo for the current
39 : /// MachineFunction.
40 : ARMFunctionInfo *AFI;
41 :
42 : /// MCP - Keep a pointer to constantpool entries of the current
43 : /// MachineFunction.
44 : const MachineConstantPool *MCP;
45 :
46 : /// InConstantPool - Maintain state when emitting a sequence of constant
47 : /// pool entries so we can properly mark them as data regions.
48 : bool InConstantPool;
49 :
50 : /// ThumbIndirectPads - These maintain a per-function list of jump pad
51 : /// labels used for ARMv4t thumb code to make register indirect calls.
52 : SmallVector<std::pair<unsigned, MCSymbol*>, 4> ThumbIndirectPads;
53 :
54 : /// OptimizationGoals - Maintain a combined optimization goal for all
55 : /// functions in a module: one of Tag_ABI_optimization_goals values,
56 : /// -1 if uninitialized, 0 if conflicting goals
57 : int OptimizationGoals;
58 :
59 : /// List of globals that have had their storage promoted to a constant
60 : /// pool. This lives between calls to runOnMachineFunction and collects
61 : /// data from every MachineFunction. It is used during doFinalization
62 : /// when all non-function globals are emitted.
63 : SmallPtrSet<const GlobalVariable*,2> PromotedGlobals;
64 : /// Set of globals in PromotedGlobals that we've emitted labels for.
65 : /// We need to emit labels even for promoted globals so that DWARF
66 : /// debug info can link properly.
67 : SmallPtrSet<const GlobalVariable*,2> EmittedPromotedGlobalLabels;
68 :
69 : public:
70 : explicit ARMAsmPrinter(TargetMachine &TM,
71 : std::unique_ptr<MCStreamer> Streamer);
72 :
73 0 : StringRef getPassName() const override {
74 0 : return "ARM Assembly Printer";
75 : }
76 :
77 : void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O);
78 :
79 : bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
80 : unsigned AsmVariant, const char *ExtraCode,
81 : raw_ostream &O) override;
82 : bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
83 : unsigned AsmVariant, const char *ExtraCode,
84 : raw_ostream &O) override;
85 :
86 : void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
87 : const MCSubtargetInfo *EndInfo) const override;
88 :
89 : void EmitJumpTableAddrs(const MachineInstr *MI);
90 : void EmitJumpTableInsts(const MachineInstr *MI);
91 : void EmitJumpTableTBInst(const MachineInstr *MI, unsigned OffsetWidth);
92 : void EmitInstruction(const MachineInstr *MI) override;
93 : bool runOnMachineFunction(MachineFunction &F) override;
94 :
95 14590 : void EmitConstantPool() override {
96 : // we emit constant pools customly!
97 14590 : }
98 : void EmitFunctionBodyEnd() override;
99 : void EmitFunctionEntryLabel() override;
100 : void EmitStartOfAsmFile(Module &M) override;
101 : void EmitEndOfAsmFile(Module &M) override;
102 : void EmitXXStructor(const DataLayout &DL, const Constant *CV) override;
103 : void EmitGlobalVariable(const GlobalVariable *GV) override;
104 :
105 : MCSymbol *GetCPISymbol(unsigned CPID) const override;
106 :
107 : // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
108 : bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
109 :
110 : //===------------------------------------------------------------------===//
111 : // XRay implementation
112 : //===------------------------------------------------------------------===//
113 : public:
114 : // XRay-specific lowering for ARM.
115 : void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI);
116 : void LowerPATCHABLE_FUNCTION_EXIT(const MachineInstr &MI);
117 : void LowerPATCHABLE_TAIL_CALL(const MachineInstr &MI);
118 :
119 : private:
120 : void EmitSled(const MachineInstr &MI, SledKind Kind);
121 :
122 : // Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile()
123 : void emitAttributes();
124 :
125 : // Generic helper used to emit e.g. ARMv5 mul pseudos
126 : void EmitPatchedInstruction(const MachineInstr *MI, unsigned TargetOpc);
127 :
128 : void EmitUnwindingInstruction(const MachineInstr *MI);
129 :
130 : // emitPseudoExpansionLowering - tblgen'erated.
131 : bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
132 : const MachineInstr *MI);
133 :
134 : public:
135 50 : unsigned getISAEncoding() override {
136 : // ARM/Darwin adds ISA to the DWARF info for each function.
137 50 : const Triple &TT = TM.getTargetTriple();
138 50 : if (!TT.isOSBinFormatMachO())
139 : return 0;
140 8 : bool isThumb = TT.isThumb() ||
141 8 : TT.getSubArch() == Triple::ARMSubArch_v7m ||
142 : TT.getSubArch() == Triple::ARMSubArch_v6m;
143 : return isThumb ? ARM::DW_ISA_ARM_thumb : ARM::DW_ISA_ARM_arm;
144 : }
145 :
146 : private:
147 : MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol);
148 : MCSymbol *GetARMJTIPICJumpTableLabel(unsigned uid) const;
149 :
150 : MCSymbol *GetARMGVSymbol(const GlobalValue *GV, unsigned char TargetFlags);
151 :
152 : public:
153 : /// EmitMachineConstantPoolValue - Print a machine constantpool value to
154 : /// the .s file.
155 : void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) override;
156 : };
157 : } // end namespace llvm
158 :
159 : #endif
|