0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 //===-- ARMAsmPrinter.h - ARM implementation of AsmPrinter ------*- C++ -*-===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 // The LLVM Compiler Infrastructure
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 // This file is distributed under the University of Illinois Open Source
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 // License. See LICENSE.TXT for details.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9
|
77
|
10 #ifndef LLVM_LIB_TARGET_ARM_ARMASMPRINTER_H
|
|
11 #define LLVM_LIB_TARGET_ARM_ARMASMPRINTER_H
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12
|
77
|
13 #include "ARMSubtarget.h"
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 #include "llvm/CodeGen/AsmPrinter.h"
|
77
|
15 #include "llvm/Target/TargetMachine.h"
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 namespace llvm {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18
|
77
|
19 class ARMFunctionInfo;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 class MCOperand;
|
77
|
21 class MachineConstantPool;
|
|
22 class MachineOperand;
|
83
|
23 class MCSymbol;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 namespace ARM {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 enum DW_ISA {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 DW_ISA_ARM_thumb = 1,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 DW_ISA_ARM_arm = 2
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 };
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 /// make the right decision when printing asm code for different targets.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 const ARMSubtarget *Subtarget;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 /// AFI - Keep a pointer to ARMFunctionInfo for the current
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 /// MachineFunction.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 ARMFunctionInfo *AFI;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 /// MCP - Keep a pointer to constantpool entries of the current
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 /// MachineFunction.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 const MachineConstantPool *MCP;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 /// InConstantPool - Maintain state when emitting a sequence of constant
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 /// pool entries so we can properly mark them as data regions.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 bool InConstantPool;
|
83
|
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
|
100
|
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
|
120
|
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
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 public:
|
83
|
70 explicit ARMAsmPrinter(TargetMachine &TM,
|
|
71 std::unique_ptr<MCStreamer> Streamer);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72
|
120
|
73 StringRef getPassName() const override {
|
|
74 return "ARM Assembly Printer";
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76
|
95
|
77 void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78
|
77
|
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;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88
|
95
|
89 void EmitJumpTableAddrs(const MachineInstr *MI);
|
|
90 void EmitJumpTableInsts(const MachineInstr *MI);
|
|
91 void EmitJumpTableTBInst(const MachineInstr *MI, unsigned OffsetWidth);
|
77
|
92 void EmitInstruction(const MachineInstr *MI) override;
|
|
93 bool runOnMachineFunction(MachineFunction &F) override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94
|
77
|
95 void EmitConstantPool() override {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 // we emit constant pools customly!
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97 }
|
77
|
98 void EmitFunctionBodyEnd() override;
|
|
99 void EmitFunctionEntryLabel() override;
|
|
100 void EmitStartOfAsmFile(Module &M) override;
|
|
101 void EmitEndOfAsmFile(Module &M) override;
|
95
|
102 void EmitXXStructor(const DataLayout &DL, const Constant *CV) override;
|
120
|
103 void EmitGlobalVariable(const GlobalVariable *GV) override;
|
|
104
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
105 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
106 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
107
|
120
|
108 //===------------------------------------------------------------------===//
|
|
109 // XRay implementation
|
|
110 //===------------------------------------------------------------------===//
|
|
111 public:
|
|
112 // XRay-specific lowering for ARM.
|
|
113 void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI);
|
|
114 void LowerPATCHABLE_FUNCTION_EXIT(const MachineInstr &MI);
|
|
115 void LowerPATCHABLE_TAIL_CALL(const MachineInstr &MI);
|
|
116 // Helper function that emits the XRay sleds we've collected for a particular
|
|
117 // function.
|
|
118 void EmitXRayTable();
|
|
119
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 private:
|
120
|
121 void EmitSled(const MachineInstr &MI, SledKind Kind);
|
|
122
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
123 // Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile()
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 void emitAttributes();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
125
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
126 // Generic helper used to emit e.g. ARMv5 mul pseudos
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127 void EmitPatchedInstruction(const MachineInstr *MI, unsigned TargetOpc);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 void EmitUnwindingInstruction(const MachineInstr *MI);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 // emitPseudoExpansionLowering - tblgen'erated.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 const MachineInstr *MI);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 public:
|
95
|
136 unsigned getISAEncoding() override {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 // ARM/Darwin adds ISA to the DWARF info for each function.
|
95
|
138 const Triple &TT = TM.getTargetTriple();
|
83
|
139 if (!TT.isOSBinFormatMachO())
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 return 0;
|
95
|
141 bool isThumb = TT.getArch() == Triple::thumb ||
|
|
142 TT.getArch() == Triple::thumbeb ||
|
|
143 TT.getSubArch() == Triple::ARMSubArch_v7m ||
|
|
144 TT.getSubArch() == Triple::ARMSubArch_v6m;
|
|
145 return isThumb ? ARM::DW_ISA_ARM_thumb : ARM::DW_ISA_ARM_arm;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
146 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
147
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
148 private:
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
149 MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol);
|
95
|
150 MCSymbol *GetARMJTIPICJumpTableLabel(unsigned uid) const;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
151
|
33
|
152 MCSymbol *GetARMGVSymbol(const GlobalValue *GV, unsigned char TargetFlags);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
153
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
154 public:
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
155 /// EmitMachineConstantPoolValue - Print a machine constantpool value to
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 /// the .s file.
|
77
|
157 void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
158 };
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159 } // end namespace llvm
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161 #endif
|