diff options
Diffstat (limited to 'dynamic-layers/clang-layer/recipes-devtools/clang/files')
3 files changed, 3030 insertions, 0 deletions
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-Enable-the-call-site-info-only-for-g-optimizations.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-Enable-the-call-site-info-only-for-g-optimizations.patch new file mode 100644 index 00000000..2e3872dc --- /dev/null +++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-Enable-the-call-site-info-only-for-g-optimizations.patch | |||
@@ -0,0 +1,550 @@ | |||
1 | From 447cb2e1b2f0d8bdcfd8a0b39f47d28de50b5d82 Mon Sep 17 00:00:00 2001 | ||
2 | From: Djordje Todorovic <djordje.todorovic@syrmia.com> | ||
3 | Date: Mon, 9 Mar 2020 11:02:35 +0100 | ||
4 | Subject: [PATCH] Enable the call site info only for -g + optimizations | ||
5 | |||
6 | Emit call site info only in the case of '-g' + 'O>0' level. | ||
7 | |||
8 | Differential Revision: https://reviews.llvm.org/D75175 | ||
9 | |||
10 | Upstream-Status: Backport [https://github.com/llvm/llvm-project/commit/c15c68abdc6f1afece637bdedba808676191a8e6] | ||
11 | Signed-off-by: Anuj Mittal <anuj.mittal@intel.com> | ||
12 | --- | ||
13 | clang/include/clang/Basic/CodeGenOptions.def | 2 ++ | ||
14 | clang/lib/CodeGen/BackendUtil.cpp | 1 + | ||
15 | clang/lib/Frontend/CompilerInvocation.cpp | 4 +++- | ||
16 | llvm/include/llvm/CodeGen/CommandFlags.inc | 7 +++++++ | ||
17 | llvm/include/llvm/Target/TargetOptions.h | 7 ++++++- | ||
18 | llvm/lib/CodeGen/MIRParser/MIRParser.cpp | 4 ++-- | ||
19 | llvm/lib/CodeGen/MachineFunction.cpp | 2 +- | ||
20 | llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp | 2 +- | ||
21 | llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 2 +- | ||
22 | llvm/lib/Target/ARM/ARMISelLowering.cpp | 2 +- | ||
23 | llvm/lib/Target/X86/X86ISelLowering.cpp | 2 +- | ||
24 | llvm/test/CodeGen/MIR/Hexagon/bundled-call-site-info.mir | 2 +- | ||
25 | llvm/test/CodeGen/X86/call-site-info-output.ll | 4 ++-- | ||
26 | llvm/test/DebugInfo/AArch64/call-site-info-output.ll | 2 +- | ||
27 | llvm/test/DebugInfo/ARM/call-site-info-output.ll | 2 +- | ||
28 | .../MIR/AArch64/dbgcall-site-interpret-movzxi.mir | 2 +- | ||
29 | .../DebugInfo/MIR/AArch64/dbgcall-site-interpretation.mir | 2 +- | ||
30 | llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-orr-moves.mir | 2 +- | ||
31 | .../test/DebugInfo/MIR/AArch64/implicit-def-dead-scope.mir | 2 +- | ||
32 | .../test/DebugInfo/MIR/ARM/dbgcall-site-interpretation.mir | 2 +- | ||
33 | .../DebugInfo/MIR/ARM/dbgcall-site-propagated-value.mir | 2 +- | ||
34 | llvm/test/DebugInfo/MIR/ARM/if-coverter-call-site-info.mir | 2 +- | ||
35 | .../MIR/Hexagon/dbgcall-site-instr-before-bundled-call.mir | 2 +- | ||
36 | .../MIR/Hexagon/live-debug-values-bundled-entry-values.mir | 2 +- | ||
37 | llvm/test/DebugInfo/MIR/SystemZ/call-site-lzer.mir | 2 +- | ||
38 | llvm/test/DebugInfo/MIR/X86/DW_OP_entry_value.mir | 2 +- | ||
39 | llvm/test/DebugInfo/MIR/X86/dbg-call-site-spilled-arg.mir | 2 +- | ||
40 | .../test/DebugInfo/MIR/X86/dbgcall-site-copy-super-sub.mir | 2 +- | ||
41 | .../test/DebugInfo/MIR/X86/dbgcall-site-interpretation.mir | 2 +- | ||
42 | .../DebugInfo/MIR/X86/dbgcall-site-lea-interpretation.mir | 2 +- | ||
43 | llvm/test/DebugInfo/MIR/X86/dbgcall-site-reference.mir | 2 +- | ||
44 | .../DebugInfo/MIR/X86/dbgcall-site-two-fwd-reg-defs.mir | 2 +- | ||
45 | llvm/test/DebugInfo/MIR/X86/dbginfo-entryvals.mir | 2 +- | ||
46 | llvm/test/DebugInfo/MIR/X86/debug-call-site-param.mir | 4 ++-- | ||
47 | .../DebugInfo/MIR/X86/entry-value-of-modified-param.mir | 2 +- | ||
48 | llvm/test/DebugInfo/MIR/X86/entry-values-diamond-bbs.mir | 2 +- | ||
49 | .../DebugInfo/MIR/X86/propagate-entry-value-cross-bbs.mir | 2 +- | ||
50 | .../test/DebugInfo/MIR/X86/unreachable-block-call-site.mir | 2 +- | ||
51 | llvm/test/DebugInfo/X86/dbgcall-site-64-bit-imms.ll | 2 +- | ||
52 | llvm/test/DebugInfo/X86/dbgcall-site-zero-valued-imms.ll | 2 +- | ||
53 | .../tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll | 2 +- | ||
54 | 41 files changed, 58 insertions(+), 41 deletions(-) | ||
55 | |||
56 | diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def | ||
57 | index 1ecae98b13b1..6a6a9465273f 100644 | ||
58 | --- a/clang/include/clang/Basic/CodeGenOptions.def | ||
59 | +++ b/clang/include/clang/Basic/CodeGenOptions.def | ||
60 | @@ -64,6 +64,8 @@ CODEGENOPT(DebugPassManager, 1, 0) ///< Prints debug information for the new | ||
61 | ///< pass manager. | ||
62 | CODEGENOPT(DisableRedZone , 1, 0) ///< Set when -mno-red-zone is enabled. | ||
63 | CODEGENOPT(EnableDebugEntryValues, 1, 0) ///< Emit call site parameter dbg info | ||
64 | +CODEGENOPT(EmitCallSiteInfo, 1, 0) ///< Emit call site info only in the case of | ||
65 | + ///< '-g' + 'O>0' level. | ||
66 | CODEGENOPT(IndirectTlsSegRefs, 1, 0) ///< Set when -mno-tls-direct-seg-refs | ||
67 | ///< is specified. | ||
68 | CODEGENOPT(DisableTailCalls , 1, 0) ///< Do not emit tail calls. | ||
69 | diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp | ||
70 | index db8fd4166d7a..db09f9b641fe 100644 | ||
71 | --- a/clang/lib/CodeGen/BackendUtil.cpp | ||
72 | +++ b/clang/lib/CodeGen/BackendUtil.cpp | ||
73 | @@ -482,6 +482,7 @@ static void initTargetOptions(llvm::TargetOptions &Options, | ||
74 | Options.EmitAddrsig = CodeGenOpts.Addrsig; | ||
75 | Options.EnableDebugEntryValues = CodeGenOpts.EnableDebugEntryValues; | ||
76 | Options.ForceDwarfFrameSection = CodeGenOpts.ForceDwarfFrameSection; | ||
77 | + Options.EmitCallSiteInfo = CodeGenOpts.EmitCallSiteInfo; | ||
78 | |||
79 | Options.MCOptions.SplitDwarfFile = CodeGenOpts.SplitDwarfFile; | ||
80 | Options.MCOptions.MCRelaxAll = CodeGenOpts.RelaxAll; | ||
81 | diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp | ||
82 | index 18fa06bf3c6d..2e73dcbdebe4 100644 | ||
83 | --- a/clang/lib/Frontend/CompilerInvocation.cpp | ||
84 | +++ b/clang/lib/Frontend/CompilerInvocation.cpp | ||
85 | @@ -789,8 +789,10 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, | ||
86 | |||
87 | llvm::Triple T(TargetOpts.Triple); | ||
88 | if (Opts.OptimizationLevel > 0 && Opts.hasReducedDebugInfo() && | ||
89 | - llvm::is_contained(DebugEntryValueArchs, T.getArch())) | ||
90 | + llvm::is_contained(DebugEntryValueArchs, T.getArch())) { | ||
91 | Opts.EnableDebugEntryValues = Args.hasArg(OPT_femit_debug_entry_values); | ||
92 | + Opts.EmitCallSiteInfo = true; | ||
93 | + } | ||
94 | |||
95 | Opts.DisableO0ImplyOptNone = Args.hasArg(OPT_disable_O0_optnone); | ||
96 | Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone); | ||
97 | diff --git a/llvm/include/llvm/CodeGen/CommandFlags.inc b/llvm/include/llvm/CodeGen/CommandFlags.inc | ||
98 | index 6475a5b19edb..36073fe9cc98 100644 | ||
99 | --- a/llvm/include/llvm/CodeGen/CommandFlags.inc | ||
100 | +++ b/llvm/include/llvm/CodeGen/CommandFlags.inc | ||
101 | @@ -286,6 +286,12 @@ static cl::opt<bool> | ||
102 | EnableAddrsig("addrsig", cl::desc("Emit an address-significance table"), | ||
103 | cl::init(false)); | ||
104 | |||
105 | +static cl::opt<bool> EmitCallSiteInfo( | ||
106 | + "emit-call-site-info", | ||
107 | + cl::desc( | ||
108 | + "Emit call site debug information, if debug information is enabled."), | ||
109 | + cl::init(false)); | ||
110 | + | ||
111 | static cl::opt<bool> | ||
112 | EnableDebugEntryValues("debug-entry-values", | ||
113 | cl::desc("Emit debug info about parameter's entry values"), | ||
114 | @@ -349,6 +355,7 @@ static TargetOptions InitTargetOptionsFromCodeGenFlags() { | ||
115 | Options.ExceptionModel = ExceptionModel; | ||
116 | Options.EmitStackSizeSection = EnableStackSizeSection; | ||
117 | Options.EmitAddrsig = EnableAddrsig; | ||
118 | + Options.EmitCallSiteInfo = EmitCallSiteInfo; | ||
119 | Options.EnableDebugEntryValues = EnableDebugEntryValues; | ||
120 | Options.ForceDwarfFrameSection = ForceDwarfFrameSection; | ||
121 | |||
122 | diff --git a/llvm/include/llvm/Target/TargetOptions.h b/llvm/include/llvm/Target/TargetOptions.h | ||
123 | index d27c7b0178f0..9378e290bed1 100644 | ||
124 | --- a/llvm/include/llvm/Target/TargetOptions.h | ||
125 | +++ b/llvm/include/llvm/Target/TargetOptions.h | ||
126 | @@ -134,7 +134,8 @@ namespace llvm { | ||
127 | EmulatedTLS(false), ExplicitEmulatedTLS(false), EnableIPRA(false), | ||
128 | EmitStackSizeSection(false), EnableMachineOutliner(false), | ||
129 | SupportsDefaultOutlining(false), EmitAddrsig(false), | ||
130 | - EnableDebugEntryValues(false), ForceDwarfFrameSection(false) {} | ||
131 | + EmitCallSiteInfo(false), EnableDebugEntryValues(false), | ||
132 | + ForceDwarfFrameSection(false) {} | ||
133 | |||
134 | /// PrintMachineCode - This flag is enabled when the -print-machineinstrs | ||
135 | /// option is specified on the command line, and should enable debugging | ||
136 | @@ -281,6 +282,10 @@ namespace llvm { | ||
137 | /// to selectively generate basic block sections. | ||
138 | std::shared_ptr<MemoryBuffer> BBSectionsFuncListBuf; | ||
139 | |||
140 | + /// The flag enables call site info production. It is used only for debug | ||
141 | + /// info, and it is restricted only to optimized code. This can be used for | ||
142 | + /// something else, so that should be controlled in the frontend. | ||
143 | + unsigned EmitCallSiteInfo : 1; | ||
144 | /// Emit debug info about parameter's entry values. | ||
145 | unsigned EnableDebugEntryValues : 1; | ||
146 | |||
147 | diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp | ||
148 | index 10157c746b46..f955bdc6186a 100644 | ||
149 | --- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp | ||
150 | +++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp | ||
151 | @@ -381,11 +381,11 @@ bool MIRParserImpl::initializeCallSiteInfo( | ||
152 | CSInfo.emplace_back(Reg, ArgRegPair.ArgNo); | ||
153 | } | ||
154 | |||
155 | - if (TM.Options.EnableDebugEntryValues) | ||
156 | + if (TM.Options.EmitCallSiteInfo) | ||
157 | MF.addCallArgsForwardingRegs(&*CallI, std::move(CSInfo)); | ||
158 | } | ||
159 | |||
160 | - if (YamlMF.CallSitesInfo.size() && !TM.Options.EnableDebugEntryValues) | ||
161 | + if (YamlMF.CallSitesInfo.size() && !TM.Options.EmitCallSiteInfo) | ||
162 | return error(Twine("Call site info provided but not used")); | ||
163 | return false; | ||
164 | } | ||
165 | diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp | ||
166 | index 4612690644fe..c3795b7ed314 100644 | ||
167 | --- a/llvm/lib/CodeGen/MachineFunction.cpp | ||
168 | +++ b/llvm/lib/CodeGen/MachineFunction.cpp | ||
169 | @@ -855,7 +855,7 @@ MachineFunction::CallSiteInfoMap::iterator | ||
170 | MachineFunction::getCallSiteInfo(const MachineInstr *MI) { | ||
171 | assert(MI->isCall() && "Call site info refers only to call instructions!"); | ||
172 | |||
173 | - if (!Target.Options.EnableDebugEntryValues) | ||
174 | + if (!Target.Options.EmitCallSiteInfo) | ||
175 | return CallSitesInfo.end(); | ||
176 | return CallSitesInfo.find(MI); | ||
177 | } | ||
178 | diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp | ||
179 | index 0e4d783e3505..52099f24aca5 100644 | ||
180 | --- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp | ||
181 | +++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp | ||
182 | @@ -863,7 +863,7 @@ EmitSchedule(MachineBasicBlock::iterator &InsertPos) { | ||
183 | MI = &*std::next(Before); | ||
184 | } | ||
185 | |||
186 | - if (MI->isCall() && DAG->getTarget().Options.EnableDebugEntryValues) | ||
187 | + if (MI->isCall() && DAG->getTarget().Options.EmitCallSiteInfo) | ||
188 | MF.addCallArgsForwardingRegs(MI, DAG->getSDCallSiteInfo(Node)); | ||
189 | |||
190 | return MI; | ||
191 | diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | ||
192 | index 23f05eaad944..63ff3031a5e8 100644 | ||
193 | --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | ||
194 | +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | ||
195 | @@ -4132,7 +4132,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI, | ||
196 | RegsToPass.emplace_back(VA.getLocReg(), Arg); | ||
197 | RegsUsed.insert(VA.getLocReg()); | ||
198 | const TargetOptions &Options = DAG.getTarget().Options; | ||
199 | - if (Options.EnableDebugEntryValues) | ||
200 | + if (Options.EmitCallSiteInfo) | ||
201 | CSInfo.emplace_back(VA.getLocReg(), i); | ||
202 | } | ||
203 | } else { | ||
204 | diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp | ||
205 | index 9f504b1eaa42..5589ba34a2ac 100644 | ||
206 | --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp | ||
207 | +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp | ||
208 | @@ -2222,7 +2222,7 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, | ||
209 | isThisReturn = true; | ||
210 | } | ||
211 | const TargetOptions &Options = DAG.getTarget().Options; | ||
212 | - if (Options.EnableDebugEntryValues) | ||
213 | + if (Options.EmitCallSiteInfo) | ||
214 | CSInfo.emplace_back(VA.getLocReg(), i); | ||
215 | RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg)); | ||
216 | } else if (isByVal) { | ||
217 | diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp | ||
218 | index d5de94aeb8a2..4808bdf6ddc2 100644 | ||
219 | --- a/llvm/lib/Target/X86/X86ISelLowering.cpp | ||
220 | +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp | ||
221 | @@ -4030,7 +4030,7 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, | ||
222 | } else if (VA.isRegLoc()) { | ||
223 | RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg)); | ||
224 | const TargetOptions &Options = DAG.getTarget().Options; | ||
225 | - if (Options.EnableDebugEntryValues) | ||
226 | + if (Options.EmitCallSiteInfo) | ||
227 | CSInfo.emplace_back(VA.getLocReg(), I); | ||
228 | if (isVarArg && IsWin64) { | ||
229 | // Win64 ABI requires argument XMM reg to be copied to the corresponding | ||
230 | diff --git a/llvm/test/CodeGen/MIR/Hexagon/bundled-call-site-info.mir b/llvm/test/CodeGen/MIR/Hexagon/bundled-call-site-info.mir | ||
231 | index 5ffa0293a2e1..fec542223fc9 100644 | ||
232 | --- a/llvm/test/CodeGen/MIR/Hexagon/bundled-call-site-info.mir | ||
233 | +++ b/llvm/test/CodeGen/MIR/Hexagon/bundled-call-site-info.mir | ||
234 | @@ -1,4 +1,4 @@ | ||
235 | -# RUN: llc -debug-entry-values -run-pass=none -verify-machineinstrs -o - %s | FileCheck %s | ||
236 | +# RUN: llc -emit-call-site-info -debug-entry-values -run-pass=none -verify-machineinstrs -o - %s | FileCheck %s | ||
237 | |||
238 | # Verify that it is possible to read and write MIR where a callSites entry | ||
239 | # points to a call residing in a bundle. The offset should point to the call | ||
240 | diff --git a/llvm/test/CodeGen/X86/call-site-info-output.ll b/llvm/test/CodeGen/X86/call-site-info-output.ll | ||
241 | index 4b1e236aadfe..a0438f0c2b98 100644 | ||
242 | --- a/llvm/test/CodeGen/X86/call-site-info-output.ll | ||
243 | +++ b/llvm/test/CodeGen/X86/call-site-info-output.ll | ||
244 | @@ -1,6 +1,6 @@ | ||
245 | ; Test call site info MIR printer and parser.Parser assertions and machine | ||
246 | ; verifier will check the rest; | ||
247 | -; RUN: llc -debug-entry-values %s -stop-before=finalize-isel -o %t.mir | ||
248 | +; RUN: llc -emit-call-site-info -debug-entry-values %s -stop-before=finalize-isel -o %t.mir | ||
249 | ; RUN: cat %t.mir | FileCheck %s | ||
250 | ; CHECK: name: fn2 | ||
251 | ; CHECK: callSites: | ||
252 | @@ -10,7 +10,7 @@ | ||
253 | ; CHECK-NEXT: arg: 0, reg: '$edi' | ||
254 | ; CHECK-NEXT: arg: 1, reg: '$esi' | ||
255 | ; CHECK-NEXT: arg: 2, reg: '$edx' | ||
256 | -; RUN: llc -debug-entry-values %t.mir -run-pass=finalize-isel -o -| FileCheck %s --check-prefix=PARSER | ||
257 | +; RUN: llc -emit-call-site-info -debug-entry-values %t.mir -run-pass=finalize-isel -o -| FileCheck %s --check-prefix=PARSER | ||
258 | ; Verify that we are able to parse output mir and that we are getting the same result. | ||
259 | ; PARSER: name: fn2 | ||
260 | ; PARSER: callSites: | ||
261 | diff --git a/llvm/test/DebugInfo/AArch64/call-site-info-output.ll b/llvm/test/DebugInfo/AArch64/call-site-info-output.ll | ||
262 | index d52d6962f3c4..17d9f7f18762 100644 | ||
263 | --- a/llvm/test/DebugInfo/AArch64/call-site-info-output.ll | ||
264 | +++ b/llvm/test/DebugInfo/AArch64/call-site-info-output.ll | ||
265 | @@ -1,4 +1,4 @@ | ||
266 | -; RUN: llc -mtriple aarch64-linux-gnu -debug-entry-values %s -o - -stop-before=finalize-isel | FileCheck %s | ||
267 | +; RUN: llc -emit-call-site-info -mtriple aarch64-linux-gnu -debug-entry-values %s -o - -stop-before=finalize-isel | FileCheck %s | ||
268 | ; Verify that Selection DAG knows how to recognize simple function parameter forwarding registers. | ||
269 | ; Produced from: | ||
270 | ; extern int fn1(int,int,int); | ||
271 | diff --git a/llvm/test/DebugInfo/ARM/call-site-info-output.ll b/llvm/test/DebugInfo/ARM/call-site-info-output.ll | ||
272 | index 9255a7d57dde..ed726dfe753f 100644 | ||
273 | --- a/llvm/test/DebugInfo/ARM/call-site-info-output.ll | ||
274 | +++ b/llvm/test/DebugInfo/ARM/call-site-info-output.ll | ||
275 | @@ -1,4 +1,4 @@ | ||
276 | -; RUN: llc -mtriple arm-linux-gnu -debug-entry-values %s -o - -stop-before=finalize-isel | FileCheck %s | ||
277 | +; RUN: llc -emit-call-site-info -mtriple arm-linux-gnu -debug-entry-values %s -o - -stop-before=finalize-isel | FileCheck %s | ||
278 | ; Verify that Selection DAG knows how to recognize simple function parameter forwarding registers. | ||
279 | ; Produced from: | ||
280 | ; extern int fn1(int,int,int); | ||
281 | diff --git a/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-interpret-movzxi.mir b/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-interpret-movzxi.mir | ||
282 | index dc7561ca6400..057779a90721 100644 | ||
283 | --- a/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-interpret-movzxi.mir | ||
284 | +++ b/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-interpret-movzxi.mir | ||
285 | @@ -1,4 +1,4 @@ | ||
286 | -# RUN: llc -mtriple aarch64-linux-gnu -debug-entry-values -start-after=machineverifier -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
287 | +# RUN: llc -emit-call-site-info -mtriple aarch64-linux-gnu -debug-entry-values -start-after=machineverifier -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
288 | # | ||
289 | # Based on the following C reproducer: | ||
290 | # | ||
291 | diff --git a/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-interpretation.mir b/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-interpretation.mir | ||
292 | index 0371ccef603e..d925bc395878 100644 | ||
293 | --- a/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-interpretation.mir | ||
294 | +++ b/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-interpretation.mir | ||
295 | @@ -1,4 +1,4 @@ | ||
296 | -# RUN: llc -mtriple aarch64-linux-gnu -debug-entry-values -start-after=machineverifier -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
297 | +# RUN: llc -emit-call-site-info -mtriple aarch64-linux-gnu -debug-entry-values -start-after=machineverifier -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
298 | # Following code is used for producing this test case. Note that | ||
299 | # some of argument loading instruction are modified in order to | ||
300 | # cover certain cases. | ||
301 | diff --git a/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-orr-moves.mir b/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-orr-moves.mir | ||
302 | index 916a14022ba5..4a87dad3b9b5 100644 | ||
303 | --- a/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-orr-moves.mir | ||
304 | +++ b/llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-orr-moves.mir | ||
305 | @@ -1,4 +1,4 @@ | ||
306 | -# RUN: llc -debug-entry-values -start-after=livedebugvalues -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s | ||
307 | +# RUN: llc -emit-call-site-info -debug-entry-values -start-after=livedebugvalues -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s | ||
308 | |||
309 | # Based on the following C reproducer: | ||
310 | # | ||
311 | diff --git a/llvm/test/DebugInfo/MIR/AArch64/implicit-def-dead-scope.mir b/llvm/test/DebugInfo/MIR/AArch64/implicit-def-dead-scope.mir | ||
312 | index fbf9b3454689..d85f2d25391d 100644 | ||
313 | --- a/llvm/test/DebugInfo/MIR/AArch64/implicit-def-dead-scope.mir | ||
314 | +++ b/llvm/test/DebugInfo/MIR/AArch64/implicit-def-dead-scope.mir | ||
315 | @@ -1,4 +1,4 @@ | ||
316 | -# RUN: llc -start-after=livedebugvalues -filetype=obj -o - %s \ | ||
317 | +# RUN: llc -emit-call-site-info -start-after=livedebugvalues -filetype=obj -o - %s \ | ||
318 | # RUN: | llvm-dwarfdump -v - | FileCheck %s | ||
319 | |||
320 | # This tests for a crash in DwarfDebug's singular DBG_VALUE range promotion when | ||
321 | diff --git a/llvm/test/DebugInfo/MIR/ARM/dbgcall-site-interpretation.mir b/llvm/test/DebugInfo/MIR/ARM/dbgcall-site-interpretation.mir | ||
322 | index ce8dc97f0e72..0ae4e6ec485c 100644 | ||
323 | --- a/llvm/test/DebugInfo/MIR/ARM/dbgcall-site-interpretation.mir | ||
324 | +++ b/llvm/test/DebugInfo/MIR/ARM/dbgcall-site-interpretation.mir | ||
325 | @@ -1,4 +1,4 @@ | ||
326 | -# RUN: llc -mtriple=arm-linux-gnueabi -debug-entry-values -filetype=obj -start-after=machineverifier %s -o -| llvm-dwarfdump -| FileCheck %s | ||
327 | +# RUN: llc -emit-call-site-info -mtriple=arm-linux-gnueabi -debug-entry-values -filetype=obj -start-after=machineverifier %s -o -| llvm-dwarfdump -| FileCheck %s | ||
328 | # Following code is used for producing this test case. Note that | ||
329 | # some of argument loading instruction are modified in order to | ||
330 | # cover certain cases. | ||
331 | diff --git a/llvm/test/DebugInfo/MIR/ARM/dbgcall-site-propagated-value.mir b/llvm/test/DebugInfo/MIR/ARM/dbgcall-site-propagated-value.mir | ||
332 | index 9001c8ba8eea..5b84d9e9627f 100644 | ||
333 | --- a/llvm/test/DebugInfo/MIR/ARM/dbgcall-site-propagated-value.mir | ||
334 | +++ b/llvm/test/DebugInfo/MIR/ARM/dbgcall-site-propagated-value.mir | ||
335 | @@ -1,4 +1,4 @@ | ||
336 | -# RUN: llc -debug-entry-values -run-pass=livedebugvalues -o - %s | FileCheck %s | ||
337 | +# RUN: llc -emit-call-site-info -debug-entry-values -run-pass=livedebugvalues -o - %s | FileCheck %s | ||
338 | |||
339 | # Based on the following C reproducer: | ||
340 | # | ||
341 | diff --git a/llvm/test/DebugInfo/MIR/ARM/if-coverter-call-site-info.mir b/llvm/test/DebugInfo/MIR/ARM/if-coverter-call-site-info.mir | ||
342 | index aa7b54c1e5bb..11e9c4c90836 100644 | ||
343 | --- a/llvm/test/DebugInfo/MIR/ARM/if-coverter-call-site-info.mir | ||
344 | +++ b/llvm/test/DebugInfo/MIR/ARM/if-coverter-call-site-info.mir | ||
345 | @@ -1,4 +1,4 @@ | ||
346 | -# RUN: llc -mtriple=arm-linux-gnu -debug-entry-values -run-pass if-converter %s -o -| FileCheck %s | ||
347 | +# RUN: llc -emit-call-site-info -mtriple=arm-linux-gnu -debug-entry-values -run-pass if-converter %s -o -| FileCheck %s | ||
348 | |||
349 | # Vefify that the call site info will be updated after the optimization. | ||
350 | # This test case would previously trigger an assertion when | ||
351 | diff --git a/llvm/test/DebugInfo/MIR/Hexagon/dbgcall-site-instr-before-bundled-call.mir b/llvm/test/DebugInfo/MIR/Hexagon/dbgcall-site-instr-before-bundled-call.mir | ||
352 | index 8ae628af2c09..3ae23d4189bf 100644 | ||
353 | --- a/llvm/test/DebugInfo/MIR/Hexagon/dbgcall-site-instr-before-bundled-call.mir | ||
354 | +++ b/llvm/test/DebugInfo/MIR/Hexagon/dbgcall-site-instr-before-bundled-call.mir | ||
355 | @@ -1,4 +1,4 @@ | ||
356 | -# RUN: llc -mtriple hexagon -debug-entry-values -start-after=machineverifier -filetype=obj %s -o - | llvm-dwarfdump - | FileCheck %s | ||
357 | +# RUN: llc -mtriple hexagon -emit-call-site-info -debug-entry-values -start-after=machineverifier -filetype=obj %s -o - | llvm-dwarfdump - | FileCheck %s | ||
358 | |||
359 | # Based on the following C reproducer: | ||
360 | # | ||
361 | diff --git a/llvm/test/DebugInfo/MIR/Hexagon/live-debug-values-bundled-entry-values.mir b/llvm/test/DebugInfo/MIR/Hexagon/live-debug-values-bundled-entry-values.mir | ||
362 | index ff0a539dd15d..8bb0b3202acd 100644 | ||
363 | --- a/llvm/test/DebugInfo/MIR/Hexagon/live-debug-values-bundled-entry-values.mir | ||
364 | +++ b/llvm/test/DebugInfo/MIR/Hexagon/live-debug-values-bundled-entry-values.mir | ||
365 | @@ -1,4 +1,4 @@ | ||
366 | -# RUN: llc -debug-entry-values -run-pass=livedebugvalues -o - %s | FileCheck %s | ||
367 | +# RUN: llc -emit-call-site-info -debug-entry-values -run-pass=livedebugvalues -o - %s | FileCheck %s | ||
368 | |||
369 | # Verify that the entry values for the input parameters are inserted after the | ||
370 | # bundles which contains the registers' clobbering instructions (the calls to | ||
371 | diff --git a/llvm/test/DebugInfo/MIR/SystemZ/call-site-lzer.mir b/llvm/test/DebugInfo/MIR/SystemZ/call-site-lzer.mir | ||
372 | index 8a4e8b5632c2..3cf41467f7f9 100644 | ||
373 | --- a/llvm/test/DebugInfo/MIR/SystemZ/call-site-lzer.mir | ||
374 | +++ b/llvm/test/DebugInfo/MIR/SystemZ/call-site-lzer.mir | ||
375 | @@ -1,4 +1,4 @@ | ||
376 | -# RUN: llc -debug-entry-values -start-after=livedebugvalues -o - %s | FileCheck %s | ||
377 | +# RUN: llc -emit-call-site-info -debug-entry-values -start-after=livedebugvalues -o - %s | FileCheck %s | ||
378 | |||
379 | # This test would previously trigger an assertion when trying to describe the | ||
380 | # call site value for callee()'s float parameter. | ||
381 | diff --git a/llvm/test/DebugInfo/MIR/X86/DW_OP_entry_value.mir b/llvm/test/DebugInfo/MIR/X86/DW_OP_entry_value.mir | ||
382 | index e6fe5d2de878..4e5a07321d42 100644 | ||
383 | --- a/llvm/test/DebugInfo/MIR/X86/DW_OP_entry_value.mir | ||
384 | +++ b/llvm/test/DebugInfo/MIR/X86/DW_OP_entry_value.mir | ||
385 | @@ -1,4 +1,4 @@ | ||
386 | -# RUN: llc -debug-entry-values -start-before=livedebugvalues -mtriple=x86_64-apple-darwin -o %t %s -filetype=obj | ||
387 | +# RUN: llc -emit-call-site-info -debug-entry-values -start-before=livedebugvalues -mtriple=x86_64-apple-darwin -o %t %s -filetype=obj | ||
388 | # RUN: llvm-dwarfdump %t | FileCheck %s | ||
389 | # | ||
390 | # int global; | ||
391 | diff --git a/llvm/test/DebugInfo/MIR/X86/dbg-call-site-spilled-arg.mir b/llvm/test/DebugInfo/MIR/X86/dbg-call-site-spilled-arg.mir | ||
392 | index c32a1155d038..edeef2c7aed4 100644 | ||
393 | --- a/llvm/test/DebugInfo/MIR/X86/dbg-call-site-spilled-arg.mir | ||
394 | +++ b/llvm/test/DebugInfo/MIR/X86/dbg-call-site-spilled-arg.mir | ||
395 | @@ -1,6 +1,6 @@ | ||
396 | # Check that llvm can describe a call site parameter which resides in a spill slot. | ||
397 | # | ||
398 | -# RUN: llc -debug-entry-values -start-after=machineverifier -filetype=obj %s -o - | llvm-dwarfdump - | FileCheck %s | ||
399 | +# RUN: llc -emit-call-site-info -debug-entry-values -start-after=machineverifier -filetype=obj %s -o - | llvm-dwarfdump - | FileCheck %s | ||
400 | # | ||
401 | # Command: | ||
402 | # $ ~/src/builds/llvm-project-master-RA/bin/clang -g -Xclang -femit-debug-entry-values -O2 -c -o spill.o spill.cc -mllvm -stop-before=machineverifier -o spill.mir | ||
403 | diff --git a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-copy-super-sub.mir b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-copy-super-sub.mir | ||
404 | index a2d51a203512..01a2b887a60b 100644 | ||
405 | --- a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-copy-super-sub.mir | ||
406 | +++ b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-copy-super-sub.mir | ||
407 | @@ -1,4 +1,4 @@ | ||
408 | -# RUN: llc -debug-entry-values -start-after=livedebugvalues -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
409 | +# RUN: llc -emit-call-site-info -debug-entry-values -start-after=livedebugvalues -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
410 | |||
411 | # Based on the following reproducer: | ||
412 | # | ||
413 | diff --git a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-interpretation.mir b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-interpretation.mir | ||
414 | index f9e9459f1abd..104bc0146798 100644 | ||
415 | --- a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-interpretation.mir | ||
416 | +++ b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-interpretation.mir | ||
417 | @@ -1,4 +1,4 @@ | ||
418 | -# RUN: llc -debug-entry-values -start-after=machineverifier -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
419 | +# RUN: llc -emit-call-site-info -debug-entry-values -start-after=machineverifier -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
420 | # | ||
421 | # CHECK: DW_TAG_GNU_call_site | ||
422 | # CHECK-NEXT: DW_AT_abstract_origin {{.*}} "foo" | ||
423 | diff --git a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-lea-interpretation.mir b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-lea-interpretation.mir | ||
424 | index 1bb70f6d4530..4d88fa9aab74 100644 | ||
425 | --- a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-lea-interpretation.mir | ||
426 | +++ b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-lea-interpretation.mir | ||
427 | @@ -1,4 +1,4 @@ | ||
428 | -# RUN: llc -debug-entry-values -start-after=machineverifier -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
429 | +# RUN: llc -emit-call-site-info -debug-entry-values -start-after=machineverifier -filetype=obj %s -o -| llvm-dwarfdump -| FileCheck %s | ||
430 | # CHECK: DW_TAG_GNU_call_site | ||
431 | # CHECK-NEXT: DW_AT_abstract_origin {{.*}} "foo") | ||
432 | # CHECK-NEXT: DW_AT_low_pc {{.*}} | ||
433 | diff --git a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-reference.mir b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-reference.mir | ||
434 | index 235787573f51..81af598ba194 100644 | ||
435 | --- a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-reference.mir | ||
436 | +++ b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-reference.mir | ||
437 | @@ -1,4 +1,4 @@ | ||
438 | -# RUN: llc -debug-entry-values -start-before=livedebugvalues -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s | ||
439 | +# RUN: llc -emit-call-site-info -debug-entry-values -start-before=livedebugvalues -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s | ||
440 | |||
441 | # Based on the following C++ code: | ||
442 | # struct A { A(A &) {} }; | ||
443 | diff --git a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-two-fwd-reg-defs.mir b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-two-fwd-reg-defs.mir | ||
444 | index db0934c595c3..46adedd1be44 100644 | ||
445 | --- a/llvm/test/DebugInfo/MIR/X86/dbgcall-site-two-fwd-reg-defs.mir | ||
446 | +++ b/llvm/test/DebugInfo/MIR/X86/dbgcall-site-two-fwd-reg-defs.mir | ||
447 | @@ -1,4 +1,4 @@ | ||
448 | -# RUN: llc -O1 -debug-entry-values -start-after=livedebugvalues -filetype=obj %s -o - | llvm-dwarfdump - | FileCheck %s | ||
449 | +# RUN: llc -O1 -emit-call-site-info -debug-entry-values -start-after=livedebugvalues -filetype=obj %s -o - | llvm-dwarfdump - | FileCheck %s | ||
450 | |||
451 | # Based on the following C reproducer: | ||
452 | # | ||
453 | diff --git a/llvm/test/DebugInfo/MIR/X86/dbginfo-entryvals.mir b/llvm/test/DebugInfo/MIR/X86/dbginfo-entryvals.mir | ||
454 | index 5d203029936e..1d7b64f169d1 100644 | ||
455 | --- a/llvm/test/DebugInfo/MIR/X86/dbginfo-entryvals.mir | ||
456 | +++ b/llvm/test/DebugInfo/MIR/X86/dbginfo-entryvals.mir | ||
457 | @@ -1,4 +1,4 @@ | ||
458 | -# RUN: llc -debug-entry-values -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s | ||
459 | +# RUN: llc -emit-call-site-info -debug-entry-values -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s | ||
460 | # | ||
461 | #extern void fn2(int); | ||
462 | # | ||
463 | diff --git a/llvm/test/DebugInfo/MIR/X86/debug-call-site-param.mir b/llvm/test/DebugInfo/MIR/X86/debug-call-site-param.mir | ||
464 | index e79be66cd4e3..c39bc4db50be 100644 | ||
465 | --- a/llvm/test/DebugInfo/MIR/X86/debug-call-site-param.mir | ||
466 | +++ b/llvm/test/DebugInfo/MIR/X86/debug-call-site-param.mir | ||
467 | @@ -2,8 +2,8 @@ | ||
468 | # When the debugger tuning is set to gdb, use GNU opcodes. | ||
469 | # For lldb, use the standard DWARF5 opcodes. | ||
470 | |||
471 | -# RUN: llc -debug-entry-values -debugger-tune=gdb -filetype=obj -mtriple=x86_64-unknown-unknown -start-after=machineverifier -o - %s | llvm-dwarfdump - | FileCheck %s -check-prefixes=CHECK-GNU | ||
472 | -# RUN: llc -debug-entry-values -debugger-tune=lldb -filetype=obj -mtriple=x86_64-unknown-unknown -start-after=machineverifier -o - %s | llvm-dwarfdump - | FileCheck %s -check-prefixes=CHECK-DWARF5 | ||
473 | +# RUN: llc -emit-call-site-info -debug-entry-values -debugger-tune=gdb -filetype=obj -mtriple=x86_64-unknown-unknown -start-after=machineverifier -o - %s | llvm-dwarfdump - | FileCheck %s -check-prefixes=CHECK-GNU | ||
474 | +# RUN: llc -emit-call-site-info -debug-entry-values -debugger-tune=lldb -filetype=obj -mtriple=x86_64-unknown-unknown -start-after=machineverifier -o - %s | llvm-dwarfdump - | FileCheck %s -check-prefixes=CHECK-DWARF5 | ||
475 | # | ||
476 | # extern void foo(int *a, int b, int c, int d, int e, int f); | ||
477 | # extern int getVal(); | ||
478 | diff --git a/llvm/test/DebugInfo/MIR/X86/entry-value-of-modified-param.mir b/llvm/test/DebugInfo/MIR/X86/entry-value-of-modified-param.mir | ||
479 | index 8d121c3a30b9..c7f15aaaa562 100644 | ||
480 | --- a/llvm/test/DebugInfo/MIR/X86/entry-value-of-modified-param.mir | ||
481 | +++ b/llvm/test/DebugInfo/MIR/X86/entry-value-of-modified-param.mir | ||
482 | @@ -1,4 +1,4 @@ | ||
483 | -# RUN: llc -debug-entry-values -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s | ||
484 | +# RUN: llc -emit-call-site-info -debug-entry-values -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s | ||
485 | # | ||
486 | #extern void fn1 (int, int, int); | ||
487 | # | ||
488 | diff --git a/llvm/test/DebugInfo/MIR/X86/entry-values-diamond-bbs.mir b/llvm/test/DebugInfo/MIR/X86/entry-values-diamond-bbs.mir | ||
489 | index 2396daada876..aa8fdd7afd47 100644 | ||
490 | --- a/llvm/test/DebugInfo/MIR/X86/entry-values-diamond-bbs.mir | ||
491 | +++ b/llvm/test/DebugInfo/MIR/X86/entry-values-diamond-bbs.mir | ||
492 | @@ -1,4 +1,4 @@ | ||
493 | -# RUN: llc -debug-entry-values -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s | ||
494 | +# RUN: llc -emit-call-site-info -debug-entry-values -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s | ||
495 | # | ||
496 | # The test case was artificially adjusted, in order to make proper diamond basic | ||
497 | # block structure relevant to the debug entry values propagation. | ||
498 | diff --git a/llvm/test/DebugInfo/MIR/X86/propagate-entry-value-cross-bbs.mir b/llvm/test/DebugInfo/MIR/X86/propagate-entry-value-cross-bbs.mir | ||
499 | index 86b1cddaa462..c5af863954bf 100644 | ||
500 | --- a/llvm/test/DebugInfo/MIR/X86/propagate-entry-value-cross-bbs.mir | ||
501 | +++ b/llvm/test/DebugInfo/MIR/X86/propagate-entry-value-cross-bbs.mir | ||
502 | @@ -1,4 +1,4 @@ | ||
503 | -# RUN: llc -debug-entry-values -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s | ||
504 | +# RUN: llc -emit-call-site-info -debug-entry-values -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s | ||
505 | # | ||
506 | #extern void fn1 (int, int, int); | ||
507 | #__attribute__((noinline)) | ||
508 | diff --git a/llvm/test/DebugInfo/MIR/X86/unreachable-block-call-site.mir b/llvm/test/DebugInfo/MIR/X86/unreachable-block-call-site.mir | ||
509 | index d282d796f6d7..ea9c12b5a192 100644 | ||
510 | --- a/llvm/test/DebugInfo/MIR/X86/unreachable-block-call-site.mir | ||
511 | +++ b/llvm/test/DebugInfo/MIR/X86/unreachable-block-call-site.mir | ||
512 | @@ -1,4 +1,4 @@ | ||
513 | -# RUN: llc -mtriple=x86_64-pc-linux -debug-entry-values -run-pass=unreachable-mbb-elimination -o - %s | FileCheck %s | ||
514 | +# RUN: llc -mtriple=x86_64-pc-linux -emit-call-site-info -debug-entry-values -run-pass=unreachable-mbb-elimination -o - %s | FileCheck %s | ||
515 | |||
516 | # Verify that the call site information for the call residing in the eliminated | ||
517 | # block is removed. This test case would previously trigger an assertion when | ||
518 | diff --git a/llvm/test/DebugInfo/X86/dbgcall-site-64-bit-imms.ll b/llvm/test/DebugInfo/X86/dbgcall-site-64-bit-imms.ll | ||
519 | index b698f1cdbfe8..b8cd9574cc63 100644 | ||
520 | --- a/llvm/test/DebugInfo/X86/dbgcall-site-64-bit-imms.ll | ||
521 | +++ b/llvm/test/DebugInfo/X86/dbgcall-site-64-bit-imms.ll | ||
522 | @@ -1,4 +1,4 @@ | ||
523 | -; RUN: llc -O1 -debug-entry-values -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s | ||
524 | +; RUN: llc -O1 -emit-call-site-info -debug-entry-values -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s | ||
525 | |||
526 | ; Verify that the 64-bit call site immediates are not truncated. | ||
527 | ; | ||
528 | diff --git a/llvm/test/DebugInfo/X86/dbgcall-site-zero-valued-imms.ll b/llvm/test/DebugInfo/X86/dbgcall-site-zero-valued-imms.ll | ||
529 | index 9fe67f82a2b4..5d37774f55d6 100644 | ||
530 | --- a/llvm/test/DebugInfo/X86/dbgcall-site-zero-valued-imms.ll | ||
531 | +++ b/llvm/test/DebugInfo/X86/dbgcall-site-zero-valued-imms.ll | ||
532 | @@ -1,4 +1,4 @@ | ||
533 | -; RUN: llc -O3 -debug-entry-values -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s | ||
534 | +; RUN: llc -O3 -emit-call-site-info -debug-entry-values -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s | ||
535 | |||
536 | target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | ||
537 | target triple = "x86_64-unknown-linux-gnu" | ||
538 | diff --git a/llvm/test/tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll b/llvm/test/tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll | ||
539 | index c304e9d768a5..d126757398ff 100644 | ||
540 | --- a/llvm/test/tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll | ||
541 | +++ b/llvm/test/tools/llvm-dwarfdump/X86/stats-dbg-callsite-info.ll | ||
542 | @@ -1,4 +1,4 @@ | ||
543 | -; RUN: llc -debug-entry-values %s -o - -filetype=obj \ | ||
544 | +; RUN: llc -emit-call-site-info -debug-entry-values %s -o - -filetype=obj \ | ||
545 | ; RUN: | llvm-dwarfdump -statistics - | FileCheck %s | ||
546 | ; | ||
547 | ; The LLVM IR file was generated on this source code by using | ||
548 | -- | ||
549 | 2.33.1 | ||
550 | |||
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-Replace-MCTargetOptionsCommandFlags.inc-and-CommandF.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-Replace-MCTargetOptionsCommandFlags.inc-and-CommandF.patch new file mode 100644 index 00000000..6b2db931 --- /dev/null +++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-Replace-MCTargetOptionsCommandFlags.inc-and-CommandF.patch | |||
@@ -0,0 +1,2243 @@ | |||
1 | From fd7146658e3b4ce045dfb332c2edf216f76c1e1f Mon Sep 17 00:00:00 2001 | ||
2 | From: serge-sans-paille <sguelton@redhat.com> | ||
3 | Date: Wed, 4 Mar 2020 00:47:43 +0100 | ||
4 | Subject: [PATCH] Replace MCTargetOptionsCommandFlags.inc and CommandFlags.inc | ||
5 | by runtime registration | ||
6 | |||
7 | MCTargetOptionsCommandFlags.inc and CommandFlags.inc are headers which contain | ||
8 | cl::opt with static storage. | ||
9 | These headers are meant to be incuded by tools to make it easier to parametrize | ||
10 | codegen/mc. | ||
11 | |||
12 | However, these headers are also included in at least two libraries: lldCommon | ||
13 | and handle-llvm. As a result, when creating DYLIB, clang-cpp holds a reference | ||
14 | to the options, and lldCommon holds another reference. Linking the two in a | ||
15 | single executable, as zig does[0], results in a double registration. | ||
16 | |||
17 | This patch explores an other approach: the .inc files are moved to regular | ||
18 | files, and the registration happens on-demand through static declaration of | ||
19 | options in the constructor of a static object. | ||
20 | |||
21 | [0] https://bugzilla.redhat.com/show_bug.cgi?id=1756977#c5 | ||
22 | |||
23 | Differential Revision: https://reviews.llvm.org/D75579 | ||
24 | |||
25 | Upstream-Status: Backport | ||
26 | Signed-off-by: Anuj Mittal <anuj.mittal@intel.com> | ||
27 | --- | ||
28 | .../clang-fuzzer/handle-llvm/handle_llvm.cpp | 32 +- | ||
29 | lld/Common/TargetOptionsCommandFlags.cpp | 25 +- | ||
30 | llvm/include/llvm/CodeGen/CommandFlags.h | 149 +++++ | ||
31 | .../llvm/MC/MCTargetOptionsCommandFlags.h | 54 ++ | ||
32 | .../llvm/MC/MCTargetOptionsCommandFlags.inc | 65 -- | ||
33 | llvm/include/llvm/module.modulemap | 3 - | ||
34 | llvm/lib/CodeGen/CMakeLists.txt | 1 + | ||
35 | llvm/lib/CodeGen/CommandFlags.cpp | 588 ++++++++++++++++++ | ||
36 | llvm/lib/MC/CMakeLists.txt | 1 + | ||
37 | llvm/lib/MC/MCTargetOptionsCommandFlags.cpp | 105 ++++ | ||
38 | llvm/tools/dsymutil/DwarfStreamer.cpp | 7 +- | ||
39 | llvm/tools/gold/gold-plugin.cpp | 16 +- | ||
40 | llvm/tools/llc/CMakeLists.txt | 1 + | ||
41 | llvm/tools/llc/llc.cpp | 43 +- | ||
42 | llvm/tools/lli/CMakeLists.txt | 1 + | ||
43 | llvm/tools/lli/lli.cpp | 41 +- | ||
44 | llvm/tools/llvm-dwp/llvm-dwp.cpp | 6 +- | ||
45 | .../llvm-isel-fuzzer/llvm-isel-fuzzer.cpp | 17 +- | ||
46 | llvm/tools/llvm-lto/CMakeLists.txt | 5 +- | ||
47 | llvm/tools/llvm-lto/llvm-lto.cpp | 28 +- | ||
48 | llvm/tools/llvm-lto2/CMakeLists.txt | 1 + | ||
49 | llvm/tools/llvm-lto2/llvm-lto2.cpp | 20 +- | ||
50 | .../llvm-mc-assemble-fuzzer/CMakeLists.txt | 1 + | ||
51 | .../llvm-mc-assemble-fuzzer.cpp | 12 +- | ||
52 | llvm/tools/llvm-mc/CMakeLists.txt | 1 + | ||
53 | llvm/tools/llvm-mc/llvm-mc.cpp | 6 +- | ||
54 | llvm/tools/llvm-mca/llvm-mca.cpp | 8 +- | ||
55 | .../tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp | 16 +- | ||
56 | llvm/tools/lto/CMakeLists.txt | 4 +- | ||
57 | llvm/tools/lto/lto.cpp | 35 +- | ||
58 | llvm/tools/opt/opt.cpp | 23 +- | ||
59 | .../DebugInfo/DWARF/DwarfGenerator.cpp | 6 +- | ||
60 | 32 files changed, 1088 insertions(+), 233 deletions(-) | ||
61 | create mode 100644 llvm/include/llvm/CodeGen/CommandFlags.h | ||
62 | create mode 100644 llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h | ||
63 | delete mode 100644 llvm/include/llvm/MC/MCTargetOptionsCommandFlags.inc | ||
64 | create mode 100644 llvm/lib/CodeGen/CommandFlags.cpp | ||
65 | create mode 100644 llvm/lib/MC/MCTargetOptionsCommandFlags.cpp | ||
66 | |||
67 | diff --git a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp | ||
68 | index d8ab14594185..aefb761cd70c 100644 | ||
69 | --- a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp | ||
70 | +++ b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp | ||
71 | @@ -19,7 +19,7 @@ | ||
72 | #include "llvm/ADT/Triple.h" | ||
73 | #include "llvm/Analysis/TargetLibraryInfo.h" | ||
74 | #include "llvm/Analysis/TargetTransformInfo.h" | ||
75 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
76 | +#include "llvm/CodeGen/CommandFlags.h" | ||
77 | #include "llvm/CodeGen/MachineModuleInfo.h" | ||
78 | #include "llvm/CodeGen/TargetPassConfig.h" | ||
79 | #include "llvm/ExecutionEngine/JITEventListener.h" | ||
80 | @@ -29,9 +29,9 @@ | ||
81 | #include "llvm/ExecutionEngine/RTDyldMemoryManager.h" | ||
82 | #include "llvm/ExecutionEngine/SectionMemoryManager.h" | ||
83 | #include "llvm/IR/IRPrintingPasses.h" | ||
84 | +#include "llvm/IR/LLVMContext.h" | ||
85 | #include "llvm/IR/LegacyPassManager.h" | ||
86 | #include "llvm/IR/LegacyPassNameParser.h" | ||
87 | -#include "llvm/IR/LLVMContext.h" | ||
88 | #include "llvm/IR/Module.h" | ||
89 | #include "llvm/IR/Verifier.h" | ||
90 | #include "llvm/IRReader/IRReader.h" | ||
91 | @@ -42,12 +42,14 @@ | ||
92 | #include "llvm/Support/TargetRegistry.h" | ||
93 | #include "llvm/Support/TargetSelect.h" | ||
94 | #include "llvm/Target/TargetMachine.h" | ||
95 | -#include "llvm/Transforms/IPO/PassManagerBuilder.h" | ||
96 | #include "llvm/Transforms/IPO.h" | ||
97 | +#include "llvm/Transforms/IPO/PassManagerBuilder.h" | ||
98 | #include "llvm/Transforms/Vectorize.h" | ||
99 | |||
100 | using namespace llvm; | ||
101 | |||
102 | +static codegen::RegisterCodeGenFlags CGF; | ||
103 | + | ||
104 | // Define a type for the functions that are compiled and executed | ||
105 | typedef void (*LLVMFunc)(int*, int*, int*, int); | ||
106 | |||
107 | @@ -100,15 +102,17 @@ static std::string OptLLVM(const std::string &IR, CodeGenOpt::Level OLvl) { | ||
108 | ErrorAndExit("Could not parse IR"); | ||
109 | |||
110 | Triple ModuleTriple(M->getTargetTriple()); | ||
111 | - const TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
112 | + const TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
113 | std::string E; | ||
114 | - const Target *TheTarget = TargetRegistry::lookupTarget(MArch, ModuleTriple, E); | ||
115 | - TargetMachine *Machine = | ||
116 | - TheTarget->createTargetMachine(M->getTargetTriple(), getCPUStr(), | ||
117 | - getFeaturesStr(), Options, getRelocModel(), | ||
118 | - getCodeModel(), OLvl); | ||
119 | + const Target *TheTarget = | ||
120 | + TargetRegistry::lookupTarget(codegen::getMArch(), ModuleTriple, E); | ||
121 | + TargetMachine *Machine = TheTarget->createTargetMachine( | ||
122 | + M->getTargetTriple(), codegen::getCPUStr(), codegen::getFeaturesStr(), | ||
123 | + Options, codegen::getExplicitRelocModel(), | ||
124 | + codegen::getExplicitCodeModel(), OLvl); | ||
125 | std::unique_ptr<TargetMachine> TM(Machine); | ||
126 | - setFunctionAttributes(getCPUStr(), getFeaturesStr(), *M); | ||
127 | + codegen::setFunctionAttributes(codegen::getCPUStr(), | ||
128 | + codegen::getFeaturesStr(), *M); | ||
129 | |||
130 | legacy::PassManager Passes; | ||
131 | |||
132 | @@ -154,14 +158,14 @@ static void CreateAndRunJITFunc(const std::string &IR, CodeGenOpt::Level OLvl) { | ||
133 | |||
134 | std::string ErrorMsg; | ||
135 | EngineBuilder builder(std::move(M)); | ||
136 | - builder.setMArch(MArch); | ||
137 | - builder.setMCPU(getCPUStr()); | ||
138 | - builder.setMAttrs(getFeatureList()); | ||
139 | + builder.setMArch(codegen::getMArch()); | ||
140 | + builder.setMCPU(codegen::getCPUStr()); | ||
141 | + builder.setMAttrs(codegen::getFeatureList()); | ||
142 | builder.setErrorStr(&ErrorMsg); | ||
143 | builder.setEngineKind(EngineKind::JIT); | ||
144 | builder.setMCJITMemoryManager(std::make_unique<SectionMemoryManager>()); | ||
145 | builder.setOptLevel(OLvl); | ||
146 | - builder.setTargetOptions(InitTargetOptionsFromCodeGenFlags()); | ||
147 | + builder.setTargetOptions(codegen::InitTargetOptionsFromCodeGenFlags()); | ||
148 | |||
149 | std::unique_ptr<ExecutionEngine> EE(builder.create()); | ||
150 | if (!EE) | ||
151 | diff --git a/lld/Common/TargetOptionsCommandFlags.cpp b/lld/Common/TargetOptionsCommandFlags.cpp | ||
152 | index 0137feb63f37..9b166a3e130a 100644 | ||
153 | --- a/lld/Common/TargetOptionsCommandFlags.cpp | ||
154 | +++ b/lld/Common/TargetOptionsCommandFlags.cpp | ||
155 | @@ -5,35 +5,26 @@ | ||
156 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
157 | // | ||
158 | //===----------------------------------------------------------------------===// | ||
159 | -// | ||
160 | -// This file exists as a place for global variables defined in LLVM's | ||
161 | -// CodeGen/CommandFlags.inc. By putting the resulting object file in | ||
162 | -// an archive and linking with it, the definitions will automatically be | ||
163 | -// included when needed and skipped when already present. | ||
164 | -// | ||
165 | -//===----------------------------------------------------------------------===// | ||
166 | |||
167 | #include "lld/Common/TargetOptionsCommandFlags.h" | ||
168 | |||
169 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
170 | +#include "llvm/CodeGen/CommandFlags.h" | ||
171 | #include "llvm/Target/TargetOptions.h" | ||
172 | |||
173 | -// Define an externally visible version of | ||
174 | -// initTargetOptionsFromCodeGenFlags, so that its functionality can be | ||
175 | -// used without having to include llvm/CodeGen/CommandFlags.inc, which | ||
176 | -// would lead to multiple definitions of the command line flags. | ||
177 | +static llvm::codegen::RegisterCodeGenFlags CGF; | ||
178 | + | ||
179 | llvm::TargetOptions lld::initTargetOptionsFromCodeGenFlags() { | ||
180 | - return ::InitTargetOptionsFromCodeGenFlags(); | ||
181 | + return llvm::codegen::InitTargetOptionsFromCodeGenFlags(); | ||
182 | } | ||
183 | |||
184 | llvm::Optional<llvm::Reloc::Model> lld::getRelocModelFromCMModel() { | ||
185 | - return getRelocModel(); | ||
186 | + return llvm::codegen::getExplicitRelocModel(); | ||
187 | } | ||
188 | |||
189 | llvm::Optional<llvm::CodeModel::Model> lld::getCodeModelFromCMModel() { | ||
190 | - return getCodeModel(); | ||
191 | + return llvm::codegen::getExplicitCodeModel(); | ||
192 | } | ||
193 | |||
194 | -std::string lld::getCPUStr() { return ::getCPUStr(); } | ||
195 | +std::string lld::getCPUStr() { return llvm::codegen::getCPUStr(); } | ||
196 | |||
197 | -std::vector<std::string> lld::getMAttrs() { return ::MAttrs; } | ||
198 | +std::vector<std::string> lld::getMAttrs() { return llvm::codegen::getMAttrs(); } | ||
199 | diff --git a/llvm/include/llvm/CodeGen/CommandFlags.h b/llvm/include/llvm/CodeGen/CommandFlags.h | ||
200 | new file mode 100644 | ||
201 | index 000000000000..cdec26879f73 | ||
202 | --- /dev/null | ||
203 | +++ b/llvm/include/llvm/CodeGen/CommandFlags.h | ||
204 | @@ -0,0 +1,149 @@ | ||
205 | +//===-- CommandFlags.h - Command Line Flags Interface -----------*- C++ -*-===// | ||
206 | +// | ||
207 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
208 | +// See https://llvm.org/LICENSE.txt for license information. | ||
209 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
210 | +// | ||
211 | +//===----------------------------------------------------------------------===// | ||
212 | +// | ||
213 | +// This file contains codegen-specific flags that are shared between different | ||
214 | +// command line tools. The tools "llc" and "opt" both use this file to prevent | ||
215 | +// flag duplication. | ||
216 | +// | ||
217 | +//===----------------------------------------------------------------------===// | ||
218 | + | ||
219 | +#include "llvm/ADT/StringExtras.h" | ||
220 | +#include "llvm/IR/Instructions.h" | ||
221 | +#include "llvm/IR/Intrinsics.h" | ||
222 | +#include "llvm/IR/Module.h" | ||
223 | +#include "llvm/MC/MCTargetOptionsCommandFlags.h" | ||
224 | +#include "llvm/MC/SubtargetFeature.h" | ||
225 | +#include "llvm/Support/CodeGen.h" | ||
226 | +#include "llvm/Support/CommandLine.h" | ||
227 | +#include "llvm/Support/Host.h" | ||
228 | +#include "llvm/Target/TargetMachine.h" | ||
229 | +#include "llvm/Target/TargetOptions.h" | ||
230 | +#include <string> | ||
231 | + | ||
232 | +namespace llvm { | ||
233 | + | ||
234 | +namespace codegen { | ||
235 | + | ||
236 | +std::string getMArch(); | ||
237 | + | ||
238 | +std::string getMCPU(); | ||
239 | + | ||
240 | +std::vector<std::string> getMAttrs(); | ||
241 | + | ||
242 | +Reloc::Model getRelocModel(); | ||
243 | +Optional<Reloc::Model> getExplicitRelocModel(); | ||
244 | + | ||
245 | +ThreadModel::Model getThreadModel(); | ||
246 | + | ||
247 | +CodeModel::Model getCodeModel(); | ||
248 | +Optional<CodeModel::Model> getExplicitCodeModel(); | ||
249 | + | ||
250 | +llvm::ExceptionHandling getExceptionModel(); | ||
251 | + | ||
252 | +CodeGenFileType getFileType(); | ||
253 | +Optional<CodeGenFileType> getExplicitFileType(); | ||
254 | + | ||
255 | +CodeGenFileType getFileType(); | ||
256 | + | ||
257 | +llvm::FramePointer::FP getFramePointerUsage(); | ||
258 | + | ||
259 | +bool getEnableUnsafeFPMath(); | ||
260 | + | ||
261 | +bool getEnableNoInfsFPMath(); | ||
262 | + | ||
263 | +bool getEnableNoNaNsFPMath(); | ||
264 | + | ||
265 | +bool getEnableNoSignedZerosFPMath(); | ||
266 | + | ||
267 | +bool getEnableNoTrappingFPMath(); | ||
268 | + | ||
269 | +llvm::FPDenormal::DenormalMode getDenormalFPMath(); | ||
270 | + | ||
271 | +bool getEnableHonorSignDependentRoundingFPMath(); | ||
272 | + | ||
273 | +llvm::FloatABI::ABIType getFloatABIForCalls(); | ||
274 | + | ||
275 | +llvm::FPOpFusion::FPOpFusionMode getFuseFPOps(); | ||
276 | + | ||
277 | +bool getDontPlaceZerosInBSS(); | ||
278 | + | ||
279 | +bool getEnableGuaranteedTailCallOpt(); | ||
280 | + | ||
281 | +bool getDisableTailCalls(); | ||
282 | + | ||
283 | +bool getStackSymbolOrdering(); | ||
284 | + | ||
285 | +unsigned getOverrideStackAlignment(); | ||
286 | + | ||
287 | +bool getStackRealign(); | ||
288 | + | ||
289 | +std::string getTrapFuncName(); | ||
290 | + | ||
291 | +bool getUseCtors(); | ||
292 | + | ||
293 | +bool getRelaxELFRelocations(); | ||
294 | + | ||
295 | +bool getDataSections(); | ||
296 | +Optional<bool> getExplicitDataSections(); | ||
297 | + | ||
298 | +bool getFunctionSections(); | ||
299 | +Optional<bool> getExplicitFunctionSections(); | ||
300 | + | ||
301 | +std::string getBBSections(); | ||
302 | + | ||
303 | +unsigned getTLSSize(); | ||
304 | + | ||
305 | +bool getEmulatedTLS(); | ||
306 | + | ||
307 | +bool getUniqueSectionNames(); | ||
308 | + | ||
309 | +bool getUniqueBBSectionNames(); | ||
310 | + | ||
311 | +llvm::EABI getEABIVersion(); | ||
312 | + | ||
313 | +llvm::DebuggerKind getDebuggerTuningOpt(); | ||
314 | + | ||
315 | +bool getEnableStackSizeSection(); | ||
316 | + | ||
317 | +bool getEnableAddrsig(); | ||
318 | + | ||
319 | +bool getEmitCallSiteInfo(); | ||
320 | + | ||
321 | +bool getEnableDebugEntryValues(); | ||
322 | + | ||
323 | +bool getForceDwarfFrameSection(); | ||
324 | + | ||
325 | +/// Create this object with static storage to register codegen-related command | ||
326 | +/// line options. | ||
327 | +struct RegisterCodeGenFlags { | ||
328 | + RegisterCodeGenFlags(); | ||
329 | +}; | ||
330 | + | ||
331 | +llvm::BasicBlockSection getBBSectionsMode(llvm::TargetOptions &Options); | ||
332 | + | ||
333 | +// Common utility function tightly tied to the options listed here. Initializes | ||
334 | +// a TargetOptions object with CodeGen flags and returns it. | ||
335 | +TargetOptions InitTargetOptionsFromCodeGenFlags(); | ||
336 | + | ||
337 | +std::string getCPUStr(); | ||
338 | + | ||
339 | +std::string getFeaturesStr(); | ||
340 | + | ||
341 | +std::vector<std::string> getFeatureList(); | ||
342 | + | ||
343 | +void renderBoolStringAttr(AttrBuilder &B, StringRef Name, bool Val); | ||
344 | + | ||
345 | +/// Set function attributes of function \p F based on CPU, Features, and command | ||
346 | +/// line flags. | ||
347 | +void setFunctionAttributes(StringRef CPU, StringRef Features, Function &F); | ||
348 | + | ||
349 | +/// Set function attributes of functions in Module M based on CPU, | ||
350 | +/// Features, and command line flags. | ||
351 | +void setFunctionAttributes(StringRef CPU, StringRef Features, Module &M); | ||
352 | +} // namespace codegen | ||
353 | +} // namespace llvm | ||
354 | diff --git a/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h b/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h | ||
355 | new file mode 100644 | ||
356 | index 000000000000..7a5edf78fdcc | ||
357 | --- /dev/null | ||
358 | +++ b/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.h | ||
359 | @@ -0,0 +1,54 @@ | ||
360 | +//===-- MCTargetOptionsCommandFlags.h --------------------------*- C++ -*-===// | ||
361 | +// | ||
362 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
363 | +// See https://llvm.org/LICENSE.txt for license information. | ||
364 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
365 | +// | ||
366 | +//===----------------------------------------------------------------------===// | ||
367 | +// | ||
368 | +// This file contains machine code-specific flags that are shared between | ||
369 | +// different command line tools. | ||
370 | +// | ||
371 | +//===----------------------------------------------------------------------===// | ||
372 | + | ||
373 | +#ifndef LLVM_MC_MCTARGETOPTIONSCOMMANDFLAGS_H | ||
374 | +#define LLVM_MC_MCTARGETOPTIONSCOMMANDFLAGS_H | ||
375 | + | ||
376 | +#include "llvm/ADT/Optional.h" | ||
377 | +#include "llvm/MC/MCTargetOptions.h" | ||
378 | +#include "llvm/Support/CommandLine.h" | ||
379 | + | ||
380 | +namespace llvm { | ||
381 | + | ||
382 | +namespace mc { | ||
383 | + | ||
384 | +bool getRelaxAll(); | ||
385 | +Optional<bool> getExplicitRelaxAll(); | ||
386 | + | ||
387 | +bool getIncrementalLinkerCompatible(); | ||
388 | + | ||
389 | +int getDwarfVersion(); | ||
390 | + | ||
391 | +bool getShowMCInst(); | ||
392 | + | ||
393 | +bool getFatalWarnings(); | ||
394 | + | ||
395 | +bool getNoWarn(); | ||
396 | + | ||
397 | +bool getNoDeprecatedWarn(); | ||
398 | + | ||
399 | +std::string getABIName(); | ||
400 | + | ||
401 | +/// Create this object with static storage to register mc-related command | ||
402 | +/// line options. | ||
403 | +struct RegisterMCTargetOptionsFlags { | ||
404 | + RegisterMCTargetOptionsFlags(); | ||
405 | +}; | ||
406 | + | ||
407 | +MCTargetOptions InitMCTargetOptionsFromFlags(); | ||
408 | + | ||
409 | +} // namespace mc | ||
410 | + | ||
411 | +} // namespace llvm | ||
412 | + | ||
413 | +#endif | ||
414 | diff --git a/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.inc b/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.inc | ||
415 | deleted file mode 100644 | ||
416 | index 93e21b626eac..000000000000 | ||
417 | --- a/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.inc | ||
418 | +++ /dev/null | ||
419 | @@ -1,65 +0,0 @@ | ||
420 | -//===-- MCTargetOptionsCommandFlags.h --------------------------*- C++ -*-===// | ||
421 | -// | ||
422 | -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
423 | -// See https://llvm.org/LICENSE.txt for license information. | ||
424 | -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
425 | -// | ||
426 | -//===----------------------------------------------------------------------===// | ||
427 | -// | ||
428 | -// This file contains machine code-specific flags that are shared between | ||
429 | -// different command line tools. | ||
430 | -// | ||
431 | -//===----------------------------------------------------------------------===// | ||
432 | - | ||
433 | -#ifndef LLVM_MC_MCTARGETOPTIONSCOMMANDFLAGS_H | ||
434 | -#define LLVM_MC_MCTARGETOPTIONSCOMMANDFLAGS_H | ||
435 | - | ||
436 | -#include "llvm/MC/MCTargetOptions.h" | ||
437 | -#include "llvm/Support/CommandLine.h" | ||
438 | -using namespace llvm; | ||
439 | - | ||
440 | -static cl::opt<bool> RelaxAll("mc-relax-all", | ||
441 | - cl::desc("When used with filetype=obj, " | ||
442 | - "relax all fixups in the emitted object file")); | ||
443 | - | ||
444 | -static cl::opt<bool> IncrementalLinkerCompatible( | ||
445 | - "incremental-linker-compatible", | ||
446 | - cl::desc( | ||
447 | - "When used with filetype=obj, " | ||
448 | - "emit an object file which can be used with an incremental linker")); | ||
449 | - | ||
450 | -static cl::opt<int> DwarfVersion("dwarf-version", cl::desc("Dwarf version"), | ||
451 | - cl::init(0)); | ||
452 | - | ||
453 | -static cl::opt<bool> ShowMCInst("asm-show-inst", | ||
454 | - cl::desc("Emit internal instruction representation to " | ||
455 | - "assembly file")); | ||
456 | - | ||
457 | -static cl::opt<bool> FatalWarnings("fatal-warnings", | ||
458 | - cl::desc("Treat warnings as errors")); | ||
459 | - | ||
460 | -static cl::opt<bool> NoWarn("no-warn", cl::desc("Suppress all warnings")); | ||
461 | -static cl::alias NoWarnW("W", cl::desc("Alias for --no-warn"), cl::aliasopt(NoWarn)); | ||
462 | - | ||
463 | -static cl::opt<bool> NoDeprecatedWarn("no-deprecated-warn", | ||
464 | - cl::desc("Suppress all deprecated warnings")); | ||
465 | - | ||
466 | -static cl::opt<std::string> | ||
467 | -ABIName("target-abi", cl::Hidden, | ||
468 | - cl::desc("The name of the ABI to be targeted from the backend."), | ||
469 | - cl::init("")); | ||
470 | - | ||
471 | -static MCTargetOptions InitMCTargetOptionsFromFlags() { | ||
472 | - MCTargetOptions Options; | ||
473 | - Options.MCRelaxAll = RelaxAll; | ||
474 | - Options.MCIncrementalLinkerCompatible = IncrementalLinkerCompatible; | ||
475 | - Options.DwarfVersion = DwarfVersion; | ||
476 | - Options.ShowMCInst = ShowMCInst; | ||
477 | - Options.ABIName = ABIName; | ||
478 | - Options.MCFatalWarnings = FatalWarnings; | ||
479 | - Options.MCNoWarn = NoWarn; | ||
480 | - Options.MCNoDeprecatedWarn = NoDeprecatedWarn; | ||
481 | - return Options; | ||
482 | -} | ||
483 | - | ||
484 | -#endif | ||
485 | diff --git a/llvm/include/llvm/module.modulemap b/llvm/include/llvm/module.modulemap | ||
486 | index d281682ae003..d176b3dfd4be 100644 | ||
487 | --- a/llvm/include/llvm/module.modulemap | ||
488 | +++ b/llvm/include/llvm/module.modulemap | ||
489 | @@ -29,7 +29,6 @@ module LLVM_Backend { | ||
490 | exclude header "CodeGen/LinkAllCodegenComponents.h" | ||
491 | |||
492 | // These are intended for (repeated) textual inclusion. | ||
493 | - textual header "CodeGen/CommandFlags.inc" | ||
494 | textual header "CodeGen/DIEValue.def" | ||
495 | } | ||
496 | } | ||
497 | @@ -308,8 +307,6 @@ module LLVM_MC { | ||
498 | |||
499 | umbrella "MC" | ||
500 | module * { export * } | ||
501 | - | ||
502 | - textual header "MC/MCTargetOptionsCommandFlags.inc" | ||
503 | } | ||
504 | |||
505 | // Used by llvm-tblgen | ||
506 | diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt | ||
507 | index a3916b7c6242..c6be91247017 100644 | ||
508 | --- a/llvm/lib/CodeGen/CMakeLists.txt | ||
509 | +++ b/llvm/lib/CodeGen/CMakeLists.txt | ||
510 | @@ -14,6 +14,7 @@ add_llvm_component_library(LLVMCodeGen | ||
511 | CFIInstrInserter.cpp | ||
512 | CodeGen.cpp | ||
513 | CodeGenPrepare.cpp | ||
514 | + CommandFlags.cpp | ||
515 | CriticalAntiDepBreaker.cpp | ||
516 | DeadMachineInstructionElim.cpp | ||
517 | DetectDeadLanes.cpp | ||
518 | diff --git a/llvm/lib/CodeGen/CommandFlags.cpp b/llvm/lib/CodeGen/CommandFlags.cpp | ||
519 | new file mode 100644 | ||
520 | index 000000000000..7acb84df582f | ||
521 | --- /dev/null | ||
522 | +++ b/llvm/lib/CodeGen/CommandFlags.cpp | ||
523 | @@ -0,0 +1,588 @@ | ||
524 | +//===-- CommandFlags.cpp - Command Line Flags Interface ---------*- C++ -*-===// | ||
525 | +// | ||
526 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
527 | +// See https://llvm.org/LICENSE.txt for license information. | ||
528 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
529 | +// | ||
530 | +//===----------------------------------------------------------------------===// | ||
531 | +// | ||
532 | +// This file contains codegen-specific flags that are shared between different | ||
533 | +// command line tools. The tools "llc" and "opt" both use this file to prevent | ||
534 | +// flag duplication. | ||
535 | +// | ||
536 | +//===----------------------------------------------------------------------===// | ||
537 | + | ||
538 | +#include "llvm/CodeGen/CommandFlags.h" | ||
539 | + | ||
540 | +using namespace llvm; | ||
541 | + | ||
542 | +#define CGOPT(TY, NAME) \ | ||
543 | + static cl::opt<TY> *NAME##View; \ | ||
544 | + TY codegen::get##NAME() { \ | ||
545 | + assert(NAME##View && "RegisterCodeGenFlags not created."); \ | ||
546 | + return *NAME##View; \ | ||
547 | + } | ||
548 | + | ||
549 | +#define CGLIST(TY, NAME) \ | ||
550 | + static cl::list<TY> *NAME##View; \ | ||
551 | + std::vector<TY> codegen::get##NAME() { \ | ||
552 | + assert(NAME##View && "RegisterCodeGenFlags not created."); \ | ||
553 | + return *NAME##View; \ | ||
554 | + } | ||
555 | + | ||
556 | +#define CGOPT_EXP(TY, NAME) \ | ||
557 | + CGOPT(TY, NAME) \ | ||
558 | + Optional<TY> codegen::getExplicit##NAME() { \ | ||
559 | + if (NAME##View->getNumOccurrences()) { \ | ||
560 | + TY res = *NAME##View; \ | ||
561 | + return res; \ | ||
562 | + } \ | ||
563 | + return None; \ | ||
564 | + } | ||
565 | + | ||
566 | +CGOPT(std::string, MArch) | ||
567 | +CGOPT(std::string, MCPU) | ||
568 | +CGLIST(std::string, MAttrs) | ||
569 | +CGOPT_EXP(Reloc::Model, RelocModel) | ||
570 | +CGOPT(ThreadModel::Model, ThreadModel) | ||
571 | +CGOPT_EXP(CodeModel::Model, CodeModel) | ||
572 | +CGOPT(ExceptionHandling, ExceptionModel) | ||
573 | +CGOPT_EXP(CodeGenFileType, FileType) | ||
574 | +CGOPT(FramePointer::FP, FramePointerUsage) | ||
575 | +CGOPT(bool, EnableUnsafeFPMath) | ||
576 | +CGOPT(bool, EnableNoInfsFPMath) | ||
577 | +CGOPT(bool, EnableNoNaNsFPMath) | ||
578 | +CGOPT(bool, EnableNoSignedZerosFPMath) | ||
579 | +CGOPT(bool, EnableNoTrappingFPMath) | ||
580 | +CGOPT(FPDenormal::DenormalMode, DenormalFPMath) | ||
581 | +CGOPT(bool, EnableHonorSignDependentRoundingFPMath) | ||
582 | +CGOPT(FloatABI::ABIType, FloatABIForCalls) | ||
583 | +CGOPT(FPOpFusion::FPOpFusionMode, FuseFPOps) | ||
584 | +CGOPT(bool, DontPlaceZerosInBSS) | ||
585 | +CGOPT(bool, EnableGuaranteedTailCallOpt) | ||
586 | +CGOPT(bool, DisableTailCalls) | ||
587 | +CGOPT(bool, StackSymbolOrdering) | ||
588 | +CGOPT(unsigned, OverrideStackAlignment) | ||
589 | +CGOPT(bool, StackRealign) | ||
590 | +CGOPT(std::string, TrapFuncName) | ||
591 | +CGOPT(bool, UseCtors) | ||
592 | +CGOPT(bool, RelaxELFRelocations) | ||
593 | +CGOPT_EXP(bool, DataSections) | ||
594 | +CGOPT_EXP(bool, FunctionSections) | ||
595 | +CGOPT(std::string, BBSections) | ||
596 | +CGOPT(unsigned, TLSSize) | ||
597 | +CGOPT(bool, EmulatedTLS) | ||
598 | +CGOPT(bool, UniqueSectionNames) | ||
599 | +CGOPT(bool, UniqueBBSectionNames) | ||
600 | +CGOPT(EABI, EABIVersion) | ||
601 | +CGOPT(DebuggerKind, DebuggerTuningOpt) | ||
602 | +CGOPT(bool, EnableStackSizeSection) | ||
603 | +CGOPT(bool, EnableAddrsig) | ||
604 | +CGOPT(bool, EmitCallSiteInfo) | ||
605 | +CGOPT(bool, EnableDebugEntryValues) | ||
606 | +CGOPT(bool, ForceDwarfFrameSection) | ||
607 | + | ||
608 | +codegen::RegisterCodeGenFlags::RegisterCodeGenFlags() { | ||
609 | +#define CGBINDOPT(NAME) \ | ||
610 | + do { \ | ||
611 | + NAME##View = std::addressof(NAME); \ | ||
612 | + } while (0) | ||
613 | + | ||
614 | + static cl::opt<std::string> MArch( | ||
615 | + "march", cl::desc("Architecture to generate code for (see --version)")); | ||
616 | + CGBINDOPT(MArch); | ||
617 | + | ||
618 | + static cl::opt<std::string> MCPU( | ||
619 | + "mcpu", cl::desc("Target a specific cpu type (-mcpu=help for details)"), | ||
620 | + cl::value_desc("cpu-name"), cl::init("")); | ||
621 | + CGBINDOPT(MCPU); | ||
622 | + | ||
623 | + static cl::list<std::string> MAttrs( | ||
624 | + "mattr", cl::CommaSeparated, | ||
625 | + cl::desc("Target specific attributes (-mattr=help for details)"), | ||
626 | + cl::value_desc("a1,+a2,-a3,...")); | ||
627 | + CGBINDOPT(MAttrs); | ||
628 | + | ||
629 | + static cl::opt<Reloc::Model> RelocModel( | ||
630 | + "relocation-model", cl::desc("Choose relocation model"), | ||
631 | + cl::values( | ||
632 | + clEnumValN(Reloc::Static, "static", "Non-relocatable code"), | ||
633 | + clEnumValN(Reloc::PIC_, "pic", | ||
634 | + "Fully relocatable, position independent code"), | ||
635 | + clEnumValN(Reloc::DynamicNoPIC, "dynamic-no-pic", | ||
636 | + "Relocatable external references, non-relocatable code"), | ||
637 | + clEnumValN( | ||
638 | + Reloc::ROPI, "ropi", | ||
639 | + "Code and read-only data relocatable, accessed PC-relative"), | ||
640 | + clEnumValN( | ||
641 | + Reloc::RWPI, "rwpi", | ||
642 | + "Read-write data relocatable, accessed relative to static base"), | ||
643 | + clEnumValN(Reloc::ROPI_RWPI, "ropi-rwpi", | ||
644 | + "Combination of ropi and rwpi"))); | ||
645 | + CGBINDOPT(RelocModel); | ||
646 | + | ||
647 | + static cl::opt<ThreadModel::Model> ThreadModel( | ||
648 | + "thread-model", cl::desc("Choose threading model"), | ||
649 | + cl::init(ThreadModel::POSIX), | ||
650 | + cl::values( | ||
651 | + clEnumValN(ThreadModel::POSIX, "posix", "POSIX thread model"), | ||
652 | + clEnumValN(ThreadModel::Single, "single", "Single thread model"))); | ||
653 | + CGBINDOPT(ThreadModel); | ||
654 | + | ||
655 | + static cl::opt<CodeModel::Model> CodeModel( | ||
656 | + "code-model", cl::desc("Choose code model"), | ||
657 | + cl::values(clEnumValN(CodeModel::Tiny, "tiny", "Tiny code model"), | ||
658 | + clEnumValN(CodeModel::Small, "small", "Small code model"), | ||
659 | + clEnumValN(CodeModel::Kernel, "kernel", "Kernel code model"), | ||
660 | + clEnumValN(CodeModel::Medium, "medium", "Medium code model"), | ||
661 | + clEnumValN(CodeModel::Large, "large", "Large code model"))); | ||
662 | + CGBINDOPT(CodeModel); | ||
663 | + | ||
664 | + static cl::opt<ExceptionHandling> ExceptionModel( | ||
665 | + "exception-model", cl::desc("exception model"), | ||
666 | + cl::init(ExceptionHandling::None), | ||
667 | + cl::values( | ||
668 | + clEnumValN(ExceptionHandling::None, "default", | ||
669 | + "default exception handling model"), | ||
670 | + clEnumValN(ExceptionHandling::DwarfCFI, "dwarf", | ||
671 | + "DWARF-like CFI based exception handling"), | ||
672 | + clEnumValN(ExceptionHandling::SjLj, "sjlj", | ||
673 | + "SjLj exception handling"), | ||
674 | + clEnumValN(ExceptionHandling::ARM, "arm", "ARM EHABI exceptions"), | ||
675 | + clEnumValN(ExceptionHandling::WinEH, "wineh", | ||
676 | + "Windows exception model"), | ||
677 | + clEnumValN(ExceptionHandling::Wasm, "wasm", | ||
678 | + "WebAssembly exception handling"))); | ||
679 | + CGBINDOPT(ExceptionModel); | ||
680 | + | ||
681 | + static cl::opt<CodeGenFileType> FileType( | ||
682 | + "filetype", cl::init(CGFT_AssemblyFile), | ||
683 | + cl::desc( | ||
684 | + "Choose a file type (not all types are supported by all targets):"), | ||
685 | + cl::values( | ||
686 | + clEnumValN(CGFT_AssemblyFile, "asm", "Emit an assembly ('.s') file"), | ||
687 | + clEnumValN(CGFT_ObjectFile, "obj", | ||
688 | + "Emit a native object ('.o') file"), | ||
689 | + clEnumValN(CGFT_Null, "null", | ||
690 | + "Emit nothing, for performance testing"))); | ||
691 | + CGBINDOPT(FileType); | ||
692 | + | ||
693 | + static cl::opt<FramePointer::FP> FramePointerUsage( | ||
694 | + "frame-pointer", | ||
695 | + cl::desc("Specify frame pointer elimination optimization"), | ||
696 | + cl::init(FramePointer::None), | ||
697 | + cl::values( | ||
698 | + clEnumValN(FramePointer::All, "all", | ||
699 | + "Disable frame pointer elimination"), | ||
700 | + clEnumValN(FramePointer::NonLeaf, "non-leaf", | ||
701 | + "Disable frame pointer elimination for non-leaf frame"), | ||
702 | + clEnumValN(FramePointer::None, "none", | ||
703 | + "Enable frame pointer elimination"))); | ||
704 | + CGBINDOPT(FramePointerUsage); | ||
705 | + | ||
706 | + static cl::opt<bool> EnableUnsafeFPMath( | ||
707 | + "enable-unsafe-fp-math", | ||
708 | + cl::desc("Enable optimizations that may decrease FP precision"), | ||
709 | + cl::init(false)); | ||
710 | + CGBINDOPT(EnableUnsafeFPMath); | ||
711 | + | ||
712 | + static cl::opt<bool> EnableNoInfsFPMath( | ||
713 | + "enable-no-infs-fp-math", | ||
714 | + cl::desc("Enable FP math optimizations that assume no +-Infs"), | ||
715 | + cl::init(false)); | ||
716 | + CGBINDOPT(EnableNoInfsFPMath); | ||
717 | + | ||
718 | + static cl::opt<bool> EnableNoNaNsFPMath( | ||
719 | + "enable-no-nans-fp-math", | ||
720 | + cl::desc("Enable FP math optimizations that assume no NaNs"), | ||
721 | + cl::init(false)); | ||
722 | + CGBINDOPT(EnableNoNaNsFPMath); | ||
723 | + | ||
724 | + static cl::opt<bool> EnableNoSignedZerosFPMath( | ||
725 | + "enable-no-signed-zeros-fp-math", | ||
726 | + cl::desc("Enable FP math optimizations that assume " | ||
727 | + "the sign of 0 is insignificant"), | ||
728 | + cl::init(false)); | ||
729 | + CGBINDOPT(EnableNoSignedZerosFPMath); | ||
730 | + | ||
731 | + static cl::opt<bool> EnableNoTrappingFPMath( | ||
732 | + "enable-no-trapping-fp-math", | ||
733 | + cl::desc("Enable setting the FP exceptions build " | ||
734 | + "attribute not to use exceptions"), | ||
735 | + cl::init(false)); | ||
736 | + CGBINDOPT(EnableNoTrappingFPMath); | ||
737 | + | ||
738 | + static cl::opt<FPDenormal::DenormalMode> DenormalFPMath( | ||
739 | + "denormal-fp-math", | ||
740 | + cl::desc( | ||
741 | + "Select which denormal numbers the code is permitted to require"), | ||
742 | + cl::init(FPDenormal::IEEE), | ||
743 | + cl::values( | ||
744 | + clEnumValN(FPDenormal::IEEE, "ieee", "IEEE 754 denormal numbers"), | ||
745 | + clEnumValN(FPDenormal::PreserveSign, "preserve-sign", | ||
746 | + "the sign of a flushed-to-zero number is preserved " | ||
747 | + "in the sign of 0"), | ||
748 | + clEnumValN(FPDenormal::PositiveZero, "positive-zero", | ||
749 | + "denormals are flushed to positive zero"))); | ||
750 | + CGBINDOPT(DenormalFPMath); | ||
751 | + | ||
752 | + static cl::opt<bool> EnableHonorSignDependentRoundingFPMath( | ||
753 | + "enable-sign-dependent-rounding-fp-math", cl::Hidden, | ||
754 | + cl::desc("Force codegen to assume rounding mode can change dynamically"), | ||
755 | + cl::init(false)); | ||
756 | + CGBINDOPT(EnableHonorSignDependentRoundingFPMath); | ||
757 | + | ||
758 | + static cl::opt<FloatABI::ABIType> FloatABIForCalls( | ||
759 | + "float-abi", cl::desc("Choose float ABI type"), | ||
760 | + cl::init(FloatABI::Default), | ||
761 | + cl::values(clEnumValN(FloatABI::Default, "default", | ||
762 | + "Target default float ABI type"), | ||
763 | + clEnumValN(FloatABI::Soft, "soft", | ||
764 | + "Soft float ABI (implied by -soft-float)"), | ||
765 | + clEnumValN(FloatABI::Hard, "hard", | ||
766 | + "Hard float ABI (uses FP registers)"))); | ||
767 | + CGBINDOPT(FloatABIForCalls); | ||
768 | + | ||
769 | + static cl::opt<FPOpFusion::FPOpFusionMode> FuseFPOps( | ||
770 | + "fp-contract", cl::desc("Enable aggressive formation of fused FP ops"), | ||
771 | + cl::init(FPOpFusion::Standard), | ||
772 | + cl::values( | ||
773 | + clEnumValN(FPOpFusion::Fast, "fast", | ||
774 | + "Fuse FP ops whenever profitable"), | ||
775 | + clEnumValN(FPOpFusion::Standard, "on", "Only fuse 'blessed' FP ops."), | ||
776 | + clEnumValN(FPOpFusion::Strict, "off", | ||
777 | + "Only fuse FP ops when the result won't be affected."))); | ||
778 | + CGBINDOPT(FuseFPOps); | ||
779 | + | ||
780 | + static cl::opt<bool> DontPlaceZerosInBSS( | ||
781 | + "nozero-initialized-in-bss", | ||
782 | + cl::desc("Don't place zero-initialized symbols into bss section"), | ||
783 | + cl::init(false)); | ||
784 | + CGBINDOPT(DontPlaceZerosInBSS); | ||
785 | + | ||
786 | + static cl::opt<bool> EnableGuaranteedTailCallOpt( | ||
787 | + "tailcallopt", | ||
788 | + cl::desc( | ||
789 | + "Turn fastcc calls into tail calls by (potentially) changing ABI."), | ||
790 | + cl::init(false)); | ||
791 | + CGBINDOPT(EnableGuaranteedTailCallOpt); | ||
792 | + | ||
793 | + static cl::opt<bool> DisableTailCalls( | ||
794 | + "disable-tail-calls", cl::desc("Never emit tail calls"), cl::init(false)); | ||
795 | + CGBINDOPT(DisableTailCalls); | ||
796 | + | ||
797 | + static cl::opt<bool> StackSymbolOrdering( | ||
798 | + "stack-symbol-ordering", cl::desc("Order local stack symbols."), | ||
799 | + cl::init(true)); | ||
800 | + CGBINDOPT(StackSymbolOrdering); | ||
801 | + | ||
802 | + static cl::opt<unsigned> OverrideStackAlignment( | ||
803 | + "stack-alignment", cl::desc("Override default stack alignment"), | ||
804 | + cl::init(0)); | ||
805 | + CGBINDOPT(OverrideStackAlignment); | ||
806 | + | ||
807 | + static cl::opt<bool> StackRealign( | ||
808 | + "stackrealign", | ||
809 | + cl::desc("Force align the stack to the minimum alignment"), | ||
810 | + cl::init(false)); | ||
811 | + CGBINDOPT(StackRealign); | ||
812 | + | ||
813 | + static cl::opt<std::string> TrapFuncName( | ||
814 | + "trap-func", cl::Hidden, | ||
815 | + cl::desc("Emit a call to trap function rather than a trap instruction"), | ||
816 | + cl::init("")); | ||
817 | + CGBINDOPT(TrapFuncName); | ||
818 | + | ||
819 | + static cl::opt<bool> UseCtors("use-ctors", | ||
820 | + cl::desc("Use .ctors instead of .init_array."), | ||
821 | + cl::init(false)); | ||
822 | + CGBINDOPT(UseCtors); | ||
823 | + | ||
824 | + static cl::opt<bool> RelaxELFRelocations( | ||
825 | + "relax-elf-relocations", | ||
826 | + cl::desc( | ||
827 | + "Emit GOTPCRELX/REX_GOTPCRELX instead of GOTPCREL on x86-64 ELF"), | ||
828 | + cl::init(false)); | ||
829 | + CGBINDOPT(RelaxELFRelocations); | ||
830 | + | ||
831 | + static cl::opt<bool> DataSections( | ||
832 | + "data-sections", cl::desc("Emit data into separate sections"), | ||
833 | + cl::init(false)); | ||
834 | + CGBINDOPT(DataSections); | ||
835 | + | ||
836 | + static cl::opt<bool> FunctionSections( | ||
837 | + "function-sections", cl::desc("Emit functions into separate sections"), | ||
838 | + cl::init(false)); | ||
839 | + CGBINDOPT(FunctionSections); | ||
840 | + | ||
841 | + static cl::opt<std::string> BBSections( | ||
842 | + "basicblock-sections", | ||
843 | + cl::desc("Emit basic blocks into separate sections"), | ||
844 | + cl::value_desc("all | <function list (file)> | labels | none"), | ||
845 | + cl::init("none")); | ||
846 | + CGBINDOPT(BBSections); | ||
847 | + | ||
848 | + static cl::opt<unsigned> TLSSize( | ||
849 | + "tls-size", cl::desc("Bit size of immediate TLS offsets"), cl::init(0)); | ||
850 | + CGBINDOPT(TLSSize); | ||
851 | + | ||
852 | + static cl::opt<bool> EmulatedTLS( | ||
853 | + "emulated-tls", cl::desc("Use emulated TLS model"), cl::init(false)); | ||
854 | + CGBINDOPT(EmulatedTLS); | ||
855 | + | ||
856 | + static cl::opt<bool> UniqueSectionNames( | ||
857 | + "unique-section-names", cl::desc("Give unique names to every section"), | ||
858 | + cl::init(true)); | ||
859 | + CGBINDOPT(UniqueSectionNames); | ||
860 | + | ||
861 | + static cl::opt<bool> UniqueBBSectionNames( | ||
862 | + "unique-bb-section-names", | ||
863 | + cl::desc("Give unique names to every basic block section"), | ||
864 | + cl::init(false)); | ||
865 | + CGBINDOPT(UniqueBBSectionNames); | ||
866 | + | ||
867 | + static cl::opt<EABI> EABIVersion( | ||
868 | + "meabi", cl::desc("Set EABI type (default depends on triple):"), | ||
869 | + cl::init(EABI::Default), | ||
870 | + cl::values( | ||
871 | + clEnumValN(EABI::Default, "default", "Triple default EABI version"), | ||
872 | + clEnumValN(EABI::EABI4, "4", "EABI version 4"), | ||
873 | + clEnumValN(EABI::EABI5, "5", "EABI version 5"), | ||
874 | + clEnumValN(EABI::GNU, "gnu", "EABI GNU"))); | ||
875 | + CGBINDOPT(EABIVersion); | ||
876 | + | ||
877 | + static cl::opt<DebuggerKind> DebuggerTuningOpt( | ||
878 | + "debugger-tune", cl::desc("Tune debug info for a particular debugger"), | ||
879 | + cl::init(DebuggerKind::Default), | ||
880 | + cl::values( | ||
881 | + clEnumValN(DebuggerKind::GDB, "gdb", "gdb"), | ||
882 | + clEnumValN(DebuggerKind::LLDB, "lldb", "lldb"), | ||
883 | + clEnumValN(DebuggerKind::SCE, "sce", "SCE targets (e.g. PS4)"))); | ||
884 | + CGBINDOPT(DebuggerTuningOpt); | ||
885 | + | ||
886 | + static cl::opt<bool> EnableStackSizeSection( | ||
887 | + "stack-size-section", | ||
888 | + cl::desc("Emit a section containing stack size metadata"), | ||
889 | + cl::init(false)); | ||
890 | + CGBINDOPT(EnableStackSizeSection); | ||
891 | + | ||
892 | + static cl::opt<bool> EnableAddrsig( | ||
893 | + "addrsig", cl::desc("Emit an address-significance table"), | ||
894 | + cl::init(false)); | ||
895 | + CGBINDOPT(EnableAddrsig); | ||
896 | + | ||
897 | + static cl::opt<bool> EmitCallSiteInfo( | ||
898 | + "emit-call-site-info", | ||
899 | + cl::desc( | ||
900 | + "Emit call site debug information, if debug information is enabled."), | ||
901 | + cl::init(false)); | ||
902 | + CGBINDOPT(EmitCallSiteInfo); | ||
903 | + | ||
904 | + static cl::opt<bool> EnableDebugEntryValues( | ||
905 | + "debug-entry-values", | ||
906 | + cl::desc("Emit debug info about parameter's entry values"), | ||
907 | + cl::init(false)); | ||
908 | + CGBINDOPT(EnableDebugEntryValues); | ||
909 | + | ||
910 | + static cl::opt<bool> ForceDwarfFrameSection( | ||
911 | + "force-dwarf-frame-section", | ||
912 | + cl::desc("Always emit a debug frame section."), cl::init(false)); | ||
913 | + CGBINDOPT(ForceDwarfFrameSection); | ||
914 | + | ||
915 | +#undef CGBINDOPT | ||
916 | + | ||
917 | + mc::RegisterMCTargetOptionsFlags(); | ||
918 | +} | ||
919 | + | ||
920 | +llvm::BasicBlockSection | ||
921 | +codegen::getBBSectionsMode(llvm::TargetOptions &Options) { | ||
922 | + if (getBBSections() == "all") | ||
923 | + return BasicBlockSection::All; | ||
924 | + else if (getBBSections() == "labels") | ||
925 | + return BasicBlockSection::Labels; | ||
926 | + else if (getBBSections() == "none") | ||
927 | + return BasicBlockSection::None; | ||
928 | + else { | ||
929 | + ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = | ||
930 | + MemoryBuffer::getFile(getBBSections()); | ||
931 | + if (!MBOrErr) { | ||
932 | + errs() << "Error loading basic block sections function list file: " | ||
933 | + << MBOrErr.getError().message() << "\n"; | ||
934 | + } else { | ||
935 | + Options.BBSectionsFuncListBuf = std::move(*MBOrErr); | ||
936 | + } | ||
937 | + return BasicBlockSection::List; | ||
938 | + } | ||
939 | +} | ||
940 | + | ||
941 | +// Common utility function tightly tied to the options listed here. Initializes | ||
942 | +// a TargetOptions object with CodeGen flags and returns it. | ||
943 | +TargetOptions codegen::InitTargetOptionsFromCodeGenFlags() { | ||
944 | + TargetOptions Options; | ||
945 | + Options.AllowFPOpFusion = getFuseFPOps(); | ||
946 | + Options.UnsafeFPMath = getEnableUnsafeFPMath(); | ||
947 | + Options.NoInfsFPMath = getEnableNoInfsFPMath(); | ||
948 | + Options.NoNaNsFPMath = getEnableNoNaNsFPMath(); | ||
949 | + Options.NoSignedZerosFPMath = getEnableNoSignedZerosFPMath(); | ||
950 | + Options.NoTrappingFPMath = getEnableNoTrappingFPMath(); | ||
951 | + Options.FPDenormalMode = getDenormalFPMath(); | ||
952 | + Options.HonorSignDependentRoundingFPMathOption = | ||
953 | + getEnableHonorSignDependentRoundingFPMath(); | ||
954 | + if (getFloatABIForCalls() != FloatABI::Default) | ||
955 | + Options.FloatABIType = getFloatABIForCalls(); | ||
956 | + Options.NoZerosInBSS = getDontPlaceZerosInBSS(); | ||
957 | + Options.GuaranteedTailCallOpt = getEnableGuaranteedTailCallOpt(); | ||
958 | + Options.StackAlignmentOverride = getOverrideStackAlignment(); | ||
959 | + Options.StackSymbolOrdering = getStackSymbolOrdering(); | ||
960 | + Options.UseInitArray = !getUseCtors(); | ||
961 | + Options.RelaxELFRelocations = getRelaxELFRelocations(); | ||
962 | + Options.DataSections = getDataSections(); | ||
963 | + Options.FunctionSections = getFunctionSections(); | ||
964 | + Options.BBSections = getBBSectionsMode(Options); | ||
965 | + Options.UniqueSectionNames = getUniqueSectionNames(); | ||
966 | + Options.UniqueBBSectionNames = getUniqueBBSectionNames(); | ||
967 | + Options.TLSSize = getTLSSize(); | ||
968 | + Options.EmulatedTLS = getEmulatedTLS(); | ||
969 | + Options.ExplicitEmulatedTLS = EmulatedTLSView->getNumOccurrences() > 0; | ||
970 | + Options.ExceptionModel = getExceptionModel(); | ||
971 | + Options.EmitStackSizeSection = getEnableStackSizeSection(); | ||
972 | + Options.EmitAddrsig = getEnableAddrsig(); | ||
973 | + Options.EmitCallSiteInfo = getEmitCallSiteInfo(); | ||
974 | + Options.EnableDebugEntryValues = getEnableDebugEntryValues(); | ||
975 | + Options.ForceDwarfFrameSection = getForceDwarfFrameSection(); | ||
976 | + | ||
977 | + Options.MCOptions = mc::InitMCTargetOptionsFromFlags(); | ||
978 | + | ||
979 | + Options.ThreadModel = getThreadModel(); | ||
980 | + Options.EABIVersion = getEABIVersion(); | ||
981 | + Options.DebuggerTuning = getDebuggerTuningOpt(); | ||
982 | + | ||
983 | + return Options; | ||
984 | +} | ||
985 | + | ||
986 | +std::string codegen::getCPUStr() { | ||
987 | + // If user asked for the 'native' CPU, autodetect here. If autodection fails, | ||
988 | + // this will set the CPU to an empty string which tells the target to | ||
989 | + // pick a basic default. | ||
990 | + if (getMCPU() == "native") | ||
991 | + return std::string(sys::getHostCPUName()); | ||
992 | + | ||
993 | + return getMCPU(); | ||
994 | +} | ||
995 | + | ||
996 | +std::string codegen::getFeaturesStr() { | ||
997 | + SubtargetFeatures Features; | ||
998 | + | ||
999 | + // If user asked for the 'native' CPU, we need to autodetect features. | ||
1000 | + // This is necessary for x86 where the CPU might not support all the | ||
1001 | + // features the autodetected CPU name lists in the target. For example, | ||
1002 | + // not all Sandybridge processors support AVX. | ||
1003 | + if (getMCPU() == "native") { | ||
1004 | + StringMap<bool> HostFeatures; | ||
1005 | + if (sys::getHostCPUFeatures(HostFeatures)) | ||
1006 | + for (auto &F : HostFeatures) | ||
1007 | + Features.AddFeature(F.first(), F.second); | ||
1008 | + } | ||
1009 | + | ||
1010 | + for (auto const &MAttr : getMAttrs()) | ||
1011 | + Features.AddFeature(MAttr); | ||
1012 | + | ||
1013 | + return Features.getString(); | ||
1014 | +} | ||
1015 | + | ||
1016 | +std::vector<std::string> codegen::getFeatureList() { | ||
1017 | + SubtargetFeatures Features; | ||
1018 | + | ||
1019 | + // If user asked for the 'native' CPU, we need to autodetect features. | ||
1020 | + // This is necessary for x86 where the CPU might not support all the | ||
1021 | + // features the autodetected CPU name lists in the target. For example, | ||
1022 | + // not all Sandybridge processors support AVX. | ||
1023 | + if (getMCPU() == "native") { | ||
1024 | + StringMap<bool> HostFeatures; | ||
1025 | + if (sys::getHostCPUFeatures(HostFeatures)) | ||
1026 | + for (auto &F : HostFeatures) | ||
1027 | + Features.AddFeature(F.first(), F.second); | ||
1028 | + } | ||
1029 | + | ||
1030 | + for (auto const &MAttr : getMAttrs()) | ||
1031 | + Features.AddFeature(MAttr); | ||
1032 | + | ||
1033 | + return Features.getFeatures(); | ||
1034 | +} | ||
1035 | + | ||
1036 | +void codegen::renderBoolStringAttr(AttrBuilder &B, StringRef Name, bool Val) { | ||
1037 | + B.addAttribute(Name, Val ? "true" : "false"); | ||
1038 | +} | ||
1039 | + | ||
1040 | +#define HANDLE_BOOL_ATTR(CL, AttrName) \ | ||
1041 | + do { \ | ||
1042 | + if (CL->getNumOccurrences() > 0 && !F.hasFnAttribute(AttrName)) \ | ||
1043 | + renderBoolStringAttr(NewAttrs, AttrName, *CL); \ | ||
1044 | + } while (0) | ||
1045 | + | ||
1046 | +/// Set function attributes of function \p F based on CPU, Features, and command | ||
1047 | +/// line flags. | ||
1048 | +void codegen::setFunctionAttributes(StringRef CPU, StringRef Features, | ||
1049 | + Function &F) { | ||
1050 | + auto &Ctx = F.getContext(); | ||
1051 | + AttributeList Attrs = F.getAttributes(); | ||
1052 | + AttrBuilder NewAttrs; | ||
1053 | + | ||
1054 | + if (!CPU.empty() && !F.hasFnAttribute("target-cpu")) | ||
1055 | + NewAttrs.addAttribute("target-cpu", CPU); | ||
1056 | + if (!Features.empty()) { | ||
1057 | + // Append the command line features to any that are already on the function. | ||
1058 | + StringRef OldFeatures = | ||
1059 | + F.getFnAttribute("target-features").getValueAsString(); | ||
1060 | + if (OldFeatures.empty()) | ||
1061 | + NewAttrs.addAttribute("target-features", Features); | ||
1062 | + else { | ||
1063 | + SmallString<256> Appended(OldFeatures); | ||
1064 | + Appended.push_back(','); | ||
1065 | + Appended.append(Features); | ||
1066 | + NewAttrs.addAttribute("target-features", Appended); | ||
1067 | + } | ||
1068 | + } | ||
1069 | + if (FramePointerUsageView->getNumOccurrences() > 0 && | ||
1070 | + !F.hasFnAttribute("frame-pointer")) { | ||
1071 | + if (getFramePointerUsage() == FramePointer::All) | ||
1072 | + NewAttrs.addAttribute("frame-pointer", "all"); | ||
1073 | + else if (getFramePointerUsage() == FramePointer::NonLeaf) | ||
1074 | + NewAttrs.addAttribute("frame-pointer", "non-leaf"); | ||
1075 | + else if (getFramePointerUsage() == FramePointer::None) | ||
1076 | + NewAttrs.addAttribute("frame-pointer", "none"); | ||
1077 | + } | ||
1078 | + if (DisableTailCallsView->getNumOccurrences() > 0) | ||
1079 | + NewAttrs.addAttribute("disable-tail-calls", | ||
1080 | + toStringRef(getDisableTailCalls())); | ||
1081 | + if (getStackRealign()) | ||
1082 | + NewAttrs.addAttribute("stackrealign"); | ||
1083 | + | ||
1084 | + HANDLE_BOOL_ATTR(EnableUnsafeFPMathView, "unsafe-fp-math"); | ||
1085 | + HANDLE_BOOL_ATTR(EnableNoInfsFPMathView, "no-infs-fp-math"); | ||
1086 | + HANDLE_BOOL_ATTR(EnableNoNaNsFPMathView, "no-nans-fp-math"); | ||
1087 | + HANDLE_BOOL_ATTR(EnableNoSignedZerosFPMathView, "no-signed-zeros-fp-math"); | ||
1088 | + | ||
1089 | + if (TrapFuncNameView->getNumOccurrences() > 0) | ||
1090 | + for (auto &B : F) | ||
1091 | + for (auto &I : B) | ||
1092 | + if (auto *Call = dyn_cast<CallInst>(&I)) | ||
1093 | + if (const auto *F = Call->getCalledFunction()) | ||
1094 | + if (F->getIntrinsicID() == Intrinsic::debugtrap || | ||
1095 | + F->getIntrinsicID() == Intrinsic::trap) | ||
1096 | + Call->addAttribute( | ||
1097 | + AttributeList::FunctionIndex, | ||
1098 | + Attribute::get(Ctx, "trap-func-name", getTrapFuncName())); | ||
1099 | + | ||
1100 | + // Let NewAttrs override Attrs. | ||
1101 | + F.setAttributes( | ||
1102 | + Attrs.addAttributes(Ctx, AttributeList::FunctionIndex, NewAttrs)); | ||
1103 | +} | ||
1104 | + | ||
1105 | +/// Set function attributes of functions in Module M based on CPU, | ||
1106 | +/// Features, and command line flags. | ||
1107 | +void codegen::setFunctionAttributes(StringRef CPU, StringRef Features, | ||
1108 | + Module &M) { | ||
1109 | + for (Function &F : M) | ||
1110 | + setFunctionAttributes(CPU, Features, F); | ||
1111 | +} | ||
1112 | diff --git a/llvm/lib/MC/CMakeLists.txt b/llvm/lib/MC/CMakeLists.txt | ||
1113 | index de2e47d8d9b2..ab809daf5273 100644 | ||
1114 | --- a/llvm/lib/MC/CMakeLists.txt | ||
1115 | +++ b/llvm/lib/MC/CMakeLists.txt | ||
1116 | @@ -44,6 +44,7 @@ add_llvm_component_library(LLVMMC | ||
1117 | MCSymbol.cpp | ||
1118 | MCSymbolELF.cpp | ||
1119 | MCTargetOptions.cpp | ||
1120 | + MCTargetOptionsCommandFlags.cpp | ||
1121 | MCValue.cpp | ||
1122 | MCWasmObjectTargetWriter.cpp | ||
1123 | MCWasmStreamer.cpp | ||
1124 | diff --git a/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp b/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp | ||
1125 | new file mode 100644 | ||
1126 | index 000000000000..3ca34061241a | ||
1127 | --- /dev/null | ||
1128 | +++ b/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp | ||
1129 | @@ -0,0 +1,105 @@ | ||
1130 | +//===-- MCTargetOptionsCommandFlags.cpp --------------------------*- C++ | ||
1131 | +//-*-===// | ||
1132 | +// | ||
1133 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
1134 | +// See https://llvm.org/LICENSE.txt for license information. | ||
1135 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
1136 | +// | ||
1137 | +//===----------------------------------------------------------------------===// | ||
1138 | +// | ||
1139 | +// This file contains machine code-specific flags that are shared between | ||
1140 | +// different command line tools. | ||
1141 | +// | ||
1142 | +//===----------------------------------------------------------------------===// | ||
1143 | + | ||
1144 | +#include "llvm/MC/MCTargetOptionsCommandFlags.h" | ||
1145 | + | ||
1146 | +using namespace llvm; | ||
1147 | + | ||
1148 | +#define MCOPT(TY, NAME) \ | ||
1149 | + static cl::opt<TY> *NAME##View; \ | ||
1150 | + TY llvm::mc::get##NAME() { \ | ||
1151 | + assert(NAME##View && "RegisterMCTargetOptionsFlags not created."); \ | ||
1152 | + return *NAME##View; \ | ||
1153 | + } | ||
1154 | + | ||
1155 | +#define MCOPT_EXP(TY, NAME) \ | ||
1156 | + MCOPT(TY, NAME) \ | ||
1157 | + Optional<TY> llvm::mc::getExplicit##NAME() { \ | ||
1158 | + if (NAME##View->getNumOccurrences()) { \ | ||
1159 | + TY res = *NAME##View; \ | ||
1160 | + return res; \ | ||
1161 | + } \ | ||
1162 | + return None; \ | ||
1163 | + } | ||
1164 | + | ||
1165 | +MCOPT_EXP(bool, RelaxAll) | ||
1166 | +MCOPT(bool, IncrementalLinkerCompatible) | ||
1167 | +MCOPT(int, DwarfVersion) | ||
1168 | +MCOPT(bool, ShowMCInst) | ||
1169 | +MCOPT(bool, FatalWarnings) | ||
1170 | +MCOPT(bool, NoWarn) | ||
1171 | +MCOPT(bool, NoDeprecatedWarn) | ||
1172 | +MCOPT(std::string, ABIName) | ||
1173 | + | ||
1174 | +llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() { | ||
1175 | +#define MCBINDOPT(NAME) \ | ||
1176 | + do { \ | ||
1177 | + NAME##View = std::addressof(NAME); \ | ||
1178 | + } while (0) | ||
1179 | + | ||
1180 | + static cl::opt<bool> RelaxAll( | ||
1181 | + "mc-relax-all", cl::desc("When used with filetype=obj, relax all fixups " | ||
1182 | + "in the emitted object file")); | ||
1183 | + MCBINDOPT(RelaxAll); | ||
1184 | + | ||
1185 | + static cl::opt<bool> IncrementalLinkerCompatible( | ||
1186 | + "incremental-linker-compatible", | ||
1187 | + cl::desc( | ||
1188 | + "When used with filetype=obj, " | ||
1189 | + "emit an object file which can be used with an incremental linker")); | ||
1190 | + MCBINDOPT(IncrementalLinkerCompatible); | ||
1191 | + | ||
1192 | + static cl::opt<int> DwarfVersion("dwarf-version", cl::desc("Dwarf version"), | ||
1193 | + cl::init(0)); | ||
1194 | + MCBINDOPT(DwarfVersion); | ||
1195 | + | ||
1196 | + static cl::opt<bool> ShowMCInst( | ||
1197 | + "asm-show-inst", | ||
1198 | + cl::desc("Emit internal instruction representation to assembly file")); | ||
1199 | + MCBINDOPT(ShowMCInst); | ||
1200 | + | ||
1201 | + static cl::opt<bool> FatalWarnings("fatal-warnings", | ||
1202 | + cl::desc("Treat warnings as errors")); | ||
1203 | + MCBINDOPT(FatalWarnings); | ||
1204 | + | ||
1205 | + static cl::opt<bool> NoWarn("no-warn", cl::desc("Suppress all warnings")); | ||
1206 | + static cl::alias NoWarnW("W", cl::desc("Alias for --no-warn"), | ||
1207 | + cl::aliasopt(NoWarn)); | ||
1208 | + MCBINDOPT(NoWarn); | ||
1209 | + | ||
1210 | + static cl::opt<bool> NoDeprecatedWarn( | ||
1211 | + "no-deprecated-warn", cl::desc("Suppress all deprecated warnings")); | ||
1212 | + MCBINDOPT(NoDeprecatedWarn); | ||
1213 | + | ||
1214 | + static cl::opt<std::string> ABIName( | ||
1215 | + "target-abi", cl::Hidden, | ||
1216 | + cl::desc("The name of the ABI to be targeted from the backend."), | ||
1217 | + cl::init("")); | ||
1218 | + MCBINDOPT(ABIName); | ||
1219 | + | ||
1220 | +#undef MCBINDOPT | ||
1221 | +} | ||
1222 | + | ||
1223 | +MCTargetOptions llvm::mc::InitMCTargetOptionsFromFlags() { | ||
1224 | + MCTargetOptions Options; | ||
1225 | + Options.MCRelaxAll = getRelaxAll(); | ||
1226 | + Options.MCIncrementalLinkerCompatible = getIncrementalLinkerCompatible(); | ||
1227 | + Options.DwarfVersion = getDwarfVersion(); | ||
1228 | + Options.ShowMCInst = getShowMCInst(); | ||
1229 | + Options.ABIName = getABIName(); | ||
1230 | + Options.MCFatalWarnings = getFatalWarnings(); | ||
1231 | + Options.MCNoWarn = getNoWarn(); | ||
1232 | + Options.MCNoDeprecatedWarn = getNoDeprecatedWarn(); | ||
1233 | + return Options; | ||
1234 | +} | ||
1235 | diff --git a/llvm/tools/dsymutil/DwarfStreamer.cpp b/llvm/tools/dsymutil/DwarfStreamer.cpp | ||
1236 | index 3e132c29eada..eb068effbc71 100644 | ||
1237 | --- a/llvm/tools/dsymutil/DwarfStreamer.cpp | ||
1238 | +++ b/llvm/tools/dsymutil/DwarfStreamer.cpp | ||
1239 | @@ -13,13 +13,16 @@ | ||
1240 | #include "llvm/DWARFLinker/DWARFLinkerCompileUnit.h" | ||
1241 | #include "llvm/DebugInfo/DWARF/DWARFContext.h" | ||
1242 | #include "llvm/MC/MCTargetOptions.h" | ||
1243 | -#include "llvm/MC/MCTargetOptionsCommandFlags.inc" | ||
1244 | +#include "llvm/MC/MCTargetOptionsCommandFlags.h" | ||
1245 | #include "llvm/Support/LEB128.h" | ||
1246 | #include "llvm/Support/TargetRegistry.h" | ||
1247 | #include "llvm/Target/TargetMachine.h" | ||
1248 | #include "llvm/Target/TargetOptions.h" | ||
1249 | |||
1250 | namespace llvm { | ||
1251 | + | ||
1252 | +static mc::RegisterMCTargetOptionsFlags MOF; | ||
1253 | + | ||
1254 | namespace dsymutil { | ||
1255 | |||
1256 | /// Retrieve the section named \a SecName in \a Obj. | ||
1257 | @@ -61,7 +64,7 @@ bool DwarfStreamer::init(Triple TheTriple) { | ||
1258 | if (!MRI) | ||
1259 | return error(Twine("no register info for target ") + TripleName, Context); | ||
1260 | |||
1261 | - MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); | ||
1262 | + MCTargetOptions MCOptions = mc::InitMCTargetOptionsFromFlags(); | ||
1263 | MAI.reset(TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); | ||
1264 | if (!MAI) | ||
1265 | return error("no asm info for target " + TripleName, Context); | ||
1266 | diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp | ||
1267 | index 406079dad307..95e72b861197 100644 | ||
1268 | --- a/llvm/tools/gold/gold-plugin.cpp | ||
1269 | +++ b/llvm/tools/gold/gold-plugin.cpp | ||
1270 | @@ -14,7 +14,7 @@ | ||
1271 | #include "llvm/ADT/Statistic.h" | ||
1272 | #include "llvm/Bitcode/BitcodeReader.h" | ||
1273 | #include "llvm/Bitcode/BitcodeWriter.h" | ||
1274 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
1275 | +#include "llvm/CodeGen/CommandFlags.h" | ||
1276 | #include "llvm/Config/config.h" // plugin-api.h requires HAVE_STDINT_H | ||
1277 | #include "llvm/IR/Constants.h" | ||
1278 | #include "llvm/IR/DiagnosticPrinter.h" | ||
1279 | @@ -50,6 +50,8 @@ | ||
1280 | using namespace llvm; | ||
1281 | using namespace lto; | ||
1282 | |||
1283 | +static codegen::RegisterCodeGenFlags CodeGenFlags; | ||
1284 | + | ||
1285 | // FIXME: Remove when binutils 2.31 (containing gold 1.16) is the minimum | ||
1286 | // required version. | ||
1287 | typedef enum ld_plugin_status (*ld_plugin_get_wrap_symbols)( | ||
1288 | @@ -842,21 +844,21 @@ static std::unique_ptr<LTO> createLTO(IndexWriteCallback OnIndexWrite, | ||
1289 | ThinBackend Backend; | ||
1290 | |||
1291 | Conf.CPU = options::mcpu; | ||
1292 | - Conf.Options = InitTargetOptionsFromCodeGenFlags(); | ||
1293 | + Conf.Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
1294 | |||
1295 | // Disable the new X86 relax relocations since gold might not support them. | ||
1296 | // FIXME: Check the gold version or add a new option to enable them. | ||
1297 | Conf.Options.RelaxELFRelocations = false; | ||
1298 | |||
1299 | // Toggle function/data sections. | ||
1300 | - if (FunctionSections.getNumOccurrences() == 0) | ||
1301 | + if (!codegen::getExplicitFunctionSections()) | ||
1302 | Conf.Options.FunctionSections = SplitSections; | ||
1303 | - if (DataSections.getNumOccurrences() == 0) | ||
1304 | + if (!codegen::getExplicitDataSections()) | ||
1305 | Conf.Options.DataSections = SplitSections; | ||
1306 | |||
1307 | - Conf.MAttrs = MAttrs; | ||
1308 | - Conf.RelocModel = RelocationModel; | ||
1309 | - Conf.CodeModel = getCodeModel(); | ||
1310 | + Conf.MAttrs = codegen::getMAttrs(); | ||
1311 | + Conf.RelocModel = codegen::getExplicitRelocModel(); | ||
1312 | + Conf.CodeModel = codegen::getExplicitCodeModel(); | ||
1313 | Conf.CGOptLevel = getCGOptLevel(); | ||
1314 | Conf.DisableVerify = options::DisableVerify; | ||
1315 | Conf.OptLevel = options::OptLevel; | ||
1316 | diff --git a/llvm/tools/llc/CMakeLists.txt b/llvm/tools/llc/CMakeLists.txt | ||
1317 | index 880deefa539c..479bc6b55b27 100644 | ||
1318 | --- a/llvm/tools/llc/CMakeLists.txt | ||
1319 | +++ b/llvm/tools/llc/CMakeLists.txt | ||
1320 | @@ -26,4 +26,5 @@ add_llvm_tool(llc | ||
1321 | intrinsics_gen | ||
1322 | SUPPORT_PLUGINS | ||
1323 | ) | ||
1324 | + | ||
1325 | export_executable_symbols(llc) | ||
1326 | diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp | ||
1327 | index b35f8e853c30..4c41ed292fdc 100644 | ||
1328 | --- a/llvm/tools/llc/llc.cpp | ||
1329 | +++ b/llvm/tools/llc/llc.cpp | ||
1330 | @@ -15,7 +15,7 @@ | ||
1331 | #include "llvm/ADT/STLExtras.h" | ||
1332 | #include "llvm/ADT/Triple.h" | ||
1333 | #include "llvm/Analysis/TargetLibraryInfo.h" | ||
1334 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
1335 | +#include "llvm/CodeGen/CommandFlags.h" | ||
1336 | #include "llvm/CodeGen/LinkAllAsmWriterComponents.h" | ||
1337 | #include "llvm/CodeGen/LinkAllCodegenComponents.h" | ||
1338 | #include "llvm/CodeGen/MIRParser/MIRParser.h" | ||
1339 | @@ -55,6 +55,8 @@ | ||
1340 | #include <memory> | ||
1341 | using namespace llvm; | ||
1342 | |||
1343 | +static codegen::RegisterCodeGenFlags CGF; | ||
1344 | + | ||
1345 | // General options for llc. Other pass-specific options are specified | ||
1346 | // within the corresponding llc passes, and target-specific options | ||
1347 | // and back-end code generation options are specified with the target machine. | ||
1348 | @@ -202,7 +204,7 @@ static std::unique_ptr<ToolOutputFile> GetOutputStream(const char *TargetName, | ||
1349 | else | ||
1350 | OutputFilename = IFN; | ||
1351 | |||
1352 | - switch (FileType) { | ||
1353 | + switch (codegen::getFileType()) { | ||
1354 | case CGFT_AssemblyFile: | ||
1355 | if (TargetName[0] == 'c') { | ||
1356 | if (TargetName[1] == 0) | ||
1357 | @@ -229,7 +231,7 @@ static std::unique_ptr<ToolOutputFile> GetOutputStream(const char *TargetName, | ||
1358 | |||
1359 | // Decide if we need "binary" output. | ||
1360 | bool Binary = false; | ||
1361 | - switch (FileType) { | ||
1362 | + switch (codegen::getFileType()) { | ||
1363 | case CGFT_AssemblyFile: | ||
1364 | break; | ||
1365 | case CGFT_ObjectFile: | ||
1366 | @@ -395,14 +397,16 @@ static int compileModule(char **argv, LLVMContext &Context) { | ||
1367 | std::unique_ptr<Module> M; | ||
1368 | std::unique_ptr<MIRParser> MIR; | ||
1369 | Triple TheTriple; | ||
1370 | - std::string CPUStr = getCPUStr(), FeaturesStr = getFeaturesStr(); | ||
1371 | + std::string CPUStr = codegen::getCPUStr(), | ||
1372 | + FeaturesStr = codegen::getFeaturesStr(); | ||
1373 | |||
1374 | // Set attributes on functions as loaded from MIR from command line arguments. | ||
1375 | auto setMIRFunctionAttributes = [&CPUStr, &FeaturesStr](Function &F) { | ||
1376 | - setFunctionAttributes(CPUStr, FeaturesStr, F); | ||
1377 | + codegen::setFunctionAttributes(CPUStr, FeaturesStr, F); | ||
1378 | }; | ||
1379 | |||
1380 | - bool SkipModule = MCPU == "help" || | ||
1381 | + auto MAttrs = codegen::getMAttrs(); | ||
1382 | + bool SkipModule = codegen::getMCPU() == "help" || | ||
1383 | (!MAttrs.empty() && MAttrs.front() == "help"); | ||
1384 | |||
1385 | // If user just wants to list available options, skip module loading | ||
1386 | @@ -433,8 +437,8 @@ static int compileModule(char **argv, LLVMContext &Context) { | ||
1387 | |||
1388 | // Get the target specific parser. | ||
1389 | std::string Error; | ||
1390 | - const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple, | ||
1391 | - Error); | ||
1392 | + const Target *TheTarget = | ||
1393 | + TargetRegistry::lookupTarget(codegen::getMArch(), TheTriple, Error); | ||
1394 | if (!TheTarget) { | ||
1395 | WithColor::error(errs(), argv[0]) << Error; | ||
1396 | return 1; | ||
1397 | @@ -452,7 +456,7 @@ static int compileModule(char **argv, LLVMContext &Context) { | ||
1398 | case '3': OLvl = CodeGenOpt::Aggressive; break; | ||
1399 | } | ||
1400 | |||
1401 | - TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
1402 | + TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
1403 | Options.DisableIntegratedAS = NoIntegratedAssembler; | ||
1404 | Options.MCOptions.ShowMCEncoding = ShowMCEncoding; | ||
1405 | Options.MCOptions.MCUseDwarfDirectory = EnableDwarfDirectory; | ||
1406 | @@ -462,8 +466,8 @@ static int compileModule(char **argv, LLVMContext &Context) { | ||
1407 | Options.MCOptions.SplitDwarfFile = SplitDwarfFile; | ||
1408 | |||
1409 | std::unique_ptr<TargetMachine> Target(TheTarget->createTargetMachine( | ||
1410 | - TheTriple.getTriple(), CPUStr, FeaturesStr, Options, getRelocModel(), | ||
1411 | - getCodeModel(), OLvl)); | ||
1412 | + TheTriple.getTriple(), CPUStr, FeaturesStr, Options, codegen::getExplicitRelocModel(), | ||
1413 | + codegen::getExplicitCodeModel(), OLvl)); | ||
1414 | |||
1415 | assert(Target && "Could not allocate target machine!"); | ||
1416 | |||
1417 | @@ -474,8 +478,8 @@ static int compileModule(char **argv, LLVMContext &Context) { | ||
1418 | return 0; | ||
1419 | |||
1420 | assert(M && "Should have exited if we didn't have a module!"); | ||
1421 | - if (FloatABIForCalls != FloatABI::Default) | ||
1422 | - Options.FloatABIType = FloatABIForCalls; | ||
1423 | + if (codegen::getFloatABIForCalls() != FloatABI::Default) | ||
1424 | + Options.FloatABIType = codegen::getFloatABIForCalls(); | ||
1425 | |||
1426 | // Figure out where we are going to send the output. | ||
1427 | std::unique_ptr<ToolOutputFile> Out = | ||
1428 | @@ -522,10 +526,9 @@ static int compileModule(char **argv, LLVMContext &Context) { | ||
1429 | |||
1430 | // Override function attributes based on CPUStr, FeaturesStr, and command line | ||
1431 | // flags. | ||
1432 | - setFunctionAttributes(CPUStr, FeaturesStr, *M); | ||
1433 | + codegen::setFunctionAttributes(CPUStr, FeaturesStr, *M); | ||
1434 | |||
1435 | - if (RelaxAll.getNumOccurrences() > 0 && | ||
1436 | - FileType != CGFT_ObjectFile) | ||
1437 | + if (mc::getExplicitRelaxAll() && codegen::getFileType() != CGFT_ObjectFile) | ||
1438 | WithColor::warning(errs(), argv[0]) | ||
1439 | << ": warning: ignoring -mc-relax-all because filetype != obj"; | ||
1440 | |||
1441 | @@ -536,7 +539,7 @@ static int compileModule(char **argv, LLVMContext &Context) { | ||
1442 | // so we can memcmp the contents in CompileTwice mode | ||
1443 | SmallVector<char, 0> Buffer; | ||
1444 | std::unique_ptr<raw_svector_ostream> BOS; | ||
1445 | - if ((FileType != CGFT_AssemblyFile && | ||
1446 | + if ((codegen::getFileType() != CGFT_AssemblyFile && | ||
1447 | !Out->os().supportsSeeking()) || | ||
1448 | CompileTwice) { | ||
1449 | BOS = std::make_unique<raw_svector_ostream>(Buffer); | ||
1450 | @@ -575,9 +578,9 @@ static int compileModule(char **argv, LLVMContext &Context) { | ||
1451 | TPC.setInitialized(); | ||
1452 | PM.add(createPrintMIRPass(*OS)); | ||
1453 | PM.add(createFreeMachineFunctionPass()); | ||
1454 | - } else if (Target->addPassesToEmitFile(PM, *OS, | ||
1455 | - DwoOut ? &DwoOut->os() : nullptr, | ||
1456 | - FileType, NoVerify, MMIWP)) { | ||
1457 | + } else if (Target->addPassesToEmitFile( | ||
1458 | + PM, *OS, DwoOut ? &DwoOut->os() : nullptr, | ||
1459 | + codegen::getFileType(), NoVerify, MMIWP)) { | ||
1460 | WithColor::warning(errs(), argv[0]) | ||
1461 | << "target does not support generation of this" | ||
1462 | << " file type!\n"; | ||
1463 | diff --git a/llvm/tools/lli/CMakeLists.txt b/llvm/tools/lli/CMakeLists.txt | ||
1464 | index db163ad131e8..bc6ef213b8fd 100644 | ||
1465 | --- a/llvm/tools/lli/CMakeLists.txt | ||
1466 | +++ b/llvm/tools/lli/CMakeLists.txt | ||
1467 | @@ -53,4 +53,5 @@ add_llvm_tool(lli | ||
1468 | DEPENDS | ||
1469 | intrinsics_gen | ||
1470 | ) | ||
1471 | + | ||
1472 | export_executable_symbols(lli) | ||
1473 | diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp | ||
1474 | index 0efd0df2c12b..b6a4e3f2833c 100644 | ||
1475 | --- a/llvm/tools/lli/lli.cpp | ||
1476 | +++ b/llvm/tools/lli/lli.cpp | ||
1477 | @@ -16,7 +16,7 @@ | ||
1478 | #include "llvm/ADT/StringExtras.h" | ||
1479 | #include "llvm/ADT/Triple.h" | ||
1480 | #include "llvm/Bitcode/BitcodeReader.h" | ||
1481 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
1482 | +#include "llvm/CodeGen/CommandFlags.h" | ||
1483 | #include "llvm/CodeGen/LinkAllCodegenComponents.h" | ||
1484 | #include "llvm/Config/llvm-config.h" | ||
1485 | #include "llvm/ExecutionEngine/GenericValue.h" | ||
1486 | @@ -67,6 +67,8 @@ | ||
1487 | |||
1488 | using namespace llvm; | ||
1489 | |||
1490 | +static codegen::RegisterCodeGenFlags CGF; | ||
1491 | + | ||
1492 | #define DEBUG_TYPE "lli" | ||
1493 | |||
1494 | namespace { | ||
1495 | @@ -410,13 +412,13 @@ int main(int argc, char **argv, char * const *envp) { | ||
1496 | |||
1497 | std::string ErrorMsg; | ||
1498 | EngineBuilder builder(std::move(Owner)); | ||
1499 | - builder.setMArch(MArch); | ||
1500 | - builder.setMCPU(getCPUStr()); | ||
1501 | - builder.setMAttrs(getFeatureList()); | ||
1502 | - if (RelocModel.getNumOccurrences()) | ||
1503 | - builder.setRelocationModel(RelocModel); | ||
1504 | - if (CMModel.getNumOccurrences()) | ||
1505 | - builder.setCodeModel(CMModel); | ||
1506 | + builder.setMArch(codegen::getMArch()); | ||
1507 | + builder.setMCPU(codegen::getCPUStr()); | ||
1508 | + builder.setMAttrs(codegen::getFeatureList()); | ||
1509 | + if (auto RM = codegen::getExplicitRelocModel()) | ||
1510 | + builder.setRelocationModel(RM.getValue()); | ||
1511 | + if (auto CM = codegen::getExplicitCodeModel()) | ||
1512 | + builder.setCodeModel(CM.getValue()); | ||
1513 | builder.setErrorStr(&ErrorMsg); | ||
1514 | builder.setEngineKind(ForceInterpreter | ||
1515 | ? EngineKind::Interpreter | ||
1516 | @@ -448,9 +450,9 @@ int main(int argc, char **argv, char * const *envp) { | ||
1517 | |||
1518 | builder.setOptLevel(getOptLevel()); | ||
1519 | |||
1520 | - TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
1521 | - if (FloatABIForCalls != FloatABI::Default) | ||
1522 | - Options.FloatABIType = FloatABIForCalls; | ||
1523 | + TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
1524 | + if (codegen::getFloatABIForCalls() != FloatABI::Default) | ||
1525 | + Options.FloatABIType = codegen::getFloatABIForCalls(); | ||
1526 | |||
1527 | builder.setTargetOptions(Options); | ||
1528 | |||
1529 | @@ -762,18 +764,15 @@ int runOrcLazyJIT(const char *ProgName) { | ||
1530 | TT.empty() ? ExitOnErr(orc::JITTargetMachineBuilder::detectHost()) | ||
1531 | : orc::JITTargetMachineBuilder(Triple(TT))); | ||
1532 | |||
1533 | - if (!MArch.empty()) | ||
1534 | - Builder.getJITTargetMachineBuilder()->getTargetTriple().setArchName(MArch); | ||
1535 | + if (!codegen::getMArch().empty()) | ||
1536 | + Builder.getJITTargetMachineBuilder()->getTargetTriple().setArchName( | ||
1537 | + codegen::getMArch()); | ||
1538 | |||
1539 | Builder.getJITTargetMachineBuilder() | ||
1540 | - ->setCPU(getCPUStr()) | ||
1541 | - .addFeatures(getFeatureList()) | ||
1542 | - .setRelocationModel(RelocModel.getNumOccurrences() | ||
1543 | - ? Optional<Reloc::Model>(RelocModel) | ||
1544 | - : None) | ||
1545 | - .setCodeModel(CMModel.getNumOccurrences() | ||
1546 | - ? Optional<CodeModel::Model>(CMModel) | ||
1547 | - : None); | ||
1548 | + ->setCPU(codegen::getCPUStr()) | ||
1549 | + .addFeatures(codegen::getFeatureList()) | ||
1550 | + .setRelocationModel(codegen::getExplicitRelocModel()) | ||
1551 | + .setCodeModel(codegen::getExplicitCodeModel()); | ||
1552 | |||
1553 | Builder.setLazyCompileFailureAddr( | ||
1554 | pointerToJITTargetAddress(exitOnLazyCallThroughFailure)); | ||
1555 | diff --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp | ||
1556 | index 23513ef8fb4e..8cfd433d5da3 100644 | ||
1557 | --- a/llvm/tools/llvm-dwp/llvm-dwp.cpp | ||
1558 | +++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp | ||
1559 | @@ -27,7 +27,7 @@ | ||
1560 | #include "llvm/MC/MCObjectWriter.h" | ||
1561 | #include "llvm/MC/MCRegisterInfo.h" | ||
1562 | #include "llvm/MC/MCStreamer.h" | ||
1563 | -#include "llvm/MC/MCTargetOptionsCommandFlags.inc" | ||
1564 | +#include "llvm/MC/MCTargetOptionsCommandFlags.h" | ||
1565 | #include "llvm/Object/Decompressor.h" | ||
1566 | #include "llvm/Object/ObjectFile.h" | ||
1567 | #include "llvm/Support/DataExtractor.h" | ||
1568 | @@ -46,6 +46,8 @@ | ||
1569 | using namespace llvm; | ||
1570 | using namespace llvm::object; | ||
1571 | |||
1572 | +static mc::RegisterMCTargetOptionsFlags MCTargetOptionsFlags; | ||
1573 | + | ||
1574 | cl::OptionCategory DwpCategory("Specific Options"); | ||
1575 | static cl::list<std::string> InputFiles(cl::Positional, cl::ZeroOrMore, | ||
1576 | cl::desc("<input files>"), | ||
1577 | @@ -676,7 +678,7 @@ int main(int argc, char **argv) { | ||
1578 | if (!MRI) | ||
1579 | return error(Twine("no register info for target ") + TripleName, Context); | ||
1580 | |||
1581 | - MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); | ||
1582 | + MCTargetOptions MCOptions = llvm::mc::InitMCTargetOptionsFromFlags(); | ||
1583 | std::unique_ptr<MCAsmInfo> MAI( | ||
1584 | TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); | ||
1585 | if (!MAI) | ||
1586 | diff --git a/llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp b/llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp | ||
1587 | index b71ed4a70566..627e9ab4c03f 100644 | ||
1588 | --- a/llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp | ||
1589 | +++ b/llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp | ||
1590 | @@ -14,7 +14,7 @@ | ||
1591 | #include "llvm/Analysis/TargetLibraryInfo.h" | ||
1592 | #include "llvm/Bitcode/BitcodeReader.h" | ||
1593 | #include "llvm/Bitcode/BitcodeWriter.h" | ||
1594 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
1595 | +#include "llvm/CodeGen/CommandFlags.h" | ||
1596 | #include "llvm/FuzzMutate/FuzzerCLI.h" | ||
1597 | #include "llvm/FuzzMutate/IRMutator.h" | ||
1598 | #include "llvm/FuzzMutate/Operations.h" | ||
1599 | @@ -35,6 +35,8 @@ | ||
1600 | |||
1601 | using namespace llvm; | ||
1602 | |||
1603 | +static codegen::RegisterCodeGenFlags CGF; | ||
1604 | + | ||
1605 | static cl::opt<char> | ||
1606 | OptLevel("O", | ||
1607 | cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " | ||
1608 | @@ -133,14 +135,15 @@ extern "C" LLVM_ATTRIBUTE_USED int LLVMFuzzerInitialize(int *argc, | ||
1609 | // Get the target specific parser. | ||
1610 | std::string Error; | ||
1611 | const Target *TheTarget = | ||
1612 | - TargetRegistry::lookupTarget(MArch, TheTriple, Error); | ||
1613 | + TargetRegistry::lookupTarget(codegen::getMArch(), TheTriple, Error); | ||
1614 | if (!TheTarget) { | ||
1615 | errs() << argv[0] << ": " << Error; | ||
1616 | return 1; | ||
1617 | } | ||
1618 | |||
1619 | // Set up the pipeline like llc does. | ||
1620 | - std::string CPUStr = getCPUStr(), FeaturesStr = getFeaturesStr(); | ||
1621 | + std::string CPUStr = codegen::getCPUStr(), | ||
1622 | + FeaturesStr = codegen::getFeaturesStr(); | ||
1623 | |||
1624 | CodeGenOpt::Level OLvl = CodeGenOpt::Default; | ||
1625 | switch (OptLevel) { | ||
1626 | @@ -154,10 +157,10 @@ extern "C" LLVM_ATTRIBUTE_USED int LLVMFuzzerInitialize(int *argc, | ||
1627 | case '3': OLvl = CodeGenOpt::Aggressive; break; | ||
1628 | } | ||
1629 | |||
1630 | - TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
1631 | - TM.reset(TheTarget->createTargetMachine(TheTriple.getTriple(), CPUStr, | ||
1632 | - FeaturesStr, Options, getRelocModel(), | ||
1633 | - getCodeModel(), OLvl)); | ||
1634 | + TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
1635 | + TM.reset(TheTarget->createTargetMachine( | ||
1636 | + TheTriple.getTriple(), CPUStr, FeaturesStr, Options, | ||
1637 | + codegen::getExplicitRelocModel(), codegen::getExplicitCodeModel(), OLvl)); | ||
1638 | assert(TM && "Could not allocate target machine!"); | ||
1639 | |||
1640 | // Make sure we print the summary and the current unit when LLVM errors out. | ||
1641 | diff --git a/llvm/tools/llvm-lto/CMakeLists.txt b/llvm/tools/llvm-lto/CMakeLists.txt | ||
1642 | index 69868fb870c0..5128e713eecf 100644 | ||
1643 | --- a/llvm/tools/llvm-lto/CMakeLists.txt | ||
1644 | +++ b/llvm/tools/llvm-lto/CMakeLists.txt | ||
1645 | @@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS | ||
1646 | AllTargetsInfos | ||
1647 | BitReader | ||
1648 | BitWriter | ||
1649 | + CodeGen | ||
1650 | Core | ||
1651 | IRReader | ||
1652 | LTO | ||
1653 | @@ -17,7 +18,5 @@ set(LLVM_LINK_COMPONENTS | ||
1654 | add_llvm_tool(llvm-lto | ||
1655 | llvm-lto.cpp | ||
1656 | |||
1657 | - DEPENDS | ||
1658 | - intrinsics_gen | ||
1659 | + DEPENDS intrinsics_gen | ||
1660 | ) | ||
1661 | - | ||
1662 | diff --git a/llvm/tools/llvm-lto/llvm-lto.cpp b/llvm/tools/llvm-lto/llvm-lto.cpp | ||
1663 | index b47e68e82850..7886426e8945 100644 | ||
1664 | --- a/llvm/tools/llvm-lto/llvm-lto.cpp | ||
1665 | +++ b/llvm/tools/llvm-lto/llvm-lto.cpp | ||
1666 | @@ -21,7 +21,7 @@ | ||
1667 | #include "llvm/ADT/Twine.h" | ||
1668 | #include "llvm/Bitcode/BitcodeReader.h" | ||
1669 | #include "llvm/Bitcode/BitcodeWriter.h" | ||
1670 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
1671 | +#include "llvm/CodeGen/CommandFlags.h" | ||
1672 | #include "llvm/IR/DiagnosticInfo.h" | ||
1673 | #include "llvm/IR/DiagnosticPrinter.h" | ||
1674 | #include "llvm/IR/LLVMContext.h" | ||
1675 | @@ -62,6 +62,8 @@ | ||
1676 | |||
1677 | using namespace llvm; | ||
1678 | |||
1679 | +static codegen::RegisterCodeGenFlags CGF; | ||
1680 | + | ||
1681 | static cl::opt<char> | ||
1682 | OptLevel("O", cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " | ||
1683 | "(default = '-O2')"), | ||
1684 | @@ -521,7 +523,7 @@ public: | ||
1685 | ThinLTOCodeGenerator ThinGenerator; | ||
1686 | |||
1687 | ThinLTOProcessing(const TargetOptions &Options) { | ||
1688 | - ThinGenerator.setCodePICModel(getRelocModel()); | ||
1689 | + ThinGenerator.setCodePICModel(codegen::getExplicitRelocModel()); | ||
1690 | ThinGenerator.setTargetOptions(Options); | ||
1691 | ThinGenerator.setCacheDir(ThinLTOCacheDir); | ||
1692 | ThinGenerator.setCachePruningInterval(ThinLTOCachePruningInterval); | ||
1693 | @@ -873,7 +875,7 @@ int main(int argc, char **argv) { | ||
1694 | InitializeAllAsmParsers(); | ||
1695 | |||
1696 | // set up the TargetOptions for the machine | ||
1697 | - TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
1698 | + TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
1699 | |||
1700 | if (ListSymbolsOnly) { | ||
1701 | listSymbols(Options); | ||
1702 | @@ -929,7 +931,7 @@ int main(int argc, char **argv) { | ||
1703 | if (UseDiagnosticHandler) | ||
1704 | CodeGen.setDiagnosticHandler(handleDiagnostics, nullptr); | ||
1705 | |||
1706 | - CodeGen.setCodePICModel(getRelocModel()); | ||
1707 | + CodeGen.setCodePICModel(codegen::getExplicitRelocModel()); | ||
1708 | CodeGen.setFreestanding(EnableFreestanding); | ||
1709 | |||
1710 | CodeGen.setDebugInfo(LTO_DEBUG_MODEL_DWARF); | ||
1711 | @@ -980,22 +982,18 @@ int main(int argc, char **argv) { | ||
1712 | CodeGen.addMustPreserveSymbol(KeptDSOSyms[i]); | ||
1713 | |||
1714 | // Set cpu and attrs strings for the default target/subtarget. | ||
1715 | - CodeGen.setCpu(MCPU.c_str()); | ||
1716 | + CodeGen.setCpu(codegen::getMCPU().c_str()); | ||
1717 | |||
1718 | CodeGen.setOptLevel(OptLevel - '0'); | ||
1719 | |||
1720 | - std::string attrs; | ||
1721 | - for (unsigned i = 0; i < MAttrs.size(); ++i) { | ||
1722 | - if (i > 0) | ||
1723 | - attrs.append(","); | ||
1724 | - attrs.append(MAttrs[i]); | ||
1725 | - } | ||
1726 | - | ||
1727 | - if (!attrs.empty()) | ||
1728 | + auto MAttrs = codegen::getMAttrs(); | ||
1729 | + if (!MAttrs.empty()) { | ||
1730 | + std::string attrs = join(MAttrs, ","); | ||
1731 | CodeGen.setAttr(attrs); | ||
1732 | + } | ||
1733 | |||
1734 | - if (FileType.getNumOccurrences()) | ||
1735 | - CodeGen.setFileType(FileType); | ||
1736 | + if (auto FT = codegen::getExplicitFileType()) | ||
1737 | + CodeGen.setFileType(FT.getValue()); | ||
1738 | |||
1739 | if (!OutputFilename.empty()) { | ||
1740 | if (!CodeGen.optimize(DisableVerify, DisableInline, DisableGVNLoadPRE, | ||
1741 | diff --git a/llvm/tools/llvm-lto2/CMakeLists.txt b/llvm/tools/llvm-lto2/CMakeLists.txt | ||
1742 | index fa2d8624fd94..4d3364175b04 100644 | ||
1743 | --- a/llvm/tools/llvm-lto2/CMakeLists.txt | ||
1744 | +++ b/llvm/tools/llvm-lto2/CMakeLists.txt | ||
1745 | @@ -4,6 +4,7 @@ set(LLVM_LINK_COMPONENTS | ||
1746 | AllTargetsDescs | ||
1747 | AllTargetsInfos | ||
1748 | BitReader | ||
1749 | + CodeGen | ||
1750 | Core | ||
1751 | Linker | ||
1752 | LTO | ||
1753 | diff --git a/llvm/tools/llvm-lto2/llvm-lto2.cpp b/llvm/tools/llvm-lto2/llvm-lto2.cpp | ||
1754 | index 67a677dd45fb..142ba605aa2a 100644 | ||
1755 | --- a/llvm/tools/llvm-lto2/llvm-lto2.cpp | ||
1756 | +++ b/llvm/tools/llvm-lto2/llvm-lto2.cpp | ||
1757 | @@ -16,7 +16,7 @@ | ||
1758 | //===----------------------------------------------------------------------===// | ||
1759 | |||
1760 | #include "llvm/Bitcode/BitcodeReader.h" | ||
1761 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
1762 | +#include "llvm/CodeGen/CommandFlags.h" | ||
1763 | #include "llvm/IR/DiagnosticPrinter.h" | ||
1764 | #include "llvm/LTO/Caching.h" | ||
1765 | #include "llvm/LTO/LTO.h" | ||
1766 | @@ -29,6 +29,8 @@ | ||
1767 | using namespace llvm; | ||
1768 | using namespace lto; | ||
1769 | |||
1770 | +static codegen::RegisterCodeGenFlags CGF; | ||
1771 | + | ||
1772 | static cl::opt<char> | ||
1773 | OptLevel("O", cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " | ||
1774 | "(default = '-O2')"), | ||
1775 | @@ -217,12 +219,12 @@ static int run(int argc, char **argv) { | ||
1776 | exit(1); | ||
1777 | }; | ||
1778 | |||
1779 | - Conf.CPU = MCPU; | ||
1780 | - Conf.Options = InitTargetOptionsFromCodeGenFlags(); | ||
1781 | - Conf.MAttrs = MAttrs; | ||
1782 | - if (auto RM = getRelocModel()) | ||
1783 | - Conf.RelocModel = *RM; | ||
1784 | - Conf.CodeModel = getCodeModel(); | ||
1785 | + Conf.CPU = codegen::getMCPU(); | ||
1786 | + Conf.Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
1787 | + Conf.MAttrs = codegen::getMAttrs(); | ||
1788 | + if (auto RM = codegen::getExplicitRelocModel()) | ||
1789 | + Conf.RelocModel = RM.getValue(); | ||
1790 | + Conf.CodeModel = codegen::getExplicitCodeModel(); | ||
1791 | |||
1792 | Conf.DebugPassManager = DebugPassManager; | ||
1793 | |||
1794 | @@ -264,8 +266,8 @@ static int run(int argc, char **argv) { | ||
1795 | return 1; | ||
1796 | } | ||
1797 | |||
1798 | - if (FileType.getNumOccurrences()) | ||
1799 | - Conf.CGFileType = FileType; | ||
1800 | + if (auto FT = codegen::getExplicitFileType()) | ||
1801 | + Conf.CGFileType = FT.getValue(); | ||
1802 | |||
1803 | Conf.OverrideTriple = OverrideTriple; | ||
1804 | Conf.DefaultTriple = DefaultTriple; | ||
1805 | diff --git a/llvm/tools/llvm-mc-assemble-fuzzer/CMakeLists.txt b/llvm/tools/llvm-mc-assemble-fuzzer/CMakeLists.txt | ||
1806 | index fb6befd3c54a..6bbc502e2eee 100644 | ||
1807 | --- a/llvm/tools/llvm-mc-assemble-fuzzer/CMakeLists.txt | ||
1808 | +++ b/llvm/tools/llvm-mc-assemble-fuzzer/CMakeLists.txt | ||
1809 | @@ -7,6 +7,7 @@ set(LLVM_LINK_COMPONENTS | ||
1810 | MCParser | ||
1811 | Support | ||
1812 | ) | ||
1813 | + | ||
1814 | add_llvm_fuzzer(llvm-mc-assemble-fuzzer | ||
1815 | llvm-mc-assemble-fuzzer.cpp | ||
1816 | ) | ||
1817 | diff --git a/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp b/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp | ||
1818 | index 6c5961f7027c..29699c634bfa 100644 | ||
1819 | --- a/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp | ||
1820 | +++ b/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp | ||
1821 | @@ -9,7 +9,6 @@ | ||
1822 | //===----------------------------------------------------------------------===// | ||
1823 | |||
1824 | #include "llvm-c/Target.h" | ||
1825 | -#include "llvm/MC/SubtargetFeature.h" | ||
1826 | #include "llvm/MC/MCAsmBackend.h" | ||
1827 | #include "llvm/MC/MCAsmInfo.h" | ||
1828 | #include "llvm/MC/MCCodeEmitter.h" | ||
1829 | @@ -24,15 +23,16 @@ | ||
1830 | #include "llvm/MC/MCSectionMachO.h" | ||
1831 | #include "llvm/MC/MCStreamer.h" | ||
1832 | #include "llvm/MC/MCSubtargetInfo.h" | ||
1833 | -#include "llvm/MC/MCTargetOptionsCommandFlags.inc" | ||
1834 | -#include "llvm/Support/MemoryBuffer.h" | ||
1835 | +#include "llvm/MC/MCTargetOptionsCommandFlags.h" | ||
1836 | +#include "llvm/MC/SubtargetFeature.h" | ||
1837 | #include "llvm/Support/CommandLine.h" | ||
1838 | #include "llvm/Support/FileUtilities.h" | ||
1839 | -#include "llvm/Support/raw_ostream.h" | ||
1840 | +#include "llvm/Support/MemoryBuffer.h" | ||
1841 | #include "llvm/Support/SourceMgr.h" | ||
1842 | -#include "llvm/Support/TargetSelect.h" | ||
1843 | #include "llvm/Support/TargetRegistry.h" | ||
1844 | +#include "llvm/Support/TargetSelect.h" | ||
1845 | #include "llvm/Support/ToolOutputFile.h" | ||
1846 | +#include "llvm/Support/raw_ostream.h" | ||
1847 | |||
1848 | using namespace llvm; | ||
1849 | |||
1850 | @@ -161,7 +161,7 @@ int AssembleOneInput(const uint8_t *Data, size_t Size) { | ||
1851 | abort(); | ||
1852 | } | ||
1853 | |||
1854 | - MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); | ||
1855 | + MCTargetOptions MCOptions = mc::InitMCTargetOptionsFromFlags(); | ||
1856 | std::unique_ptr<MCAsmInfo> MAI( | ||
1857 | TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); | ||
1858 | if (!MAI) { | ||
1859 | diff --git a/llvm/tools/llvm-mc/CMakeLists.txt b/llvm/tools/llvm-mc/CMakeLists.txt | ||
1860 | index 15c6dda1b258..94add70b6943 100644 | ||
1861 | --- a/llvm/tools/llvm-mc/CMakeLists.txt | ||
1862 | +++ b/llvm/tools/llvm-mc/CMakeLists.txt | ||
1863 | @@ -4,6 +4,7 @@ set(LLVM_LINK_COMPONENTS | ||
1864 | AllTargetsDescs | ||
1865 | AllTargetsDisassemblers | ||
1866 | AllTargetsInfos | ||
1867 | + CodeGen | ||
1868 | MC | ||
1869 | MCParser | ||
1870 | Support | ||
1871 | diff --git a/llvm/tools/llvm-mc/llvm-mc.cpp b/llvm/tools/llvm-mc/llvm-mc.cpp | ||
1872 | index 6aa347d98be2..8c1b3cf2cab0 100644 | ||
1873 | --- a/llvm/tools/llvm-mc/llvm-mc.cpp | ||
1874 | +++ b/llvm/tools/llvm-mc/llvm-mc.cpp | ||
1875 | @@ -25,7 +25,7 @@ | ||
1876 | #include "llvm/MC/MCRegisterInfo.h" | ||
1877 | #include "llvm/MC/MCStreamer.h" | ||
1878 | #include "llvm/MC/MCSubtargetInfo.h" | ||
1879 | -#include "llvm/MC/MCTargetOptionsCommandFlags.inc" | ||
1880 | +#include "llvm/MC/MCTargetOptionsCommandFlags.h" | ||
1881 | #include "llvm/Support/CommandLine.h" | ||
1882 | #include "llvm/Support/Compression.h" | ||
1883 | #include "llvm/Support/FileUtilities.h" | ||
1884 | @@ -41,6 +41,8 @@ | ||
1885 | |||
1886 | using namespace llvm; | ||
1887 | |||
1888 | +static mc::RegisterMCTargetOptionsFlags MOF; | ||
1889 | + | ||
1890 | static cl::opt<std::string> | ||
1891 | InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-")); | ||
1892 | |||
1893 | @@ -317,7 +319,7 @@ int main(int argc, char **argv) { | ||
1894 | cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion); | ||
1895 | |||
1896 | cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); | ||
1897 | - const MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); | ||
1898 | + const MCTargetOptions MCOptions = mc::InitMCTargetOptionsFromFlags(); | ||
1899 | setDwarfDebugFlags(argc, argv); | ||
1900 | |||
1901 | setDwarfDebugProducer(); | ||
1902 | diff --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp | ||
1903 | index fff5906bb59b..eca86768aa5c 100644 | ||
1904 | --- a/llvm/tools/llvm-mca/llvm-mca.cpp | ||
1905 | +++ b/llvm/tools/llvm-mca/llvm-mca.cpp | ||
1906 | @@ -39,7 +39,7 @@ | ||
1907 | #include "llvm/MC/MCObjectFileInfo.h" | ||
1908 | #include "llvm/MC/MCRegisterInfo.h" | ||
1909 | #include "llvm/MC/MCSubtargetInfo.h" | ||
1910 | -#include "llvm/MC/MCTargetOptionsCommandFlags.inc" | ||
1911 | +#include "llvm/MC/MCTargetOptionsCommandFlags.h" | ||
1912 | #include "llvm/MCA/CodeEmitter.h" | ||
1913 | #include "llvm/MCA/Context.h" | ||
1914 | #include "llvm/MCA/InstrBuilder.h" | ||
1915 | @@ -62,6 +62,8 @@ | ||
1916 | |||
1917 | using namespace llvm; | ||
1918 | |||
1919 | +static mc::RegisterMCTargetOptionsFlags MOF; | ||
1920 | + | ||
1921 | static cl::OptionCategory ToolOptions("Tool Options"); | ||
1922 | static cl::OptionCategory ViewOptions("View Options"); | ||
1923 | |||
1924 | @@ -353,7 +355,7 @@ int main(int argc, char **argv) { | ||
1925 | std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName)); | ||
1926 | assert(MRI && "Unable to create target register info!"); | ||
1927 | |||
1928 | - MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); | ||
1929 | + MCTargetOptions MCOptions = mc::InitMCTargetOptionsFromFlags(); | ||
1930 | std::unique_ptr<MCAsmInfo> MAI( | ||
1931 | TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); | ||
1932 | assert(MAI && "Unable to create target asm info!"); | ||
1933 | @@ -443,7 +445,7 @@ int main(int argc, char **argv) { | ||
1934 | TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx)); | ||
1935 | |||
1936 | std::unique_ptr<MCAsmBackend> MAB(TheTarget->createMCAsmBackend( | ||
1937 | - *STI, *MRI, InitMCTargetOptionsFromFlags())); | ||
1938 | + *STI, *MRI, mc::InitMCTargetOptionsFromFlags())); | ||
1939 | |||
1940 | for (const std::unique_ptr<mca::CodeRegion> &Region : Regions) { | ||
1941 | // Skip empty code regions. | ||
1942 | diff --git a/llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp b/llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp | ||
1943 | index cd6c7d380cc6..e353e333f580 100644 | ||
1944 | --- a/llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp | ||
1945 | +++ b/llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp | ||
1946 | @@ -12,7 +12,7 @@ | ||
1947 | |||
1948 | #include "llvm/Bitcode/BitcodeReader.h" | ||
1949 | #include "llvm/Bitcode/BitcodeWriter.h" | ||
1950 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
1951 | +#include "llvm/CodeGen/CommandFlags.h" | ||
1952 | #include "llvm/FuzzMutate/FuzzerCLI.h" | ||
1953 | #include "llvm/FuzzMutate/IRMutator.h" | ||
1954 | #include "llvm/IR/Verifier.h" | ||
1955 | @@ -24,6 +24,8 @@ | ||
1956 | |||
1957 | using namespace llvm; | ||
1958 | |||
1959 | +static codegen::RegisterCodeGenFlags CGF; | ||
1960 | + | ||
1961 | static cl::opt<std::string> | ||
1962 | TargetTripleStr("mtriple", cl::desc("Override target triple for module")); | ||
1963 | |||
1964 | @@ -124,7 +126,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { | ||
1965 | |||
1966 | M->setTargetTriple(TM->getTargetTriple().normalize()); | ||
1967 | M->setDataLayout(TM->createDataLayout()); | ||
1968 | - setFunctionAttributes(TM->getTargetCPU(), TM->getTargetFeatureString(), *M); | ||
1969 | + codegen::setFunctionAttributes(TM->getTargetCPU(), | ||
1970 | + TM->getTargetFeatureString(), *M); | ||
1971 | |||
1972 | // Create pass pipeline | ||
1973 | // | ||
1974 | @@ -214,16 +217,17 @@ extern "C" LLVM_ATTRIBUTE_USED int LLVMFuzzerInitialize( | ||
1975 | |||
1976 | std::string Error; | ||
1977 | const Target *TheTarget = | ||
1978 | - TargetRegistry::lookupTarget(MArch, TargetTriple, Error); | ||
1979 | + TargetRegistry::lookupTarget(codegen::getMArch(), TargetTriple, Error); | ||
1980 | if (!TheTarget) { | ||
1981 | errs() << *argv[0] << ": " << Error; | ||
1982 | exit(1); | ||
1983 | } | ||
1984 | |||
1985 | - TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
1986 | + TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
1987 | TM.reset(TheTarget->createTargetMachine( | ||
1988 | - TargetTriple.getTriple(), getCPUStr(), getFeaturesStr(), | ||
1989 | - Options, getRelocModel(), getCodeModel(), CodeGenOpt::Default)); | ||
1990 | + TargetTriple.getTriple(), codegen::getCPUStr(), codegen::getFeaturesStr(), | ||
1991 | + Options, codegen::getExplicitRelocModel(), | ||
1992 | + codegen::getExplicitCodeModel(), CodeGenOpt::Default)); | ||
1993 | assert(TM && "Could not allocate target machine!"); | ||
1994 | |||
1995 | // Check that pass pipeline is specified and correct | ||
1996 | diff --git a/llvm/tools/lto/CMakeLists.txt b/llvm/tools/lto/CMakeLists.txt | ||
1997 | index b86e4abd01a7..2963f97cad88 100644 | ||
1998 | --- a/llvm/tools/lto/CMakeLists.txt | ||
1999 | +++ b/llvm/tools/lto/CMakeLists.txt | ||
2000 | @@ -6,6 +6,7 @@ set(LLVM_LINK_COMPONENTS | ||
2001 | AllTargetsInfos | ||
2002 | BitReader | ||
2003 | Core | ||
2004 | + CodeGen | ||
2005 | LTO | ||
2006 | MC | ||
2007 | MCDisassembler | ||
2008 | @@ -20,7 +21,8 @@ set(SOURCES | ||
2009 | |||
2010 | set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/lto.exports) | ||
2011 | |||
2012 | -add_llvm_library(LTO SHARED INSTALL_WITH_TOOLCHAIN ${SOURCES} DEPENDS intrinsics_gen) | ||
2013 | +add_llvm_library(LTO SHARED INSTALL_WITH_TOOLCHAIN ${SOURCES} DEPENDS | ||
2014 | + intrinsics_gen) | ||
2015 | |||
2016 | install(FILES ${LLVM_MAIN_INCLUDE_DIR}/llvm-c/lto.h | ||
2017 | DESTINATION include/llvm-c | ||
2018 | diff --git a/llvm/tools/lto/lto.cpp b/llvm/tools/lto/lto.cpp | ||
2019 | index 9933af94de1e..6d207b76685f 100644 | ||
2020 | --- a/llvm/tools/lto/lto.cpp | ||
2021 | +++ b/llvm/tools/lto/lto.cpp | ||
2022 | @@ -15,7 +15,7 @@ | ||
2023 | #include "llvm/ADT/STLExtras.h" | ||
2024 | #include "llvm/ADT/StringExtras.h" | ||
2025 | #include "llvm/Bitcode/BitcodeReader.h" | ||
2026 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
2027 | +#include "llvm/CodeGen/CommandFlags.h" | ||
2028 | #include "llvm/IR/DiagnosticInfo.h" | ||
2029 | #include "llvm/IR/DiagnosticPrinter.h" | ||
2030 | #include "llvm/IR/LLVMContext.h" | ||
2031 | @@ -28,6 +28,10 @@ | ||
2032 | #include "llvm/Support/TargetSelect.h" | ||
2033 | #include "llvm/Support/raw_ostream.h" | ||
2034 | |||
2035 | +using namespace llvm; | ||
2036 | + | ||
2037 | +static codegen::RegisterCodeGenFlags CGF; | ||
2038 | + | ||
2039 | // extra command-line flags needed for LTOCodeGenerator | ||
2040 | static cl::opt<char> | ||
2041 | OptLevel("O", | ||
2042 | @@ -154,14 +158,9 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOModule, lto_module_t) | ||
2043 | // Convert the subtarget features into a string to pass to LTOCodeGenerator. | ||
2044 | static void lto_add_attrs(lto_code_gen_t cg) { | ||
2045 | LTOCodeGenerator *CG = unwrap(cg); | ||
2046 | - if (MAttrs.size()) { | ||
2047 | - std::string attrs; | ||
2048 | - for (unsigned i = 0; i < MAttrs.size(); ++i) { | ||
2049 | - if (i > 0) | ||
2050 | - attrs.append(","); | ||
2051 | - attrs.append(MAttrs[i]); | ||
2052 | - } | ||
2053 | - | ||
2054 | + auto MAttrs = codegen::getMAttrs(); | ||
2055 | + if (!MAttrs.empty()) { | ||
2056 | + std::string attrs = join(MAttrs, ","); | ||
2057 | CG->setAttr(attrs); | ||
2058 | } | ||
2059 | |||
2060 | @@ -219,7 +218,7 @@ lto_module_is_object_file_in_memory_for_target(const void* mem, | ||
2061 | |||
2062 | lto_module_t lto_module_create(const char* path) { | ||
2063 | lto_initialize(); | ||
2064 | - llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
2065 | + llvm::TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
2066 | ErrorOr<std::unique_ptr<LTOModule>> M = | ||
2067 | LTOModule::createFromFile(*LTOContext, StringRef(path), Options); | ||
2068 | if (!M) | ||
2069 | @@ -229,7 +228,7 @@ lto_module_t lto_module_create(const char* path) { | ||
2070 | |||
2071 | lto_module_t lto_module_create_from_fd(int fd, const char *path, size_t size) { | ||
2072 | lto_initialize(); | ||
2073 | - llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
2074 | + llvm::TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
2075 | ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromOpenFile( | ||
2076 | *LTOContext, fd, StringRef(path), size, Options); | ||
2077 | if (!M) | ||
2078 | @@ -242,7 +241,7 @@ lto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path, | ||
2079 | size_t map_size, | ||
2080 | off_t offset) { | ||
2081 | lto_initialize(); | ||
2082 | - llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
2083 | + llvm::TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
2084 | ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromOpenFileSlice( | ||
2085 | *LTOContext, fd, StringRef(path), map_size, offset, Options); | ||
2086 | if (!M) | ||
2087 | @@ -252,7 +251,7 @@ lto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path, | ||
2088 | |||
2089 | lto_module_t lto_module_create_from_memory(const void* mem, size_t length) { | ||
2090 | lto_initialize(); | ||
2091 | - llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
2092 | + llvm::TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
2093 | ErrorOr<std::unique_ptr<LTOModule>> M = | ||
2094 | LTOModule::createFromBuffer(*LTOContext, mem, length, Options); | ||
2095 | if (!M) | ||
2096 | @@ -264,7 +263,7 @@ lto_module_t lto_module_create_from_memory_with_path(const void* mem, | ||
2097 | size_t length, | ||
2098 | const char *path) { | ||
2099 | lto_initialize(); | ||
2100 | - llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
2101 | + llvm::TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
2102 | ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromBuffer( | ||
2103 | *LTOContext, mem, length, Options, StringRef(path)); | ||
2104 | if (!M) | ||
2105 | @@ -275,7 +274,7 @@ lto_module_t lto_module_create_from_memory_with_path(const void* mem, | ||
2106 | lto_module_t lto_module_create_in_local_context(const void *mem, size_t length, | ||
2107 | const char *path) { | ||
2108 | lto_initialize(); | ||
2109 | - llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
2110 | + llvm::TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
2111 | |||
2112 | // Create a local context. Ownership will be transferred to LTOModule. | ||
2113 | std::unique_ptr<LLVMContext> Context = std::make_unique<LLVMContext>(); | ||
2114 | @@ -294,7 +293,7 @@ lto_module_t lto_module_create_in_codegen_context(const void *mem, | ||
2115 | const char *path, | ||
2116 | lto_code_gen_t cg) { | ||
2117 | lto_initialize(); | ||
2118 | - llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
2119 | + llvm::TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
2120 | ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromBuffer( | ||
2121 | unwrap(cg)->getContext(), mem, length, Options, StringRef(path)); | ||
2122 | return wrap(M->release()); | ||
2123 | @@ -336,7 +335,7 @@ void lto_codegen_set_diagnostic_handler(lto_code_gen_t cg, | ||
2124 | static lto_code_gen_t createCodeGen(bool InLocalContext) { | ||
2125 | lto_initialize(); | ||
2126 | |||
2127 | - TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
2128 | + TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
2129 | |||
2130 | LibLTOCodeGenerator *CodeGen = | ||
2131 | InLocalContext ? new LibLTOCodeGenerator(std::make_unique<LLVMContext>()) | ||
2132 | @@ -484,7 +483,7 @@ void lto_codegen_set_should_embed_uselists(lto_code_gen_t cg, | ||
2133 | thinlto_code_gen_t thinlto_create_codegen(void) { | ||
2134 | lto_initialize(); | ||
2135 | ThinLTOCodeGenerator *CodeGen = new ThinLTOCodeGenerator(); | ||
2136 | - CodeGen->setTargetOptions(InitTargetOptionsFromCodeGenFlags()); | ||
2137 | + CodeGen->setTargetOptions(codegen::InitTargetOptionsFromCodeGenFlags()); | ||
2138 | CodeGen->setFreestanding(EnableFreestanding); | ||
2139 | |||
2140 | if (OptLevel.getNumOccurrences()) { | ||
2141 | diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp | ||
2142 | index 75a6cdc3892b..8d619ef76b7a 100644 | ||
2143 | --- a/llvm/tools/opt/opt.cpp | ||
2144 | +++ b/llvm/tools/opt/opt.cpp | ||
2145 | @@ -22,7 +22,7 @@ | ||
2146 | #include "llvm/Analysis/TargetLibraryInfo.h" | ||
2147 | #include "llvm/Analysis/TargetTransformInfo.h" | ||
2148 | #include "llvm/Bitcode/BitcodeWriterPass.h" | ||
2149 | -#include "llvm/CodeGen/CommandFlags.inc" | ||
2150 | +#include "llvm/CodeGen/CommandFlags.h" | ||
2151 | #include "llvm/CodeGen/TargetPassConfig.h" | ||
2152 | #include "llvm/Config/llvm-config.h" | ||
2153 | #include "llvm/IR/DataLayout.h" | ||
2154 | @@ -61,6 +61,8 @@ | ||
2155 | using namespace llvm; | ||
2156 | using namespace opt_tool; | ||
2157 | |||
2158 | +static codegen::RegisterCodeGenFlags CFG; | ||
2159 | + | ||
2160 | // The OptimizationList is automatically populated with registered Passes by the | ||
2161 | // PassNameParser. | ||
2162 | // | ||
2163 | @@ -470,16 +472,17 @@ static TargetMachine* GetTargetMachine(Triple TheTriple, StringRef CPUStr, | ||
2164 | StringRef FeaturesStr, | ||
2165 | const TargetOptions &Options) { | ||
2166 | std::string Error; | ||
2167 | - const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple, | ||
2168 | - Error); | ||
2169 | + const Target *TheTarget = | ||
2170 | + TargetRegistry::lookupTarget(codegen::getMArch(), TheTriple, Error); | ||
2171 | // Some modules don't specify a triple, and this is okay. | ||
2172 | if (!TheTarget) { | ||
2173 | return nullptr; | ||
2174 | } | ||
2175 | |||
2176 | - return TheTarget->createTargetMachine(TheTriple.getTriple(), CPUStr, | ||
2177 | - FeaturesStr, Options, getRelocModel(), | ||
2178 | - getCodeModel(), GetCodeGenOptLevel()); | ||
2179 | + return TheTarget->createTargetMachine( | ||
2180 | + TheTriple.getTriple(), codegen::getCPUStr(), codegen::getFeaturesStr(), | ||
2181 | + Options, codegen::getExplicitRelocModel(), | ||
2182 | + codegen::getExplicitCodeModel(), GetCodeGenOptLevel()); | ||
2183 | } | ||
2184 | |||
2185 | #ifdef BUILD_EXAMPLES | ||
2186 | @@ -659,11 +662,11 @@ int main(int argc, char **argv) { | ||
2187 | Triple ModuleTriple(M->getTargetTriple()); | ||
2188 | std::string CPUStr, FeaturesStr; | ||
2189 | TargetMachine *Machine = nullptr; | ||
2190 | - const TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); | ||
2191 | + const TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags(); | ||
2192 | |||
2193 | if (ModuleTriple.getArch()) { | ||
2194 | - CPUStr = getCPUStr(); | ||
2195 | - FeaturesStr = getFeaturesStr(); | ||
2196 | + CPUStr = codegen::getCPUStr(); | ||
2197 | + FeaturesStr = codegen::getFeaturesStr(); | ||
2198 | Machine = GetTargetMachine(ModuleTriple, CPUStr, FeaturesStr, Options); | ||
2199 | } else if (ModuleTriple.getArchName() != "unknown" && | ||
2200 | ModuleTriple.getArchName() != "") { | ||
2201 | @@ -676,7 +679,7 @@ int main(int argc, char **argv) { | ||
2202 | |||
2203 | // Override function attributes based on CPUStr, FeaturesStr, and command line | ||
2204 | // flags. | ||
2205 | - setFunctionAttributes(CPUStr, FeaturesStr, *M); | ||
2206 | + codegen::setFunctionAttributes(CPUStr, FeaturesStr, *M); | ||
2207 | |||
2208 | // If the output is set to be emitted to standard out, and standard out is a | ||
2209 | // console, print out a warning message and refuse to do it. We don't | ||
2210 | diff --git a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp | ||
2211 | index 472d4dd6ad1e..32d1d3c91ff2 100644 | ||
2212 | --- a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp | ||
2213 | +++ b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp | ||
2214 | @@ -25,7 +25,7 @@ | ||
2215 | #include "llvm/MC/MCRegisterInfo.h" | ||
2216 | #include "llvm/MC/MCStreamer.h" | ||
2217 | #include "llvm/MC/MCSubtargetInfo.h" | ||
2218 | -#include "llvm/MC/MCTargetOptionsCommandFlags.inc" | ||
2219 | +#include "llvm/MC/MCTargetOptionsCommandFlags.h" | ||
2220 | #include "llvm/PassAnalysisSupport.h" | ||
2221 | #include "llvm/Support/TargetRegistry.h" | ||
2222 | #include "llvm/Support/raw_ostream.h" | ||
2223 | @@ -36,6 +36,8 @@ | ||
2224 | using namespace llvm; | ||
2225 | using namespace dwarf; | ||
2226 | |||
2227 | +mc::RegisterMCTargetOptionsFlags MOF; | ||
2228 | + | ||
2229 | namespace {} // end anonymous namespace | ||
2230 | |||
2231 | //===----------------------------------------------------------------------===// | ||
2232 | @@ -410,7 +412,7 @@ llvm::Error dwarfgen::Generator::init(Triple TheTriple, uint16_t V) { | ||
2233 | TripleName, | ||
2234 | inconvertibleErrorCode()); | ||
2235 | |||
2236 | - MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); | ||
2237 | + MCTargetOptions MCOptions = mc::InitMCTargetOptionsFromFlags(); | ||
2238 | MAI.reset(TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); | ||
2239 | if (!MAI) | ||
2240 | return make_error<StringError>("no asm info for target " + TripleName, | ||
2241 | -- | ||
2242 | 2.33.1 | ||
2243 | |||
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-basic-block-sections-support.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-basic-block-sections-support.patch new file mode 100644 index 00000000..f90a79ae --- /dev/null +++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-basic-block-sections-support.patch | |||
@@ -0,0 +1,237 @@ | |||
1 | From d51fdb9f2986747a56c593fa057d531720b39deb Mon Sep 17 00:00:00 2001 | ||
2 | From: Sriraman Tallam <tmsriram@google.com> | ||
3 | Date: Fri, 13 Mar 2020 15:58:57 -0700 | ||
4 | Subject: [PATCH] Basic Block Sections Support. | ||
5 | |||
6 | This is the first in a series of patches to enable Basic Block Sections | ||
7 | in LLVM. | ||
8 | |||
9 | We introduce a new compiler option, -fbasicblock-sections=, which places every | ||
10 | basic block in a unique ELF text section in the object file along with a | ||
11 | symbol labeling the basic block. The linker can then order the basic block | ||
12 | sections in any arbitrary sequence which when done correctly can encapsulate | ||
13 | block layout, function layout and function splitting optimizations. However, | ||
14 | there are a couple of challenges to be addressed for this to be feasible: | ||
15 | |||
16 | 1) The compiler must not allow any implicit fall-through between any two | ||
17 | adjacent basic blocks as they could be reordered at link time to be | ||
18 | non-adjacent. In other words, the compiler must make a fall-through | ||
19 | between adjacent basic blocks explicit by retaining the direct jump | ||
20 | instruction that jumps to the next basic block. These branches can only | ||
21 | be removed later by the linker after the blocks have been reordered. | ||
22 | 2) All inter-basic block branch targets would now need to be resolved by | ||
23 | the linker as they cannot be calculated during compile time. This is | ||
24 | done using static relocations which bloats the size of the object files. | ||
25 | Further, the compiler tries to use short branch instructions on some ISAs | ||
26 | for branch offsets that can be accommodated in one byte. This is not | ||
27 | possible with basic block sections as the offset is not determined at | ||
28 | compile time, and long branch instructions have to be used everywhere. | ||
29 | 3) Each additional section bloats object file sizes by tens of bytes. The | ||
30 | number of basic blocks can be potentially very large compared to the | ||
31 | size of functions and can bloat object sizes significantly. Option | ||
32 | fbasicblock-sections= also takes a file path which can be used to | ||
33 | specify a subset of basic blocks that needs unique sections to keep | ||
34 | the bloats small. | ||
35 | 4) Debug Info and CFI need special handling and will be presented as | ||
36 | separate patches. | ||
37 | |||
38 | Basic Block Labels | ||
39 | |||
40 | With -fbasicblock-sections=labels, or when a basic block is placed in a | ||
41 | unique section, it is labelled with a symbol. This allows easy mapping of | ||
42 | virtual addresses from PMU profiles back to the corresponding basic blocks. | ||
43 | Since the number of basic blocks is large, the labeling bloats the symbol | ||
44 | table sizes and the string table sizes significantly. While the binary size | ||
45 | does increase, it does not affect performance as the symbol table is not | ||
46 | loaded in memory during run-time. The string table size bloat is kept very | ||
47 | minimal using a unary naming scheme that uses string suffix compression. | ||
48 | The basic blocks for function foo are named "a.BB.foo", "aa.BB.foo", ... | ||
49 | This turns out to be very good for string table sizes and the bloat in the | ||
50 | string table size for a very large binary is ~8 %. The naming also allows | ||
51 | using the --symbol-ordering-file option in LLD to arbitrarily reorder the | ||
52 | sections. | ||
53 | |||
54 | Differential Revision: https://reviews.llvm.org/D68063 | ||
55 | |||
56 | Upstream-Status: Backport [https://github.com/llvm/llvm-project/commit/4dfe92e46542be46d634a7ec24da2f2f889623d0] | ||
57 | Signed-off-by: Anuj Mittal <anuj.mittal@intel.com> | ||
58 | --- | ||
59 | llvm/include/llvm/CodeGen/CommandFlags.inc | 34 ++++++++++++++++++++++ | ||
60 | llvm/include/llvm/Target/TargetMachine.h | 14 +++++++++ | ||
61 | llvm/include/llvm/Target/TargetOptions.h | 31 ++++++++++++++++++-- | ||
62 | 3 files changed, 76 insertions(+), 3 deletions(-) | ||
63 | |||
64 | diff --git a/llvm/include/llvm/CodeGen/CommandFlags.inc b/llvm/include/llvm/CodeGen/CommandFlags.inc | ||
65 | index 8739b644873d..6475a5b19edb 100644 | ||
66 | --- a/llvm/include/llvm/CodeGen/CommandFlags.inc | ||
67 | +++ b/llvm/include/llvm/CodeGen/CommandFlags.inc | ||
68 | @@ -238,6 +238,12 @@ static cl::opt<bool> | ||
69 | cl::desc("Emit functions into separate sections"), | ||
70 | cl::init(false)); | ||
71 | |||
72 | +static cl::opt<std::string> | ||
73 | + BBSections("basicblock-sections", | ||
74 | + cl::desc("Emit basic blocks into separate sections"), | ||
75 | + cl::value_desc("all | <function list (file)> | labels | none"), | ||
76 | + cl::init("none")); | ||
77 | + | ||
78 | static cl::opt<unsigned> TLSSize("tls-size", | ||
79 | cl::desc("Bit size of immediate TLS offsets"), | ||
80 | cl::init(0)); | ||
81 | @@ -251,6 +257,11 @@ static cl::opt<bool> | ||
82 | cl::desc("Give unique names to every section"), | ||
83 | cl::init(true)); | ||
84 | |||
85 | +static cl::opt<bool> UniqueBBSectionNames( | ||
86 | + "unique-bb-section-names", | ||
87 | + cl::desc("Give unique names to every basic block section"), | ||
88 | + cl::init(false)); | ||
89 | + | ||
90 | static cl::opt<llvm::EABI> | ||
91 | EABIVersion("meabi", cl::desc("Set EABI type (default depends on triple):"), | ||
92 | cl::init(EABI::Default), | ||
93 | @@ -285,6 +296,27 @@ static cl::opt<bool> | ||
94 | cl::desc("Always emit a debug frame section."), | ||
95 | cl::init(false)); | ||
96 | |||
97 | +static llvm::BasicBlockSection | ||
98 | +getBBSectionsMode(llvm::TargetOptions &Options) { | ||
99 | + if (BBSections == "all") | ||
100 | + return BasicBlockSection::All; | ||
101 | + else if (BBSections == "labels") | ||
102 | + return BasicBlockSection::Labels; | ||
103 | + else if (BBSections == "none") | ||
104 | + return BasicBlockSection::None; | ||
105 | + else { | ||
106 | + ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = | ||
107 | + MemoryBuffer::getFile(BBSections); | ||
108 | + if (!MBOrErr) { | ||
109 | + errs() << "Error loading basic block sections function list file: " | ||
110 | + << MBOrErr.getError().message() << "\n"; | ||
111 | + } else { | ||
112 | + Options.BBSectionsFuncListBuf = std::move(*MBOrErr); | ||
113 | + } | ||
114 | + return BasicBlockSection::List; | ||
115 | + } | ||
116 | +} | ||
117 | + | ||
118 | // Common utility function tightly tied to the options listed here. Initializes | ||
119 | // a TargetOptions object with CodeGen flags and returns it. | ||
120 | static TargetOptions InitTargetOptionsFromCodeGenFlags() { | ||
121 | @@ -308,7 +340,9 @@ static TargetOptions InitTargetOptionsFromCodeGenFlags() { | ||
122 | Options.RelaxELFRelocations = RelaxELFRelocations; | ||
123 | Options.DataSections = DataSections; | ||
124 | Options.FunctionSections = FunctionSections; | ||
125 | + Options.BBSections = getBBSectionsMode(Options); | ||
126 | Options.UniqueSectionNames = UniqueSectionNames; | ||
127 | + Options.UniqueBBSectionNames = UniqueBBSectionNames; | ||
128 | Options.TLSSize = TLSSize; | ||
129 | Options.EmulatedTLS = EmulatedTLS; | ||
130 | Options.ExplicitEmulatedTLS = EmulatedTLS.getNumOccurrences() > 0; | ||
131 | diff --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h | ||
132 | index 176ae39b17a7..4a1f3377f31d 100644 | ||
133 | --- a/llvm/include/llvm/Target/TargetMachine.h | ||
134 | +++ b/llvm/include/llvm/Target/TargetMachine.h | ||
135 | @@ -242,6 +242,9 @@ public: | ||
136 | |||
137 | bool getUniqueSectionNames() const { return Options.UniqueSectionNames; } | ||
138 | |||
139 | + /// Return true if unique basic block section names must be generated. | ||
140 | + bool getUniqueBBSectionNames() const { return Options.UniqueBBSectionNames; } | ||
141 | + | ||
142 | /// Return true if data objects should be emitted into their own section, | ||
143 | /// corresponds to -fdata-sections. | ||
144 | bool getDataSections() const { | ||
145 | @@ -254,6 +257,17 @@ public: | ||
146 | return Options.FunctionSections; | ||
147 | } | ||
148 | |||
149 | + /// If basic blocks should be emitted into their own section, | ||
150 | + /// corresponding to -fbasicblock-sections. | ||
151 | + llvm::BasicBlockSection getBBSectionsType() const { | ||
152 | + return Options.BBSections; | ||
153 | + } | ||
154 | + | ||
155 | + /// Get the list of functions and basic block ids that need unique sections. | ||
156 | + const MemoryBuffer *getBBSectionsFuncListBuf() const { | ||
157 | + return Options.BBSectionsFuncListBuf.get(); | ||
158 | + } | ||
159 | + | ||
160 | /// Get a \c TargetIRAnalysis appropriate for the target. | ||
161 | /// | ||
162 | /// This is used to construct the new pass manager's target IR analysis pass, | ||
163 | diff --git a/llvm/include/llvm/Target/TargetOptions.h b/llvm/include/llvm/Target/TargetOptions.h | ||
164 | index 84c6ee2a6387..d27c7b0178f0 100644 | ||
165 | --- a/llvm/include/llvm/Target/TargetOptions.h | ||
166 | +++ b/llvm/include/llvm/Target/TargetOptions.h | ||
167 | @@ -16,8 +16,11 @@ | ||
168 | |||
169 | #include "llvm/MC/MCTargetOptions.h" | ||
170 | |||
171 | +#include <memory> | ||
172 | + | ||
173 | namespace llvm { | ||
174 | class MachineFunction; | ||
175 | + class MemoryBuffer; | ||
176 | class Module; | ||
177 | |||
178 | namespace FloatABI { | ||
179 | @@ -63,6 +66,18 @@ namespace llvm { | ||
180 | }; | ||
181 | } | ||
182 | |||
183 | + enum class BasicBlockSection { | ||
184 | + All, // Use Basic Block Sections for all basic blocks. A section | ||
185 | + // for every basic block can significantly bloat object file sizes. | ||
186 | + List, // Get list of functions & BBs from a file. Selectively enables | ||
187 | + // basic block sections for a subset of basic blocks which can be | ||
188 | + // used to control object size bloats from creating sections. | ||
189 | + Labels, // Do not use Basic Block Sections but label basic blocks. This | ||
190 | + // is useful when associating profile counts from virtual addresses | ||
191 | + // to basic blocks. | ||
192 | + None // Do not use Basic Block Sections. | ||
193 | + }; | ||
194 | + | ||
195 | enum class EABI { | ||
196 | Unknown, | ||
197 | Default, // Default means not specified | ||
198 | @@ -114,9 +129,9 @@ namespace llvm { | ||
199 | EnableFastISel(false), EnableGlobalISel(false), UseInitArray(false), | ||
200 | DisableIntegratedAS(false), RelaxELFRelocations(false), | ||
201 | FunctionSections(false), DataSections(false), | ||
202 | - UniqueSectionNames(true), TrapUnreachable(false), | ||
203 | - NoTrapAfterNoreturn(false), TLSSize(0), EmulatedTLS(false), | ||
204 | - ExplicitEmulatedTLS(false), EnableIPRA(false), | ||
205 | + UniqueSectionNames(true), UniqueBBSectionNames(false), | ||
206 | + TrapUnreachable(false), NoTrapAfterNoreturn(false), TLSSize(0), | ||
207 | + EmulatedTLS(false), ExplicitEmulatedTLS(false), EnableIPRA(false), | ||
208 | EmitStackSizeSection(false), EnableMachineOutliner(false), | ||
209 | SupportsDefaultOutlining(false), EmitAddrsig(false), | ||
210 | EnableDebugEntryValues(false), ForceDwarfFrameSection(false) {} | ||
211 | @@ -224,6 +239,9 @@ namespace llvm { | ||
212 | |||
213 | unsigned UniqueSectionNames : 1; | ||
214 | |||
215 | + /// Use unique names for basic block sections. | ||
216 | + unsigned UniqueBBSectionNames : 1; | ||
217 | + | ||
218 | /// Emit target-specific trap instruction for 'unreachable' IR instructions. | ||
219 | unsigned TrapUnreachable : 1; | ||
220 | |||
221 | @@ -256,6 +274,13 @@ namespace llvm { | ||
222 | /// Emit address-significance table. | ||
223 | unsigned EmitAddrsig : 1; | ||
224 | |||
225 | + /// Emit basic blocks into separate sections. | ||
226 | + BasicBlockSection BBSections = BasicBlockSection::None; | ||
227 | + | ||
228 | + /// Memory Buffer that contains information on sampled basic blocks and used | ||
229 | + /// to selectively generate basic block sections. | ||
230 | + std::shared_ptr<MemoryBuffer> BBSectionsFuncListBuf; | ||
231 | + | ||
232 | /// Emit debug info about parameter's entry values. | ||
233 | unsigned EnableDebugEntryValues : 1; | ||
234 | |||
235 | -- | ||
236 | 2.33.1 | ||
237 | |||