annotate lib/CodeGen/XRayInstrumentation.cpp @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1 //===- XRayInstrumentation.cpp - Adds XRay instrumentation to functions. --===//
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 // This file implements a MachineFunctionPass that inserts the appropriate
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 // XRay instrumentation instructions. We look for XRay-specific attributes
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 // on the function to determine whether we should insert the replacement
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13 // operations.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 //===---------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
17 #include "llvm/ADT/STLExtras.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
18 #include "llvm/ADT/SmallVector.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
19 #include "llvm/ADT/Triple.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
20 #include "llvm/CodeGen/MachineBasicBlock.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
21 #include "llvm/CodeGen/MachineDominators.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 #include "llvm/CodeGen/MachineFunction.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23 #include "llvm/CodeGen/MachineFunctionPass.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24 #include "llvm/CodeGen/MachineInstrBuilder.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
25 #include "llvm/CodeGen/MachineLoopInfo.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
26 #include "llvm/CodeGen/TargetInstrInfo.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
27 #include "llvm/CodeGen/TargetSubtargetInfo.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
28 #include "llvm/IR/Attributes.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
29 #include "llvm/IR/Function.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
30 #include "llvm/Pass.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
31 #include "llvm/Target/TargetMachine.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 using namespace llvm;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 namespace {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
36
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
37 struct InstrumentationOptions {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
38 // Whether to emit PATCHABLE_TAIL_CALL.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
39 bool HandleTailcall;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
40
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
41 // Whether to emit PATCHABLE_RET/PATCHABLE_FUNCTION_EXIT for all forms of
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
42 // return, e.g. conditional return.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
43 bool HandleAllReturns;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
44 };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
45
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 struct XRayInstrumentation : public MachineFunctionPass {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 static char ID;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 XRayInstrumentation() : MachineFunctionPass(ID) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 initializeXRayInstrumentationPass(*PassRegistry::getPassRegistry());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
53 void getAnalysisUsage(AnalysisUsage &AU) const override {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
54 AU.setPreservesCFG();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
55 AU.addRequired<MachineLoopInfo>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
56 AU.addPreserved<MachineLoopInfo>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
57 AU.addPreserved<MachineDominatorTree>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
58 MachineFunctionPass::getAnalysisUsage(AU);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
59 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
60
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 bool runOnMachineFunction(MachineFunction &MF) override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 private:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 // Replace the original RET instruction with the exit sled code ("patchable
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 // ret" pseudo-instruction), so that at runtime XRay can replace the sled
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 // with a code jumping to XRay trampoline, which calls the tracing handler
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67 // and, in the end, issues the RET instruction.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68 // This is the approach to go on CPUs which have a single RET instruction,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 // like x86/x86_64.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70 void replaceRetWithPatchableRet(MachineFunction &MF,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
71 const TargetInstrInfo *TII,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
72 InstrumentationOptions);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 // Prepend the original return instruction with the exit sled code ("patchable
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75 // function exit" pseudo-instruction), preserving the original return
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76 // instruction just after the exit sled code.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77 // This is the approach to go on CPUs which have multiple options for the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
78 // return instruction, like ARM. For such CPUs we can't just jump into the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
79 // XRay trampoline and issue a single return instruction there. We rather
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80 // have to call the trampoline and return from it to the original return
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81 // instruction of the function being instrumented.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 void prependRetWithPatchableExit(MachineFunction &MF,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
83 const TargetInstrInfo *TII,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
84 InstrumentationOptions);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
86
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
87 } // end anonymous namespace
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
88
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
89 void XRayInstrumentation::replaceRetWithPatchableRet(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
90 MachineFunction &MF, const TargetInstrInfo *TII,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
91 InstrumentationOptions op) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92 // We look for *all* terminators and returns, then replace those with
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 // PATCHABLE_RET instructions.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94 SmallVector<MachineInstr *, 4> Terminators;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 for (auto &MBB : MF) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 for (auto &T : MBB.terminators()) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 unsigned Opc = 0;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
98 if (T.isReturn() &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
99 (op.HandleAllReturns || T.getOpcode() == TII->getReturnOpcode())) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 // Replace return instructions with:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
101 // PATCHABLE_RET <Opcode>, <Operand>...
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 Opc = TargetOpcode::PATCHABLE_RET;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
104 if (TII->isTailCall(T) && op.HandleTailcall) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
105 // Treat the tail call as a return instruction, which has a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
106 // different-looking sled than the normal return case.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
107 Opc = TargetOpcode::PATCHABLE_TAIL_CALL;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
108 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
109 if (Opc != 0) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
110 auto MIB = BuildMI(MBB, T, T.getDebugLoc(), TII->get(Opc))
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
111 .addImm(T.getOpcode());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
112 for (auto &MO : T.operands())
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
113 MIB.add(MO);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
114 Terminators.push_back(&T);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
115 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
116 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119 for (auto &I : Terminators)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
120 I->eraseFromParent();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
121 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
122
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
123 void XRayInstrumentation::prependRetWithPatchableExit(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
124 MachineFunction &MF, const TargetInstrInfo *TII,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
125 InstrumentationOptions op) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
126 for (auto &MBB : MF)
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
127 for (auto &T : MBB.terminators()) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
128 unsigned Opc = 0;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
129 if (T.isReturn() &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
130 (op.HandleAllReturns || T.getOpcode() == TII->getReturnOpcode())) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
131 Opc = TargetOpcode::PATCHABLE_FUNCTION_EXIT;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
132 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
133 if (TII->isTailCall(T) && op.HandleTailcall) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
134 Opc = TargetOpcode::PATCHABLE_TAIL_CALL;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
135 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
136 if (Opc != 0) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
137 // Prepend the return instruction with PATCHABLE_FUNCTION_EXIT or
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
138 // PATCHABLE_TAIL_CALL .
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
139 BuildMI(MBB, T, T.getDebugLoc(), TII->get(Opc));
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
140 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
141 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
142 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
143
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
144 bool XRayInstrumentation::runOnMachineFunction(MachineFunction &MF) {
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
145 auto &F = MF.getFunction();
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
146 auto InstrAttr = F.getFnAttribute("function-instrument");
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
147 bool AlwaysInstrument = !InstrAttr.hasAttribute(Attribute::None) &&
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
148 InstrAttr.isStringAttribute() &&
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
149 InstrAttr.getValueAsString() == "xray-always";
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
150 Attribute Attr = F.getFnAttribute("xray-instruction-threshold");
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
151 unsigned XRayThreshold = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
152 if (!AlwaysInstrument) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
153 if (Attr.hasAttribute(Attribute::None) || !Attr.isStringAttribute())
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
154 return false; // XRay threshold attribute not found.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
155 if (Attr.getValueAsString().getAsInteger(10, XRayThreshold))
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
156 return false; // Invalid value for threshold.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
157
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
158 // Count the number of MachineInstr`s in MachineFunction
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
159 int64_t MICount = 0;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
160 for (const auto &MBB : MF)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
161 MICount += MBB.size();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
162
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
163 // Check if we have a loop.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
164 // FIXME: Maybe make this smarter, and see whether the loops are dependent
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
165 // on inputs or side-effects?
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
166 MachineLoopInfo &MLI = getAnalysis<MachineLoopInfo>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
167 if (MLI.empty() && MICount < XRayThreshold)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
168 return false; // Function is too small and has no loops.
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
169 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
170
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
171 // We look for the first non-empty MachineBasicBlock, so that we can insert
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
172 // the function instrumentation in the appropriate place.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
173 auto MBI = llvm::find_if(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
174 MF, [&](const MachineBasicBlock &MBB) { return !MBB.empty(); });
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
175 if (MBI == MF.end())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
176 return false; // The function is empty.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
177
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
178 auto *TII = MF.getSubtarget().getInstrInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
179 auto &FirstMBB = *MBI;
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
180 auto &FirstMI = *FirstMBB.begin();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
181
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
182 if (!MF.getSubtarget().isXRaySupported()) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
183 FirstMI.emitError("An attempt to perform XRay instrumentation for an"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
184 " unsupported target.");
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
185 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
186 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
187
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
188 // First, insert an PATCHABLE_FUNCTION_ENTER as the first instruction of the
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
189 // MachineFunction.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
190 BuildMI(FirstMBB, FirstMI, FirstMI.getDebugLoc(),
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
191 TII->get(TargetOpcode::PATCHABLE_FUNCTION_ENTER));
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
192
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
193 switch (MF.getTarget().getTargetTriple().getArch()) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
194 case Triple::ArchType::arm:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
195 case Triple::ArchType::thumb:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
196 case Triple::ArchType::aarch64:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
197 case Triple::ArchType::mips:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
198 case Triple::ArchType::mipsel:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
199 case Triple::ArchType::mips64:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
200 case Triple::ArchType::mips64el: {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
201 // For the architectures which don't have a single return instruction
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
202 InstrumentationOptions op;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
203 op.HandleTailcall = false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
204 op.HandleAllReturns = true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
205 prependRetWithPatchableExit(MF, TII, op);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
206 break;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
207 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
208 case Triple::ArchType::ppc64le: {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
209 // PPC has conditional returns. Turn them into branch and plain returns.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
210 InstrumentationOptions op;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
211 op.HandleTailcall = false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
212 op.HandleAllReturns = true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
213 replaceRetWithPatchableRet(MF, TII, op);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
214 break;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
215 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
216 default: {
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
217 // For the architectures that have a single return instruction (such as
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
218 // RETQ on x86_64).
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
219 InstrumentationOptions op;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
220 op.HandleTailcall = true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
221 op.HandleAllReturns = false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
222 replaceRetWithPatchableRet(MF, TII, op);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
223 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
224 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
225 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
226 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
227 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
228
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
229 char XRayInstrumentation::ID = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
230 char &llvm::XRayInstrumentationID = XRayInstrumentation::ID;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
231 INITIALIZE_PASS_BEGIN(XRayInstrumentation, "xray-instrumentation",
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
232 "Insert XRay ops", false, false)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
233 INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
234 INITIALIZE_PASS_END(XRayInstrumentation, "xray-instrumentation",
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
235 "Insert XRay ops", false, false)