clang 23.0.0git
BackendUtil.cpp
Go to the documentation of this file.
1//===--- BackendUtil.cpp - LLVM Backend Utilities -------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10#include "BackendConsumer.h"
11#include "LinkInModulesPass.h"
19#include "llvm/ADT/StringExtras.h"
20#include "llvm/ADT/StringSwitch.h"
21#include "llvm/Analysis/GlobalsModRef.h"
22#include "llvm/Analysis/RuntimeLibcallInfo.h"
23#include "llvm/Analysis/TargetLibraryInfo.h"
24#include "llvm/Analysis/TargetTransformInfo.h"
25#include "llvm/Bitcode/BitcodeReader.h"
26#include "llvm/Bitcode/BitcodeWriter.h"
27#include "llvm/Bitcode/BitcodeWriterPass.h"
28#include "llvm/CodeGen/TargetSubtargetInfo.h"
29#include "llvm/Config/llvm-config.h"
30#include "llvm/Frontend/Driver/CodeGenOptions.h"
31#include "llvm/IR/DataLayout.h"
32#include "llvm/IR/DebugInfo.h"
33#include "llvm/IR/LLVMRemarkStreamer.h"
34#include "llvm/IR/LegacyPassManager.h"
35#include "llvm/IR/Module.h"
36#include "llvm/IR/ModuleSummaryIndex.h"
37#include "llvm/IR/PassManager.h"
38#include "llvm/IR/Verifier.h"
39#include "llvm/IRPrinter/IRPrintingPasses.h"
40#include "llvm/LTO/LTOBackend.h"
41#include "llvm/MC/TargetRegistry.h"
42#include "llvm/Object/OffloadBinary.h"
43#include "llvm/Passes/PassBuilder.h"
44#include "llvm/Passes/StandardInstrumentations.h"
45#include "llvm/Plugins/PassPlugin.h"
46#include "llvm/ProfileData/InstrProfCorrelator.h"
47#include "llvm/Support/BuryPointer.h"
48#include "llvm/Support/CommandLine.h"
49#include "llvm/Support/Compiler.h"
50#include "llvm/Support/IOSandbox.h"
51#include "llvm/Support/MemoryBuffer.h"
52#include "llvm/Support/PrettyStackTrace.h"
53#include "llvm/Support/Program.h"
54#include "llvm/Support/TimeProfiler.h"
55#include "llvm/Support/Timer.h"
56#include "llvm/Support/ToolOutputFile.h"
57#include "llvm/Support/VirtualFileSystem.h"
58#include "llvm/Support/raw_ostream.h"
59#include "llvm/Target/TargetMachine.h"
60#include "llvm/Target/TargetOptions.h"
61#include "llvm/TargetParser/SubtargetFeature.h"
62#include "llvm/TargetParser/Triple.h"
63#include "llvm/Transforms/HipStdPar/HipStdPar.h"
64#include "llvm/Transforms/IPO/EmbedBitcodePass.h"
65#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
66#include "llvm/Transforms/IPO/LowerTypeTests.h"
67#include "llvm/Transforms/IPO/ThinLTOBitcodeWriter.h"
68#include "llvm/Transforms/InstCombine/InstCombine.h"
69#include "llvm/Transforms/Instrumentation/AddressSanitizer.h"
70#include "llvm/Transforms/Instrumentation/AddressSanitizerOptions.h"
71#include "llvm/Transforms/Instrumentation/BoundsChecking.h"
72#include "llvm/Transforms/Instrumentation/DataFlowSanitizer.h"
73#include "llvm/Transforms/Instrumentation/GCOVProfiler.h"
74#include "llvm/Transforms/Instrumentation/HWAddressSanitizer.h"
75#include "llvm/Transforms/Instrumentation/InstrProfiling.h"
76#include "llvm/Transforms/Instrumentation/KCFI.h"
77#include "llvm/Transforms/Instrumentation/LowerAllowCheckPass.h"
78#include "llvm/Transforms/Instrumentation/MemProfInstrumentation.h"
79#include "llvm/Transforms/Instrumentation/MemProfUse.h"
80#include "llvm/Transforms/Instrumentation/MemorySanitizer.h"
81#include "llvm/Transforms/Instrumentation/NumericalStabilitySanitizer.h"
82#include "llvm/Transforms/Instrumentation/PGOInstrumentation.h"
83#include "llvm/Transforms/Instrumentation/RealtimeSanitizer.h"
84#include "llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h"
85#include "llvm/Transforms/Instrumentation/SanitizerCoverage.h"
86#include "llvm/Transforms/Instrumentation/ThreadSanitizer.h"
87#include "llvm/Transforms/Instrumentation/TypeSanitizer.h"
88#include "llvm/Transforms/ObjCARC.h"
89#include "llvm/Transforms/Scalar/EarlyCSE.h"
90#include "llvm/Transforms/Scalar/GVN.h"
91#include "llvm/Transforms/Scalar/JumpThreading.h"
92#include "llvm/Transforms/Utils/Debugify.h"
93#include "llvm/Transforms/Utils/ModuleUtils.h"
94#include <limits>
95#include <memory>
96#include <optional>
97using namespace clang;
98using namespace llvm;
99
100#define HANDLE_EXTENSION(Ext) \
101 llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
102#include "llvm/Support/Extension.def"
103
104namespace llvm {
105// Experiment to move sanitizers earlier.
106static cl::opt<bool> ClSanitizeOnOptimizerEarlyEP(
107 "sanitizer-early-opt-ep", cl::Optional,
108 cl::desc("Insert sanitizers on OptimizerEarlyEP."));
109
110// Experiment to mark cold functions as optsize/minsize/optnone.
111// TODO: remove once this is exposed as a proper driver flag.
112static cl::opt<PGOOptions::ColdFuncOpt> ClPGOColdFuncAttr(
113 "pgo-cold-func-opt", cl::init(PGOOptions::ColdFuncOpt::Default), cl::Hidden,
114 cl::desc(
115 "Function attribute to apply to cold functions as determined by PGO"),
116 cl::values(clEnumValN(PGOOptions::ColdFuncOpt::Default, "default",
117 "Default (no attribute)"),
118 clEnumValN(PGOOptions::ColdFuncOpt::OptSize, "optsize",
119 "Mark cold functions with optsize."),
120 clEnumValN(PGOOptions::ColdFuncOpt::MinSize, "minsize",
121 "Mark cold functions with minsize."),
122 clEnumValN(PGOOptions::ColdFuncOpt::OptNone, "optnone",
123 "Mark cold functions with optnone.")));
124
125LLVM_ABI extern cl::opt<InstrProfCorrelator::ProfCorrelatorKind>
127} // namespace llvm
128namespace clang {
129extern llvm::cl::opt<bool> ClSanitizeGuardChecks;
130}
131
132// Path and name of file used for profile generation
133static std::string getProfileGenName(const CodeGenOptions &CodeGenOpts) {
134 std::string FileName = CodeGenOpts.InstrProfileOutput.empty()
135 ? llvm::driver::getDefaultProfileGenName()
136 : CodeGenOpts.InstrProfileOutput;
137 if (CodeGenOpts.ContinuousProfileSync)
138 FileName = "%c" + FileName;
139 return FileName;
140}
141
142namespace {
143
144class EmitAssemblyHelper {
145 CompilerInstance &CI;
146 DiagnosticsEngine &Diags;
147 const CodeGenOptions &CodeGenOpts;
148 const clang::TargetOptions &TargetOpts;
149 const LangOptions &LangOpts;
150 llvm::Module *TheModule;
151 IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS;
152
153 std::unique_ptr<raw_pwrite_stream> OS;
154
155 Triple TargetTriple;
156
157 TargetIRAnalysis getTargetIRAnalysis() const {
158 if (TM)
159 return TM->getTargetIRAnalysis();
160
161 return TargetIRAnalysis();
162 }
163
164 /// Generates the TargetMachine.
165 /// Leaves TM unchanged if it is unable to create the target machine.
166 /// Some of our clang tests specify triples which are not built
167 /// into clang. This is okay because these tests check the generated
168 /// IR, and they require DataLayout which depends on the triple.
169 /// In this case, we allow this method to fail and not report an error.
170 /// When MustCreateTM is used, we print an error if we are unable to load
171 /// the requested target.
172 void CreateTargetMachine(bool MustCreateTM);
173
174 std::unique_ptr<llvm::ToolOutputFile> openOutputFile(StringRef Path) {
175 std::error_code EC;
176 auto F = std::make_unique<llvm::ToolOutputFile>(Path, EC,
177 llvm::sys::fs::OF_None);
178 if (EC) {
179 Diags.Report(diag::err_fe_unable_to_open_output) << Path << EC.message();
180 F.reset();
181 }
182 return F;
183 }
184
185 void RunOptimizationPipeline(
186 BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
187 std::unique_ptr<llvm::ToolOutputFile> &ThinLinkOS, BackendConsumer *BC);
188 void RunCodegenPipeline(BackendAction Action,
189 std::unique_ptr<raw_pwrite_stream> &OS,
190 std::unique_ptr<llvm::ToolOutputFile> &DwoOS);
191
192 /// Check whether we should emit a module summary for regular LTO.
193 /// The module summary should be emitted by default for regular LTO
194 /// except for ld64 targets.
195 ///
196 /// \return True if the module summary should be emitted.
197 bool shouldEmitRegularLTOSummary() const {
198 return CodeGenOpts.PrepareForLTO && !CodeGenOpts.DisableLLVMPasses &&
199 TargetTriple.getVendor() != llvm::Triple::Apple;
200 }
201
202 /// Check whether we should emit a flag for UnifiedLTO.
203 /// The UnifiedLTO module flag should be set when UnifiedLTO is enabled for
204 /// ThinLTO or Full LTO with module summaries.
205 bool shouldEmitUnifiedLTOModueFlag() const {
206 return CodeGenOpts.UnifiedLTO &&
207 (CodeGenOpts.PrepareForThinLTO || shouldEmitRegularLTOSummary());
208 }
209
210public:
211 EmitAssemblyHelper(CompilerInstance &CI, CodeGenOptions &CGOpts,
212 llvm::Module *M,
213 IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS)
214 : CI(CI), Diags(CI.getDiagnostics()), CodeGenOpts(CGOpts),
215 TargetOpts(CI.getTargetOpts()), LangOpts(CI.getLangOpts()),
216 TheModule(M), VFS(std::move(VFS)),
217 TargetTriple(TheModule->getTargetTriple()) {}
218
219 ~EmitAssemblyHelper() {
220 if (CodeGenOpts.DisableFree)
221 BuryPointer(std::move(TM));
222 }
223
224 std::unique_ptr<TargetMachine> TM;
225
226 // Emit output using the new pass manager for the optimization pipeline.
227 void emitAssembly(BackendAction Action, std::unique_ptr<raw_pwrite_stream> OS,
228 BackendConsumer *BC);
229};
230} // namespace
231
232static SanitizerCoverageOptions
234 SanitizerCoverageOptions Opts;
235 Opts.CoverageType =
236 static_cast<SanitizerCoverageOptions::Type>(CGOpts.SanitizeCoverageType);
237 Opts.IndirectCalls = CGOpts.SanitizeCoverageIndirectCalls;
238 Opts.TraceBB = CGOpts.SanitizeCoverageTraceBB;
239 Opts.TraceCmp = CGOpts.SanitizeCoverageTraceCmp;
240 Opts.TraceDiv = CGOpts.SanitizeCoverageTraceDiv;
241 Opts.TraceGep = CGOpts.SanitizeCoverageTraceGep;
242 Opts.Use8bitCounters = CGOpts.SanitizeCoverage8bitCounters;
243 Opts.TracePC = CGOpts.SanitizeCoverageTracePC;
244 Opts.TracePCGuard = CGOpts.SanitizeCoverageTracePCGuard;
245 Opts.NoPrune = CGOpts.SanitizeCoverageNoPrune;
246 Opts.Inline8bitCounters = CGOpts.SanitizeCoverageInline8bitCounters;
247 Opts.InlineBoolFlag = CGOpts.SanitizeCoverageInlineBoolFlag;
248 Opts.PCTable = CGOpts.SanitizeCoveragePCTable;
249 Opts.StackDepth = CGOpts.SanitizeCoverageStackDepth;
250 Opts.StackDepthCallbackMin = CGOpts.SanitizeCoverageStackDepthCallbackMin;
251 Opts.TraceLoads = CGOpts.SanitizeCoverageTraceLoads;
252 Opts.TraceStores = CGOpts.SanitizeCoverageTraceStores;
253 Opts.CollectControlFlow = CGOpts.SanitizeCoverageControlFlow;
254 return Opts;
255}
256
257static SanitizerBinaryMetadataOptions
259 SanitizerBinaryMetadataOptions Opts;
260 Opts.Covered = CGOpts.SanitizeBinaryMetadataCovered;
261 Opts.Atomics = CGOpts.SanitizeBinaryMetadataAtomics;
262 Opts.UAR = CGOpts.SanitizeBinaryMetadataUAR;
263 return Opts;
264}
265
266// Check if ASan should use GC-friendly instrumentation for globals.
267// First of all, there is no point if -fdata-sections is off (expect for MachO,
268// where this is not a factor). Also, on ELF this feature requires an assembler
269// extension that only works with -integrated-as at the moment.
270static bool asanUseGlobalsGC(const Triple &T, const CodeGenOptions &CGOpts) {
271 if (!CGOpts.SanitizeAddressGlobalsDeadStripping)
272 return false;
273 switch (T.getObjectFormat()) {
274 case Triple::MachO:
275 case Triple::COFF:
276 return true;
277 case Triple::ELF:
278 return !CGOpts.DisableIntegratedAS;
279 case Triple::GOFF:
280 llvm::report_fatal_error("ASan not implemented for GOFF");
281 case Triple::XCOFF:
282 llvm::report_fatal_error("ASan not implemented for XCOFF.");
283 case Triple::Wasm:
284 case Triple::DXContainer:
285 case Triple::SPIRV:
286 case Triple::UnknownObjectFormat:
287 break;
288 }
289 return false;
290}
291
292static std::optional<llvm::CodeModel::Model>
293getCodeModel(const CodeGenOptions &CodeGenOpts) {
294 unsigned CodeModel = llvm::StringSwitch<unsigned>(CodeGenOpts.CodeModel)
295 .Case("tiny", llvm::CodeModel::Tiny)
296 .Case("small", llvm::CodeModel::Small)
297 .Case("kernel", llvm::CodeModel::Kernel)
298 .Case("medium", llvm::CodeModel::Medium)
299 .Case("large", llvm::CodeModel::Large)
300 .Cases({"default", ""}, ~1u)
301 .Default(~0u);
302 assert(CodeModel != ~0u && "invalid code model!");
303 if (CodeModel == ~1u)
304 return std::nullopt;
305 return static_cast<llvm::CodeModel::Model>(CodeModel);
306}
307
308static CodeGenFileType getCodeGenFileType(BackendAction Action) {
309 if (Action == Backend_EmitObj)
310 return CodeGenFileType::ObjectFile;
311 else if (Action == Backend_EmitMCNull)
312 return CodeGenFileType::Null;
313 else {
314 assert(Action == Backend_EmitAssembly && "Invalid action!");
315 return CodeGenFileType::AssemblyFile;
316 }
317}
318
320 return Action != Backend_EmitNothing && Action != Backend_EmitBC &&
321 Action != Backend_EmitLL;
322}
323
325 StringRef MainFilename) {
326 if (Args.empty())
327 return std::string{};
328
329 std::string FlatCmdLine;
330 raw_string_ostream OS(FlatCmdLine);
331 bool PrintedOneArg = false;
332 if (!StringRef(Args[0]).contains("-cc1")) {
333 llvm::sys::printArg(OS, "-cc1", /*Quote=*/true);
334 PrintedOneArg = true;
335 }
336 for (unsigned i = 0; i < Args.size(); i++) {
337 StringRef Arg = Args[i];
338 if (Arg.empty())
339 continue;
340 if (Arg == "-main-file-name" || Arg == "-o") {
341 i++; // Skip this argument and next one.
342 continue;
343 }
344 if (Arg.starts_with("-object-file-name") || Arg == MainFilename)
345 continue;
346 // Skip fmessage-length for reproducibility.
347 if (Arg.starts_with("-fmessage-length"))
348 continue;
349 if (PrintedOneArg)
350 OS << " ";
351 llvm::sys::printArg(OS, Arg, /*Quote=*/true);
352 PrintedOneArg = true;
353 }
354 return FlatCmdLine;
355}
356
358 DiagnosticsEngine &Diags,
359 llvm::TargetOptions &Options) {
360 const auto &CodeGenOpts = CI.getCodeGenOpts();
361 const auto &TargetOpts = CI.getTargetOpts();
362 const auto &LangOpts = CI.getLangOpts();
363 const auto &HSOpts = CI.getHeaderSearchOpts();
364 switch (LangOpts.getThreadModel()) {
366 Options.ThreadModel = llvm::ThreadModel::POSIX;
367 break;
369 Options.ThreadModel = llvm::ThreadModel::Single;
370 break;
371 }
372
373 // Set float ABI type.
374 assert((CodeGenOpts.FloatABI == "soft" || CodeGenOpts.FloatABI == "softfp" ||
375 CodeGenOpts.FloatABI == "hard" || CodeGenOpts.FloatABI.empty()) &&
376 "Invalid Floating Point ABI!");
377 Options.FloatABIType =
378 llvm::StringSwitch<llvm::FloatABI::ABIType>(CodeGenOpts.FloatABI)
379 .Case("soft", llvm::FloatABI::Soft)
380 .Case("softfp", llvm::FloatABI::Soft)
381 .Case("hard", llvm::FloatABI::Hard)
382 .Default(llvm::FloatABI::Default);
383
384 // Set FP fusion mode.
385 switch (LangOpts.getDefaultFPContractMode()) {
387 // Preserve any contraction performed by the front-end. (Strict performs
388 // splitting of the muladd intrinsic in the backend.)
389 Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
390 break;
393 Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
394 break;
396 Options.AllowFPOpFusion = llvm::FPOpFusion::Fast;
397 break;
398 }
399
400 Options.BinutilsVersion =
401 llvm::TargetMachine::parseBinutilsVersion(CodeGenOpts.BinutilsVersion);
402 Options.UseInitArray = CodeGenOpts.UseInitArray;
403 Options.DisableIntegratedAS = CodeGenOpts.DisableIntegratedAS;
404
405 // Set EABI version.
406 Options.EABIVersion = TargetOpts.EABIVersion;
407
408 if (CodeGenOpts.hasSjLjExceptions())
409 Options.ExceptionModel = llvm::ExceptionHandling::SjLj;
410 if (CodeGenOpts.hasSEHExceptions())
411 Options.ExceptionModel = llvm::ExceptionHandling::WinEH;
412 if (CodeGenOpts.hasDWARFExceptions())
413 Options.ExceptionModel = llvm::ExceptionHandling::DwarfCFI;
414 if (CodeGenOpts.hasWasmExceptions())
415 Options.ExceptionModel = llvm::ExceptionHandling::Wasm;
416
417 Options.NoInfsFPMath = LangOpts.NoHonorInfs;
418 Options.NoNaNsFPMath = LangOpts.NoHonorNaNs;
419 Options.NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
420
421 Options.BBAddrMap = CodeGenOpts.BBAddrMap;
422 Options.BBSections =
423 llvm::StringSwitch<llvm::BasicBlockSection>(CodeGenOpts.BBSections)
424 .Case("all", llvm::BasicBlockSection::All)
425 .StartsWith("list=", llvm::BasicBlockSection::List)
426 .Case("none", llvm::BasicBlockSection::None)
427 .Default(llvm::BasicBlockSection::None);
428
429 if (Options.BBSections == llvm::BasicBlockSection::List) {
430 ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
431 CI.getVirtualFileSystem().getBufferForFile(
432 CodeGenOpts.BBSections.substr(5));
433 if (!MBOrErr) {
434 Diags.Report(diag::err_fe_unable_to_load_basic_block_sections_file)
435 << MBOrErr.getError().message();
436 return false;
437 }
438 Options.BBSectionsFuncListBuf = std::move(*MBOrErr);
439 }
440
441 Options.EnableMachineFunctionSplitter = CodeGenOpts.SplitMachineFunctions;
442 Options.EnableStaticDataPartitioning =
443 CodeGenOpts.PartitionStaticDataSections;
444 Options.FunctionSections = CodeGenOpts.FunctionSections;
445 Options.DataSections = CodeGenOpts.DataSections;
446 Options.IgnoreXCOFFVisibility = LangOpts.IgnoreXCOFFVisibility;
447 Options.UniqueSectionNames = CodeGenOpts.UniqueSectionNames;
448 Options.UniqueBasicBlockSectionNames =
449 CodeGenOpts.UniqueBasicBlockSectionNames;
450 Options.SeparateNamedSections = CodeGenOpts.SeparateNamedSections;
451 Options.TLSSize = CodeGenOpts.TLSSize;
452 Options.EnableTLSDESC = CodeGenOpts.EnableTLSDESC;
453 Options.EmulatedTLS = CodeGenOpts.EmulatedTLS;
454 Options.DebuggerTuning = CodeGenOpts.getDebuggerTuning();
455 Options.EmitStackSizeSection = CodeGenOpts.StackSizeSection;
456 Options.StackUsageOutput = CodeGenOpts.StackUsageOutput;
457 Options.EmitAddrsig = CodeGenOpts.Addrsig;
458 Options.ForceDwarfFrameSection = CodeGenOpts.ForceDwarfFrameSection;
459 Options.EmitCallGraphSection = CodeGenOpts.CallGraphSection;
460 Options.EmitCallSiteInfo = CodeGenOpts.EmitCallSiteInfo;
461 Options.EnableAIXExtendedAltivecABI = LangOpts.EnableAIXExtendedAltivecABI;
462 Options.XRayFunctionIndex = CodeGenOpts.XRayFunctionIndex;
463 Options.LoopAlignment = CodeGenOpts.LoopAlignment;
464 Options.DebugStrictDwarf = CodeGenOpts.DebugStrictDwarf;
466 Options.Hotpatch = CodeGenOpts.HotPatch;
467 Options.JMCInstrument = CodeGenOpts.JMCInstrument;
468 Options.XCOFFReadOnlyPointers = CodeGenOpts.XCOFFReadOnlyPointers;
469 Options.VecLib =
470 convertDriverVectorLibraryToVectorLibrary(CodeGenOpts.getVecLib());
471
472 switch (CodeGenOpts.getSwiftAsyncFramePointer()) {
474 Options.SwiftAsyncFramePointer =
475 SwiftAsyncFramePointerMode::DeploymentBased;
476 break;
477
479 Options.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Always;
480 break;
481
483 Options.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Never;
484 break;
485 }
486
487 Options.MCOptions.SplitDwarfFile = CodeGenOpts.SplitDwarfFile;
488 Options.MCOptions.EmitDwarfUnwind = CodeGenOpts.getEmitDwarfUnwind();
489 Options.MCOptions.EmitCompactUnwindNonCanonical =
490 CodeGenOpts.EmitCompactUnwindNonCanonical;
491 Options.MCOptions.EmitSFrameUnwind = CodeGenOpts.EmitSFrameUnwind;
492 Options.MCOptions.MCRelaxAll = CodeGenOpts.RelaxAll;
493 Options.MCOptions.MCSaveTempLabels = CodeGenOpts.SaveTempLabels;
494 Options.MCOptions.MCUseDwarfDirectory =
495 CodeGenOpts.NoDwarfDirectoryAsm
496 ? llvm::MCTargetOptions::DisableDwarfDirectory
497 : llvm::MCTargetOptions::EnableDwarfDirectory;
498 Options.MCOptions.MCNoExecStack = CodeGenOpts.NoExecStack;
499 Options.MCOptions.MCIncrementalLinkerCompatible =
500 CodeGenOpts.IncrementalLinkerCompatible;
501 Options.MCOptions.MCFatalWarnings = CodeGenOpts.FatalWarnings;
502 Options.MCOptions.MCNoWarn = CodeGenOpts.NoWarn;
503 Options.MCOptions.AsmVerbose = CodeGenOpts.AsmVerbose;
504 Options.MCOptions.Dwarf64 = CodeGenOpts.Dwarf64;
505 Options.MCOptions.PreserveAsmComments = CodeGenOpts.PreserveAsmComments;
506 Options.MCOptions.Crel = CodeGenOpts.Crel;
507 Options.MCOptions.ImplicitMapSyms = CodeGenOpts.ImplicitMapSyms;
508 Options.MCOptions.X86RelaxRelocations = CodeGenOpts.X86RelaxRelocations;
509 Options.MCOptions.CompressDebugSections =
510 CodeGenOpts.getCompressDebugSections();
511 if (CodeGenOpts.OutputAsmVariant != 3) // 3 (default): not specified
512 Options.MCOptions.OutputAsmVariant = CodeGenOpts.OutputAsmVariant;
513 Options.MCOptions.ABIName = TargetOpts.ABI;
514 for (const auto &Entry : HSOpts.UserEntries)
515 if (!Entry.IsFramework &&
516 (Entry.Group == frontend::IncludeDirGroup::Quoted ||
517 Entry.Group == frontend::IncludeDirGroup::Angled ||
518 Entry.Group == frontend::IncludeDirGroup::System))
519 Options.MCOptions.IASSearchPaths.push_back(
520 Entry.IgnoreSysRoot ? Entry.Path : HSOpts.Sysroot + Entry.Path);
521 Options.MCOptions.Argv0 = CodeGenOpts.Argv0 ? CodeGenOpts.Argv0 : "";
522 Options.MCOptions.CommandlineArgs = flattenClangCommandLine(
523 CodeGenOpts.CommandLineArgs, CodeGenOpts.MainFileName);
524 Options.MCOptions.AsSecureLogFile = CodeGenOpts.AsSecureLogFile;
525 Options.MCOptions.PPCUseFullRegisterNames =
526 CodeGenOpts.PPCUseFullRegisterNames;
527 Options.MisExpect = CodeGenOpts.MisExpect;
528
529 return true;
530}
531
532static std::optional<GCOVOptions>
533getGCOVOptions(const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts) {
534 if (CodeGenOpts.CoverageNotesFile.empty() &&
535 CodeGenOpts.CoverageDataFile.empty())
536 return std::nullopt;
537 // Not using 'GCOVOptions::getDefault' allows us to avoid exiting if
538 // LLVM's -default-gcov-version flag is set to something invalid.
539 GCOVOptions Options;
540 Options.EmitNotes = !CodeGenOpts.CoverageNotesFile.empty();
541 Options.EmitData = !CodeGenOpts.CoverageDataFile.empty();
542 llvm::copy(CodeGenOpts.CoverageVersion, std::begin(Options.Version));
543 Options.NoRedZone = CodeGenOpts.DisableRedZone;
544 Options.Filter = CodeGenOpts.ProfileFilterFiles;
545 Options.Exclude = CodeGenOpts.ProfileExcludeFiles;
546 Options.Atomic = CodeGenOpts.AtomicProfileUpdate;
547 return Options;
548}
549
550static std::optional<InstrProfOptions>
552 const LangOptions &LangOpts) {
553 if (!CodeGenOpts.hasProfileClangInstr())
554 return std::nullopt;
555 InstrProfOptions Options;
556 Options.NoRedZone = CodeGenOpts.DisableRedZone;
557 Options.InstrProfileOutput = CodeGenOpts.ContinuousProfileSync
558 ? ("%c" + CodeGenOpts.InstrProfileOutput)
559 : CodeGenOpts.InstrProfileOutput;
560 Options.Atomic = CodeGenOpts.AtomicProfileUpdate;
561 return Options;
562}
563
564static void setCommandLineOpts(const CodeGenOptions &CodeGenOpts,
565 vfs::FileSystem &VFS) {
567 BackendArgs.push_back("clang"); // Fake program name.
568 if (!CodeGenOpts.DebugPass.empty()) {
569 BackendArgs.push_back("-debug-pass");
570 BackendArgs.push_back(CodeGenOpts.DebugPass.c_str());
571 }
572 if (!CodeGenOpts.LimitFloatPrecision.empty()) {
573 BackendArgs.push_back("-limit-float-precision");
574 BackendArgs.push_back(CodeGenOpts.LimitFloatPrecision.c_str());
575 }
576
577 // Check for the default "clang" invocation that won't set any cl::opt values.
578 // Skip trying to parse the command line invocation to avoid the issues
579 // described below.
580 if (BackendArgs.size() == 1)
581 return;
582 BackendArgs.push_back(nullptr);
583 // FIXME: The command line parser below is not thread-safe and shares a global
584 // state, so this call might crash or overwrite the options of another Clang
585 // instance in the same process.
586 llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1, BackendArgs.data(),
587 /*Overview=*/"", /*Errs=*/nullptr,
588 /*VFS=*/&VFS);
589}
590
591void EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {
592 // Create the TargetMachine for generating code.
593 std::string Error;
594 const llvm::Triple &Triple = TheModule->getTargetTriple();
595 const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
596 if (!TheTarget) {
597 if (MustCreateTM)
598 Diags.Report(diag::err_fe_unable_to_create_target) << Error;
599 return;
600 }
601
602 std::optional<llvm::CodeModel::Model> CM = getCodeModel(CodeGenOpts);
603 std::string FeaturesStr =
604 llvm::join(TargetOpts.Features.begin(), TargetOpts.Features.end(), ",");
605 llvm::Reloc::Model RM = CodeGenOpts.RelocationModel;
606 std::optional<CodeGenOptLevel> OptLevelOrNone =
607 CodeGenOpt::getLevel(CodeGenOpts.OptimizationLevel);
608 assert(OptLevelOrNone && "Invalid optimization level!");
609 CodeGenOptLevel OptLevel = *OptLevelOrNone;
610
611 llvm::TargetOptions Options;
612 if (!initTargetOptions(CI, Diags, Options))
613 return;
614 TM.reset(TheTarget->createTargetMachine(Triple, TargetOpts.CPU, FeaturesStr,
615 Options, RM, CM, OptLevel));
616 if (TM)
617 TM->setLargeDataThreshold(CodeGenOpts.LargeDataThreshold);
618}
619
620static OptimizationLevel mapToLevel(const CodeGenOptions &Opts) {
621 switch (Opts.OptimizationLevel) {
622 default:
623 llvm_unreachable("Invalid optimization level!");
624
625 case 0:
626 return OptimizationLevel::O0;
627
628 case 1:
629 return OptimizationLevel::O1;
630
631 case 2:
632 switch (Opts.OptimizeSize) {
633 default:
634 llvm_unreachable("Invalid optimization level for size!");
635
636 case 0:
637 return OptimizationLevel::O2;
638
639 case 1:
640 return OptimizationLevel::Os;
641
642 case 2:
643 return OptimizationLevel::Oz;
644 }
645
646 case 3:
647 return OptimizationLevel::O3;
648 }
649}
650
651static void addKCFIPass(const Triple &TargetTriple, const LangOptions &LangOpts,
652 PassBuilder &PB) {
653 // If the back-end supports KCFI operand bundle lowering, skip KCFIPass.
654 if (TargetTriple.getArch() == llvm::Triple::x86_64 ||
655 TargetTriple.isAArch64(64) || TargetTriple.isRISCV() ||
656 TargetTriple.isARM() || TargetTriple.isThumb())
657 return;
658
659 // Ensure we lower KCFI operand bundles with -O0.
660 PB.registerOptimizerLastEPCallback(
661 [&](ModulePassManager &MPM, OptimizationLevel Level, ThinOrFullLTOPhase) {
662 if (Level == OptimizationLevel::O0 &&
663 LangOpts.Sanitize.has(SanitizerKind::KCFI))
664 MPM.addPass(createModuleToFunctionPassAdaptor(KCFIPass()));
665 });
666
667 // When optimizations are requested, run KCIFPass after InstCombine to
668 // avoid unnecessary checks.
669 PB.registerPeepholeEPCallback(
670 [&](FunctionPassManager &FPM, OptimizationLevel Level) {
671 if (Level != OptimizationLevel::O0 &&
672 LangOpts.Sanitize.has(SanitizerKind::KCFI))
673 FPM.addPass(KCFIPass());
674 });
675}
676
677static void addSanitizers(const Triple &TargetTriple,
678 const CodeGenOptions &CodeGenOpts,
679 const LangOptions &LangOpts, PassBuilder &PB) {
680 auto SanitizersCallback = [&](ModulePassManager &MPM, OptimizationLevel Level,
681 ThinOrFullLTOPhase) {
682 if (CodeGenOpts.hasSanitizeCoverage()) {
683 auto SancovOpts = getSancovOptsFromCGOpts(CodeGenOpts);
684 MPM.addPass(
685 SanitizerCoveragePass(SancovOpts, PB.getVirtualFileSystemPtr(),
688 }
689
690 if (CodeGenOpts.hasSanitizeBinaryMetadata()) {
691 MPM.addPass(SanitizerBinaryMetadataPass(
693 PB.getVirtualFileSystemPtr(),
695 }
696
697 auto MSanPass = [&](SanitizerMask Mask, bool CompileKernel) {
698 if (LangOpts.Sanitize.has(Mask)) {
699 int TrackOrigins = CodeGenOpts.SanitizeMemoryTrackOrigins;
700 bool Recover = CodeGenOpts.SanitizeRecover.has(Mask);
701
702 MemorySanitizerOptions options(TrackOrigins, Recover, CompileKernel,
703 CodeGenOpts.SanitizeMemoryParamRetval);
704 MPM.addPass(MemorySanitizerPass(options));
705 if (Level != OptimizationLevel::O0) {
706 // MemorySanitizer inserts complex instrumentation that mostly follows
707 // the logic of the original code, but operates on "shadow" values. It
708 // can benefit from re-running some general purpose optimization
709 // passes.
710 MPM.addPass(RequireAnalysisPass<GlobalsAA, llvm::Module>());
711 FunctionPassManager FPM;
712 FPM.addPass(EarlyCSEPass(true /* Enable mem-ssa. */));
713 FPM.addPass(InstCombinePass());
714 FPM.addPass(JumpThreadingPass());
715 FPM.addPass(GVNPass());
716 FPM.addPass(InstCombinePass());
717 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
718 }
719 }
720 };
721 MSanPass(SanitizerKind::Memory, false);
722 MSanPass(SanitizerKind::KernelMemory, true);
723
724 if (LangOpts.Sanitize.has(SanitizerKind::Thread)) {
725 MPM.addPass(ModuleThreadSanitizerPass());
726 MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass()));
727 }
728
729 if (LangOpts.Sanitize.has(SanitizerKind::Type))
730 MPM.addPass(TypeSanitizerPass());
731
732 if (LangOpts.Sanitize.has(SanitizerKind::NumericalStability))
733 MPM.addPass(NumericalStabilitySanitizerPass());
734
735 if (LangOpts.Sanitize.has(SanitizerKind::Realtime))
736 MPM.addPass(RealtimeSanitizerPass());
737
738 auto ASanPass = [&](SanitizerMask Mask, bool CompileKernel) {
739 if (LangOpts.Sanitize.has(Mask)) {
740 bool UseGlobalGC = asanUseGlobalsGC(TargetTriple, CodeGenOpts);
741 bool UseOdrIndicator = CodeGenOpts.SanitizeAddressUseOdrIndicator;
742 llvm::AsanDtorKind DestructorKind =
743 CodeGenOpts.getSanitizeAddressDtor();
744 AddressSanitizerOptions Opts;
745 Opts.CompileKernel = CompileKernel;
746 Opts.Recover = CodeGenOpts.SanitizeRecover.has(Mask);
747 Opts.UseAfterScope = CodeGenOpts.SanitizeAddressUseAfterScope;
748 Opts.UseAfterReturn = CodeGenOpts.getSanitizeAddressUseAfterReturn();
749 MPM.addPass(AddressSanitizerPass(Opts, UseGlobalGC, UseOdrIndicator,
750 DestructorKind));
751 }
752 };
753 ASanPass(SanitizerKind::Address, false);
754 ASanPass(SanitizerKind::KernelAddress, true);
755
756 auto HWASanPass = [&](SanitizerMask Mask, bool CompileKernel) {
757 if (LangOpts.Sanitize.has(Mask)) {
758 bool Recover = CodeGenOpts.SanitizeRecover.has(Mask);
759 MPM.addPass(HWAddressSanitizerPass(
760 {CompileKernel, Recover,
761 /*DisableOptimization=*/CodeGenOpts.OptimizationLevel == 0}));
762 }
763 };
764 HWASanPass(SanitizerKind::HWAddress, false);
765 HWASanPass(SanitizerKind::KernelHWAddress, true);
766
767 if (LangOpts.Sanitize.has(SanitizerKind::DataFlow)) {
768 MPM.addPass(DataFlowSanitizerPass(LangOpts.NoSanitizeFiles,
769 PB.getVirtualFileSystemPtr()));
770 }
771 };
773 PB.registerOptimizerEarlyEPCallback(
774 [SanitizersCallback](ModulePassManager &MPM, OptimizationLevel Level,
775 ThinOrFullLTOPhase Phase) {
776 ModulePassManager NewMPM;
777 SanitizersCallback(NewMPM, Level, Phase);
778 if (!NewMPM.isEmpty()) {
779 // Sanitizers can abandon<GlobalsAA>.
780 NewMPM.addPass(RequireAnalysisPass<GlobalsAA, llvm::Module>());
781 MPM.addPass(std::move(NewMPM));
782 }
783 });
784 } else {
785 // LastEP does not need GlobalsAA.
786 PB.registerOptimizerLastEPCallback(SanitizersCallback);
787 }
788}
789
791 const LangOptions &LangOpts, PassBuilder &PB) {
792 // SanitizeSkipHotCutoffs: doubles with range [0, 1]
793 // Opts.cutoffs: unsigned ints with range [0, 1000000]
794 auto ScaledCutoffs = CodeGenOpts.SanitizeSkipHotCutoffs.getAllScaled(1000000);
795 uint64_t AllowRuntimeCheckSkipHotCutoff =
796 CodeGenOpts.AllowRuntimeCheckSkipHotCutoff.value_or(0.0) * 1000000;
797 // Only register the pass if one of the relevant sanitizers is enabled.
798 // This avoids pipeline overhead for builds that do not use these sanitizers.
799 bool LowerAllowSanitize = LangOpts.Sanitize.hasOneOf(
800 SanitizerKind::Address | SanitizerKind::KernelAddress |
801 SanitizerKind::Thread | SanitizerKind::Memory |
802 SanitizerKind::KernelMemory | SanitizerKind::HWAddress |
803 SanitizerKind::KernelHWAddress);
804
805 // TODO: remove IsRequested()
806 if (LowerAllowCheckPass::IsRequested() || ScaledCutoffs.has_value() ||
807 CodeGenOpts.AllowRuntimeCheckSkipHotCutoff.has_value() ||
808 LowerAllowSanitize) {
809 // We want to call it after inline, which is about OptimizerEarlyEPCallback.
810 PB.registerOptimizerEarlyEPCallback(
811 [ScaledCutoffs, AllowRuntimeCheckSkipHotCutoff](
812 ModulePassManager &MPM, OptimizationLevel Level,
813 ThinOrFullLTOPhase Phase) {
814 LowerAllowCheckPass::Options Opts;
815 // TODO: after removing IsRequested(), make this unconditional
816 if (ScaledCutoffs.has_value())
817 Opts.cutoffs = ScaledCutoffs.value();
818 Opts.runtime_check = AllowRuntimeCheckSkipHotCutoff;
819 MPM.addPass(
820 createModuleToFunctionPassAdaptor(LowerAllowCheckPass(Opts)));
821 });
822 }
823}
824
825void EmitAssemblyHelper::RunOptimizationPipeline(
826 BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
827 std::unique_ptr<llvm::ToolOutputFile> &ThinLinkOS, BackendConsumer *BC) {
828 std::optional<PGOOptions> PGOOpt;
829
830 if (CodeGenOpts.hasProfileIRInstr())
831 // -fprofile-generate.
832 PGOOpt = PGOOptions(getProfileGenName(CodeGenOpts), "", "",
833 CodeGenOpts.MemoryProfileUsePath, PGOOptions::IRInstr,
834 PGOOptions::NoCSAction, ClPGOColdFuncAttr,
835 CodeGenOpts.DebugInfoForProfiling,
836 /*PseudoProbeForProfiling=*/false,
837 CodeGenOpts.AtomicProfileUpdate);
838 else if (CodeGenOpts.hasProfileIRUse()) {
839 // -fprofile-use.
840 auto CSAction = CodeGenOpts.hasProfileCSIRUse() ? PGOOptions::CSIRUse
841 : PGOOptions::NoCSAction;
842 PGOOpt = PGOOptions(CodeGenOpts.ProfileInstrumentUsePath, "",
843 CodeGenOpts.ProfileRemappingFile,
844 CodeGenOpts.MemoryProfileUsePath, PGOOptions::IRUse,
845 CSAction, ClPGOColdFuncAttr,
846 CodeGenOpts.DebugInfoForProfiling);
847 } else if (!CodeGenOpts.SampleProfileFile.empty())
848 // -fprofile-sample-use
849 PGOOpt = PGOOptions(
850 CodeGenOpts.SampleProfileFile, "", CodeGenOpts.ProfileRemappingFile,
851 CodeGenOpts.MemoryProfileUsePath, PGOOptions::SampleUse,
852 PGOOptions::NoCSAction, ClPGOColdFuncAttr,
853 CodeGenOpts.DebugInfoForProfiling, CodeGenOpts.PseudoProbeForProfiling);
854 else if (!CodeGenOpts.MemoryProfileUsePath.empty())
855 // -fmemory-profile-use (without any of the above options)
856 PGOOpt = PGOOptions("", "", "", CodeGenOpts.MemoryProfileUsePath,
857 PGOOptions::NoAction, PGOOptions::NoCSAction,
858 ClPGOColdFuncAttr, CodeGenOpts.DebugInfoForProfiling);
859 else if (CodeGenOpts.PseudoProbeForProfiling)
860 // -fpseudo-probe-for-profiling
861 PGOOpt = PGOOptions("", "", "", /*MemoryProfile=*/"", PGOOptions::NoAction,
862 PGOOptions::NoCSAction, ClPGOColdFuncAttr,
863 CodeGenOpts.DebugInfoForProfiling, true);
864 else if (CodeGenOpts.DebugInfoForProfiling)
865 // -fdebug-info-for-profiling
866 PGOOpt = PGOOptions("", "", "", /*MemoryProfile=*/"", PGOOptions::NoAction,
867 PGOOptions::NoCSAction, ClPGOColdFuncAttr, true);
868
869 // Check to see if we want to generate a CS profile.
870 if (CodeGenOpts.hasProfileCSIRInstr()) {
871 assert(!CodeGenOpts.hasProfileCSIRUse() &&
872 "Cannot have both CSProfileUse pass and CSProfileGen pass at "
873 "the same time");
874 if (PGOOpt) {
875 assert(PGOOpt->Action != PGOOptions::IRInstr &&
876 PGOOpt->Action != PGOOptions::SampleUse &&
877 "Cannot run CSProfileGen pass with ProfileGen or SampleUse "
878 " pass");
879 PGOOpt->CSProfileGenFile = getProfileGenName(CodeGenOpts);
880 PGOOpt->CSAction = PGOOptions::CSIRInstr;
881 } else
882 PGOOpt = PGOOptions("", getProfileGenName(CodeGenOpts), "",
883 /*MemoryProfile=*/"", PGOOptions::NoAction,
884 PGOOptions::CSIRInstr, ClPGOColdFuncAttr,
885 CodeGenOpts.DebugInfoForProfiling);
886 }
887 if (TM)
888 TM->setPGOOption(PGOOpt);
889
890 PipelineTuningOptions PTO;
891 PTO.LoopUnrolling = CodeGenOpts.UnrollLoops;
892 PTO.LoopInterchange = CodeGenOpts.InterchangeLoops;
893 PTO.LoopFusion = CodeGenOpts.FuseLoops;
894 // For historical reasons, loop interleaving is set to mirror setting for loop
895 // unrolling.
896 PTO.LoopInterleaving = CodeGenOpts.UnrollLoops;
897 PTO.LoopVectorization = CodeGenOpts.VectorizeLoop;
898 PTO.SLPVectorization = CodeGenOpts.VectorizeSLP;
899 PTO.MergeFunctions = CodeGenOpts.MergeFunctions;
900 // Only enable CGProfilePass when using integrated assembler, since
901 // non-integrated assemblers don't recognize .cgprofile section.
902 PTO.CallGraphProfile = !CodeGenOpts.DisableIntegratedAS;
903 PTO.UnifiedLTO = CodeGenOpts.UnifiedLTO;
904 PTO.DevirtualizeSpeculatively = CodeGenOpts.DevirtualizeSpeculatively;
905
906 LoopAnalysisManager LAM;
907 FunctionAnalysisManager FAM;
908 CGSCCAnalysisManager CGAM;
909 ModuleAnalysisManager MAM;
910
911 bool DebugPassStructure = CodeGenOpts.DebugPass == "Structure";
912 PassInstrumentationCallbacks PIC;
913 PrintPassOptions PrintPassOpts;
914 PrintPassOpts.Indent = DebugPassStructure;
915 PrintPassOpts.SkipAnalyses = DebugPassStructure;
916 StandardInstrumentations SI(
917 TheModule->getContext(),
918 (CodeGenOpts.DebugPassManager || DebugPassStructure),
919 CodeGenOpts.VerifyEach, PrintPassOpts);
920 SI.registerCallbacks(PIC, &MAM);
921 PassBuilder PB(TM.get(), PTO, PGOOpt, &PIC, CI.getVirtualFileSystemPtr());
922
923 // Handle the assignment tracking feature options.
924 switch (CodeGenOpts.getAssignmentTrackingMode()) {
925 case CodeGenOptions::AssignmentTrackingOpts::Forced:
926 PB.registerPipelineStartEPCallback(
927 [&](ModulePassManager &MPM, OptimizationLevel Level) {
928 MPM.addPass(AssignmentTrackingPass());
929 });
930 break;
931 case CodeGenOptions::AssignmentTrackingOpts::Enabled:
932 // Disable assignment tracking in LTO builds for now as the performance
933 // cost is too high. Disable for LLDB tuning due to llvm.org/PR43126.
934 if (!CodeGenOpts.PrepareForThinLTO && !CodeGenOpts.PrepareForLTO &&
935 CodeGenOpts.getDebuggerTuning() != llvm::DebuggerKind::LLDB) {
936 PB.registerPipelineStartEPCallback(
937 [&](ModulePassManager &MPM, OptimizationLevel Level) {
938 // Only use assignment tracking if optimisations are enabled.
939 if (Level != OptimizationLevel::O0)
940 MPM.addPass(AssignmentTrackingPass());
941 });
942 }
943 break;
944 case CodeGenOptions::AssignmentTrackingOpts::Disabled:
945 break;
946 }
947
948 // Enable verify-debuginfo-preserve-each for new PM.
949 DebugifyEachInstrumentation Debugify;
950 DebugInfoPerPass DebugInfoBeforePass;
951 if (CodeGenOpts.EnableDIPreservationVerify) {
952 Debugify.setDebugifyMode(DebugifyMode::OriginalDebugInfo);
953 Debugify.setDebugInfoBeforePass(DebugInfoBeforePass);
954
955 if (!CodeGenOpts.DIBugsReportFilePath.empty())
956 Debugify.setOrigDIVerifyBugsReportFilePath(
957 CodeGenOpts.DIBugsReportFilePath);
958 Debugify.registerCallbacks(PIC, MAM);
959
960#if LLVM_ENABLE_DEBUGLOC_TRACKING_COVERAGE
961 // If we're using debug location coverage tracking, mark all the
962 // instructions coming out of the frontend without a DebugLoc as being
963 // compiler-generated, to prevent both those instructions and new
964 // instructions that inherit their location from being treated as
965 // incorrectly empty locations.
966 for (Function &F : *TheModule) {
967 if (!F.getSubprogram())
968 continue;
969 for (BasicBlock &BB : F)
970 for (Instruction &I : BB)
971 if (!I.getDebugLoc())
972 I.setDebugLoc(DebugLoc::getCompilerGenerated());
973 }
974#endif
975 }
976 // Register plugin callbacks with PB.
977 for (const std::unique_ptr<PassPlugin> &Plugin : CI.getPassPlugins())
978 Plugin->registerPassBuilderCallbacks(PB);
979 for (const auto &PassCallback : CodeGenOpts.PassBuilderCallbacks)
980 PassCallback(PB);
981#define HANDLE_EXTENSION(Ext) \
982 get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
983#include "llvm/Support/Extension.def"
984
985 // Register the target library analysis directly and give it a customized
986 // preset TLI.
987 std::unique_ptr<TargetLibraryInfoImpl> TLII(
988 llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
989 FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); });
990
991 // Register all the basic analyses with the managers.
992 PB.registerModuleAnalyses(MAM);
993 PB.registerCGSCCAnalyses(CGAM);
994 PB.registerFunctionAnalyses(FAM);
995 PB.registerLoopAnalyses(LAM);
996 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
997
998 ModulePassManager MPM;
999 // Add a verifier pass, before any other passes, to catch CodeGen issues.
1000 if (CodeGenOpts.VerifyModule)
1001 MPM.addPass(VerifierPass());
1002
1003 if (!CodeGenOpts.DisableLLVMPasses) {
1004 // Map our optimization levels into one of the distinct levels used to
1005 // configure the pipeline.
1006 OptimizationLevel Level = mapToLevel(CodeGenOpts);
1007
1008 const bool PrepareForThinLTO = CodeGenOpts.PrepareForThinLTO;
1009 const bool PrepareForLTO = CodeGenOpts.PrepareForLTO;
1010
1011 if (LangOpts.ObjCAutoRefCount) {
1012 PB.registerPipelineStartEPCallback(
1013 [](ModulePassManager &MPM, OptimizationLevel Level) {
1014 if (Level != OptimizationLevel::O0)
1015 MPM.addPass(
1016 createModuleToFunctionPassAdaptor(ObjCARCExpandPass()));
1017 });
1018 PB.registerScalarOptimizerLateEPCallback(
1019 [](FunctionPassManager &FPM, OptimizationLevel Level) {
1020 if (Level != OptimizationLevel::O0)
1021 FPM.addPass(ObjCARCOptPass());
1022 });
1023 }
1024
1025 // If we reached here with a non-empty index file name, then the index
1026 // file was empty and we are not performing ThinLTO backend compilation
1027 // (used in testing in a distributed build environment).
1028 bool IsThinLTOPostLink = !CodeGenOpts.ThinLTOIndexFile.empty();
1029 // If so drop any the type test assume sequences inserted for whole program
1030 // vtables so that codegen doesn't complain.
1031 if (IsThinLTOPostLink)
1032 PB.registerPipelineStartEPCallback(
1033 [](ModulePassManager &MPM, OptimizationLevel Level) {
1034 MPM.addPass(LowerTypeTestsPass(
1035 /*ExportSummary=*/nullptr,
1036 /*ImportSummary=*/nullptr,
1037 /*DropTypeTests=*/lowertypetests::DropTestKind::Assume));
1038 });
1039
1040 // Register callbacks to schedule sanitizer passes at the appropriate part
1041 // of the pipeline.
1042 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
1043 PB.registerScalarOptimizerLateEPCallback([this](FunctionPassManager &FPM,
1044 OptimizationLevel Level) {
1045 BoundsCheckingPass::Options Options;
1046 if (CodeGenOpts.SanitizeSkipHotCutoffs[SanitizerKind::SO_LocalBounds] ||
1048 static_assert(SanitizerKind::SO_LocalBounds <=
1049 std::numeric_limits<
1050 decltype(Options.GuardKind)::value_type>::max(),
1051 "Update type of llvm.allow.ubsan.check to represent "
1052 "SanitizerKind::SO_LocalBounds.");
1053 Options.GuardKind = SanitizerKind::SO_LocalBounds;
1054 }
1055 Options.Merge =
1056 CodeGenOpts.SanitizeMergeHandlers.has(SanitizerKind::LocalBounds);
1057 if (!CodeGenOpts.SanitizeTrap.has(SanitizerKind::LocalBounds)) {
1058 Options.Rt = {
1059 /*MinRuntime=*/static_cast<bool>(
1060 CodeGenOpts.SanitizeMinimalRuntime),
1061 /*MayReturn=*/
1062 CodeGenOpts.SanitizeRecover.has(SanitizerKind::LocalBounds),
1063 /*HandlerPreserveAllRegs=*/
1064 static_cast<bool>(CodeGenOpts.SanitizeHandlerPreserveAllRegs),
1065 };
1066 }
1067 FPM.addPass(BoundsCheckingPass(Options));
1068 });
1069
1070 if (!IsThinLTOPostLink) {
1071 // Most sanitizers only run during PreLink stage.
1072 addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
1073 addKCFIPass(TargetTriple, LangOpts, PB);
1074 addLowerAllowCheckPass(CodeGenOpts, LangOpts, PB);
1075
1076 PB.registerPipelineStartEPCallback(
1077 [&](ModulePassManager &MPM, OptimizationLevel Level) {
1078 if (Level == OptimizationLevel::O0 &&
1079 LangOpts.Sanitize.has(SanitizerKind::AllocToken)) {
1080 // With the default O0 pipeline, LibFunc attrs are not inferred,
1081 // so we insert it here because we need it for accurate memory
1082 // allocation function detection with -fsanitize=alloc-token.
1083 // Note: This could also be added to the default O0 pipeline, but
1084 // has a non-trivial effect on generated IR size (attributes).
1085 MPM.addPass(InferFunctionAttrsPass());
1086 }
1087 });
1088 }
1089
1090 if (std::optional<GCOVOptions> Options =
1091 getGCOVOptions(CodeGenOpts, LangOpts))
1092 PB.registerPipelineStartEPCallback(
1093 [this, Options](ModulePassManager &MPM, OptimizationLevel Level) {
1094 MPM.addPass(
1095 GCOVProfilerPass(*Options, CI.getVirtualFileSystemPtr()));
1096 });
1097 if (std::optional<InstrProfOptions> Options =
1098 getInstrProfOptions(CodeGenOpts, LangOpts))
1099 PB.registerPipelineStartEPCallback(
1100 [Options](ModulePassManager &MPM, OptimizationLevel Level) {
1101 MPM.addPass(InstrProfilingLoweringPass(*Options, false));
1102 });
1103
1104 // TODO: Consider passing the MemoryProfileOutput to the pass builder via
1105 // the PGOOptions, and set this up there.
1106 if (!CodeGenOpts.MemoryProfileOutput.empty()) {
1107 PB.registerOptimizerLastEPCallback([](ModulePassManager &MPM,
1108 OptimizationLevel Level,
1109 ThinOrFullLTOPhase) {
1110 MPM.addPass(createModuleToFunctionPassAdaptor(MemProfilerPass()));
1111 MPM.addPass(ModuleMemProfilerPass());
1112 });
1113 }
1114
1115 if (CodeGenOpts.FatLTO) {
1116 MPM.addPass(PB.buildFatLTODefaultPipeline(
1117 Level, PrepareForThinLTO,
1118 PrepareForThinLTO || shouldEmitRegularLTOSummary()));
1119 } else if (PrepareForThinLTO) {
1120 MPM.addPass(PB.buildThinLTOPreLinkDefaultPipeline(Level));
1121 } else if (PrepareForLTO) {
1122 MPM.addPass(PB.buildLTOPreLinkDefaultPipeline(Level));
1123 } else {
1124 MPM.addPass(PB.buildPerModuleDefaultPipeline(Level));
1125 }
1126 }
1127
1128 // Link against bitcodes supplied via the -mlink-builtin-bitcode option
1129 if (CodeGenOpts.LinkBitcodePostopt)
1130 MPM.addPass(LinkInModulesPass(BC));
1131
1132 if (LangOpts.HIPStdPar && !LangOpts.CUDAIsDevice &&
1133 LangOpts.HIPStdParInterposeAlloc)
1134 MPM.addPass(HipStdParAllocationInterpositionPass());
1135
1136 // Add a verifier pass if requested. We don't have to do this if the action
1137 // requires code generation because there will already be a verifier pass in
1138 // the code-generation pipeline.
1139 // Since we already added a verifier pass above, this
1140 // might even not run the analysis, if previous passes caused no changes.
1141 if (!actionRequiresCodeGen(Action) && CodeGenOpts.VerifyModule)
1142 MPM.addPass(VerifierPass());
1143
1144 if (Action == Backend_EmitBC || Action == Backend_EmitLL ||
1145 CodeGenOpts.FatLTO) {
1146 if (CodeGenOpts.PrepareForThinLTO && !CodeGenOpts.DisableLLVMPasses) {
1147 if (!TheModule->getModuleFlag("EnableSplitLTOUnit"))
1148 TheModule->addModuleFlag(llvm::Module::Error, "EnableSplitLTOUnit",
1149 CodeGenOpts.EnableSplitLTOUnit);
1150 if (Action == Backend_EmitBC) {
1151 if (!CodeGenOpts.ThinLinkBitcodeFile.empty()) {
1152 ThinLinkOS = openOutputFile(CodeGenOpts.ThinLinkBitcodeFile);
1153 if (!ThinLinkOS)
1154 return;
1155 }
1156 MPM.addPass(ThinLTOBitcodeWriterPass(
1157 *OS, ThinLinkOS ? &ThinLinkOS->os() : nullptr));
1158 } else if (Action == Backend_EmitLL) {
1159 MPM.addPass(PrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists,
1160 /*EmitLTOSummary=*/true));
1161 }
1162 } else {
1163 // Emit a module summary by default for Regular LTO except for ld64
1164 // targets
1165 bool EmitLTOSummary = shouldEmitRegularLTOSummary();
1166 if (EmitLTOSummary) {
1167 if (!TheModule->getModuleFlag("ThinLTO") && !CodeGenOpts.UnifiedLTO)
1168 TheModule->addModuleFlag(llvm::Module::Error, "ThinLTO", uint32_t(0));
1169 if (!TheModule->getModuleFlag("EnableSplitLTOUnit"))
1170 TheModule->addModuleFlag(llvm::Module::Error, "EnableSplitLTOUnit",
1171 uint32_t(1));
1172 }
1173 if (Action == Backend_EmitBC) {
1174 MPM.addPass(BitcodeWriterPass(*OS, CodeGenOpts.EmitLLVMUseLists,
1175 EmitLTOSummary));
1176 } else if (Action == Backend_EmitLL) {
1177 MPM.addPass(PrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists,
1178 EmitLTOSummary));
1179 }
1180 }
1181
1182 if (shouldEmitUnifiedLTOModueFlag() &&
1183 !TheModule->getModuleFlag("UnifiedLTO"))
1184 TheModule->addModuleFlag(llvm::Module::Error, "UnifiedLTO", uint32_t(1));
1185 }
1186
1187 // FIXME: This should eventually be replaced by a first-class driver option.
1188 // This should be done for both clang and flang simultaneously.
1189 // Print a textual, '-passes=' compatible, representation of pipeline if
1190 // requested.
1191 if (PrintPipelinePasses) {
1192 MPM.printPipeline(outs(), [&PIC](StringRef ClassName) {
1193 auto PassName = PIC.getPassNameForClassName(ClassName);
1194 return PassName.empty() ? ClassName : PassName;
1195 });
1196 outs() << "\n";
1197 return;
1198 }
1199
1200 // Now that we have all of the passes ready, run them.
1201 {
1202 PrettyStackTraceString CrashInfo("Optimizer");
1203 llvm::TimeTraceScope TimeScope("Optimizer");
1204 Timer timer;
1205 if (CI.getCodeGenOpts().TimePasses) {
1206 timer.init("optimizer", "Optimizer", CI.getTimerGroup());
1207 CI.getFrontendTimer().yieldTo(timer);
1208 }
1209 MPM.run(*TheModule, MAM);
1210 if (CI.getCodeGenOpts().TimePasses)
1211 timer.yieldTo(CI.getFrontendTimer());
1212 }
1213}
1214
1215void EmitAssemblyHelper::RunCodegenPipeline(
1216 BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
1217 std::unique_ptr<llvm::ToolOutputFile> &DwoOS) {
1218 if (!actionRequiresCodeGen(Action))
1219 return;
1220
1221 // Normal mode, emit a .s or .o file by running the code generator. Note,
1222 // this also adds codegenerator level optimization passes.
1223 CodeGenFileType CGFT = getCodeGenFileType(Action);
1224
1225 // Invoke pre-codegen callback from plugin, which might want to take over the
1226 // entire code generation itself.
1227 for (const std::unique_ptr<llvm::PassPlugin> &Plugin : CI.getPassPlugins()) {
1228 if (Plugin->invokePreCodeGenCallback(*TheModule, *TM, CGFT, *OS))
1229 return;
1230 }
1231
1232 // We still use the legacy PM to run the codegen pipeline since the new PM
1233 // does not work with the codegen pipeline.
1234 // FIXME: make the new PM work with the codegen pipeline.
1235 legacy::PassManager CodeGenPasses;
1236
1237 CodeGenPasses.add(
1238 createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
1239 // Add LibraryInfo.
1240 std::unique_ptr<TargetLibraryInfoImpl> TLII(
1241 llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
1242 CodeGenPasses.add(new TargetLibraryInfoWrapperPass(*TLII));
1243
1244 const llvm::TargetOptions &Options = TM->Options;
1245 CodeGenPasses.add(new RuntimeLibraryInfoWrapper(
1246 TargetTriple, Options.ExceptionModel, Options.FloatABIType,
1247 Options.EABIVersion, Options.MCOptions.ABIName, Options.VecLib));
1248
1249 if (!CodeGenOpts.SplitDwarfOutput.empty()) {
1250 DwoOS = openOutputFile(CodeGenOpts.SplitDwarfOutput);
1251 if (!DwoOS)
1252 return;
1253 }
1254
1255 if (TM->addPassesToEmitFile(CodeGenPasses, *OS,
1256 DwoOS ? &DwoOS->os() : nullptr, CGFT,
1257 /*DisableVerify=*/!CodeGenOpts.VerifyModule)) {
1258 Diags.Report(diag::err_fe_unable_to_interface_with_target);
1259 return;
1260 }
1261
1262 // If -print-pipeline-passes is requested, don't run the legacy pass manager.
1263 // FIXME: when codegen is switched to use the new pass manager, it should also
1264 // emit pass names here.
1265 if (PrintPipelinePasses) {
1266 return;
1267 }
1268
1269 {
1270 PrettyStackTraceString CrashInfo("Code generation");
1271 llvm::TimeTraceScope TimeScope("CodeGenPasses");
1272 Timer timer;
1273 if (CI.getCodeGenOpts().TimePasses) {
1274 timer.init("codegen", "Machine code generation", CI.getTimerGroup());
1275 CI.getFrontendTimer().yieldTo(timer);
1276 }
1277 CodeGenPasses.run(*TheModule);
1278 if (CI.getCodeGenOpts().TimePasses)
1279 timer.yieldTo(CI.getFrontendTimer());
1280 }
1281}
1282
1283void EmitAssemblyHelper::emitAssembly(BackendAction Action,
1284 std::unique_ptr<raw_pwrite_stream> OS,
1285 BackendConsumer *BC) {
1286 setCommandLineOpts(CodeGenOpts, CI.getVirtualFileSystem());
1287
1288 bool RequiresCodeGen = actionRequiresCodeGen(Action);
1289 CreateTargetMachine(RequiresCodeGen);
1290
1291 if (RequiresCodeGen && !TM)
1292 return;
1293 if (TM)
1294 TheModule->setDataLayout(TM->createDataLayout());
1295
1296 // Before executing passes, print the final values of the LLVM options.
1297 cl::PrintOptionValues();
1298
1299 std::unique_ptr<llvm::ToolOutputFile> ThinLinkOS, DwoOS;
1300 RunOptimizationPipeline(Action, OS, ThinLinkOS, BC);
1301 RunCodegenPipeline(Action, OS, DwoOS);
1302
1303 if (ThinLinkOS)
1304 ThinLinkOS->keep();
1305 if (DwoOS)
1306 DwoOS->keep();
1307}
1308
1309static void
1310runThinLTOBackend(CompilerInstance &CI, ModuleSummaryIndex *CombinedIndex,
1311 llvm::Module *M, std::unique_ptr<raw_pwrite_stream> OS,
1312 std::string SampleProfile, std::string ProfileRemapping,
1313 BackendAction Action) {
1314 DiagnosticsEngine &Diags = CI.getDiagnostics();
1315 const auto &CGOpts = CI.getCodeGenOpts();
1316 const auto &TOpts = CI.getTargetOpts();
1317 DenseMap<StringRef, DenseMap<GlobalValue::GUID, GlobalValueSummary *>>
1318 ModuleToDefinedGVSummaries;
1319 CombinedIndex->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
1320
1322
1323 // We can simply import the values mentioned in the combined index, since
1324 // we should only invoke this using the individual indexes written out
1325 // via a WriteIndexesThinBackend.
1326 FunctionImporter::ImportIDTable ImportIDs;
1327 FunctionImporter::ImportMapTy ImportList(ImportIDs);
1328 if (!lto::initImportList(*M, *CombinedIndex, ImportList))
1329 return;
1330
1331 auto AddStream = [&](size_t Task, const Twine &ModuleName) {
1332 return std::make_unique<CachedFileStream>(std::move(OS),
1333 CGOpts.ObjectFilenameForDebug);
1334 };
1335 lto::Config Conf;
1336 if (CGOpts.SaveTempsFilePrefix != "") {
1337 if (Error E = Conf.addSaveTemps(CGOpts.SaveTempsFilePrefix + ".",
1338 /* UseInputModulePath */ false)) {
1339 handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) {
1340 errs() << "Error setting up ThinLTO save-temps: " << EIB.message()
1341 << '\n';
1342 });
1343 }
1344 }
1345 Conf.CPU = TOpts.CPU;
1346 Conf.CodeModel = getCodeModel(CGOpts);
1347 Conf.MAttrs = TOpts.Features;
1348 Conf.RelocModel = CGOpts.RelocationModel;
1349 std::optional<CodeGenOptLevel> OptLevelOrNone =
1350 CodeGenOpt::getLevel(CGOpts.OptimizationLevel);
1351 assert(OptLevelOrNone && "Invalid optimization level!");
1352 Conf.CGOptLevel = *OptLevelOrNone;
1353 Conf.OptLevel = CGOpts.OptimizationLevel;
1354 initTargetOptions(CI, Diags, Conf.Options);
1355 Conf.SampleProfile = std::move(SampleProfile);
1356 Conf.PTO.LoopUnrolling = CGOpts.UnrollLoops;
1357 Conf.PTO.LoopInterchange = CGOpts.InterchangeLoops;
1358 Conf.PTO.LoopFusion = CGOpts.FuseLoops;
1359 // For historical reasons, loop interleaving is set to mirror setting for loop
1360 // unrolling.
1361 Conf.PTO.LoopInterleaving = CGOpts.UnrollLoops;
1362 Conf.PTO.LoopVectorization = CGOpts.VectorizeLoop;
1363 Conf.PTO.SLPVectorization = CGOpts.VectorizeSLP;
1364 // Only enable CGProfilePass when using integrated assembler, since
1365 // non-integrated assemblers don't recognize .cgprofile section.
1366 Conf.PTO.CallGraphProfile = !CGOpts.DisableIntegratedAS;
1367
1368 // Context sensitive profile.
1369 if (CGOpts.hasProfileCSIRInstr()) {
1370 Conf.RunCSIRInstr = true;
1371 Conf.CSIRProfile = getProfileGenName(CGOpts);
1372 } else if (CGOpts.hasProfileCSIRUse()) {
1373 Conf.RunCSIRInstr = false;
1374 Conf.CSIRProfile = std::move(CGOpts.ProfileInstrumentUsePath);
1375 }
1376
1377 Conf.ProfileRemapping = std::move(ProfileRemapping);
1378 Conf.DebugPassManager = CGOpts.DebugPassManager;
1379 Conf.VerifyEach = CGOpts.VerifyEach;
1380 Conf.RemarksWithHotness = CGOpts.DiagnosticsWithHotness;
1381 Conf.RemarksFilename = CGOpts.OptRecordFile;
1382 Conf.RemarksPasses = CGOpts.OptRecordPasses;
1383 Conf.RemarksFormat = CGOpts.OptRecordFormat;
1384 Conf.SplitDwarfFile = CGOpts.SplitDwarfFile;
1385 Conf.SplitDwarfOutput = CGOpts.SplitDwarfOutput;
1386 switch (Action) {
1388 Conf.PreCodeGenModuleHook = [](size_t Task, const llvm::Module &Mod) {
1389 return false;
1390 };
1391 break;
1392 case Backend_EmitLL:
1393 Conf.PreCodeGenModuleHook = [&](size_t Task, const llvm::Module &Mod) {
1394 M->print(*OS, nullptr, CGOpts.EmitLLVMUseLists);
1395 return false;
1396 };
1397 break;
1398 case Backend_EmitBC:
1399 Conf.PreCodeGenModuleHook = [&](size_t Task, const llvm::Module &Mod) {
1400 WriteBitcodeToFile(*M, *OS, CGOpts.EmitLLVMUseLists);
1401 return false;
1402 };
1403 break;
1404 default:
1405 Conf.CGFileType = getCodeGenFileType(Action);
1406 break;
1407 }
1408
1409 // FIXME: Both ExecuteAction and thinBackend set up optimization remarks for
1410 // the same context.
1411 finalizeLLVMOptimizationRemarks(M->getContext());
1412 if (Error E =
1413 thinBackend(Conf, -1, AddStream, *M, *CombinedIndex, ImportList,
1414 ModuleToDefinedGVSummaries[M->getModuleIdentifier()],
1415 /*ModuleMap=*/nullptr, Conf.CodeGenOnly,
1416 /*IRAddStream=*/nullptr, CGOpts.CmdArgs)) {
1417 handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) {
1418 errs() << "Error running ThinLTO backend: " << EIB.message() << '\n';
1419 });
1420 }
1421}
1422
1424 StringRef TDesc, llvm::Module *M,
1425 BackendAction Action,
1427 std::unique_ptr<raw_pwrite_stream> OS,
1428 BackendConsumer *BC) {
1429 llvm::TimeTraceScope TimeScope("Backend");
1430 DiagnosticsEngine &Diags = CI.getDiagnostics();
1431
1432 std::unique_ptr<llvm::Module> EmptyModule;
1433 if (!CGOpts.ThinLTOIndexFile.empty()) {
1434 // FIXME(sandboxing): Figure out how to support distributed indexing.
1435 auto BypassSandbox = sys::sandbox::scopedDisable();
1436 // If we are performing a ThinLTO importing compile, load the function index
1437 // into memory and pass it into runThinLTOBackend, which will run the
1438 // function importer and invoke LTO passes.
1439 std::unique_ptr<ModuleSummaryIndex> CombinedIndex;
1440 if (Error E = llvm::getModuleSummaryIndexForFile(
1441 CGOpts.ThinLTOIndexFile,
1442 /*IgnoreEmptyThinLTOIndexFile*/ true)
1443 .moveInto(CombinedIndex)) {
1444 logAllUnhandledErrors(std::move(E), errs(),
1445 "Error loading index file '" +
1446 CGOpts.ThinLTOIndexFile + "': ");
1447 return;
1448 }
1449
1450 // A null CombinedIndex means we should skip ThinLTO compilation
1451 // (LLVM will optionally ignore empty index files, returning null instead
1452 // of an error).
1453 if (CombinedIndex) {
1454 if (!CombinedIndex->skipModuleByDistributedBackend()) {
1455 runThinLTOBackend(CI, CombinedIndex.get(), M, std::move(OS),
1457 Action);
1458 return;
1459 }
1460 // Distributed indexing detected that nothing from the module is needed
1461 // for the final linking. So we can skip the compilation. We sill need to
1462 // output an empty object file to make sure that a linker does not fail
1463 // trying to read it. Also for some features, like CFI, we must skip
1464 // the compilation as CombinedIndex does not contain all required
1465 // information.
1466 EmptyModule = std::make_unique<llvm::Module>("empty", M->getContext());
1467 EmptyModule->setTargetTriple(M->getTargetTriple());
1468 M = EmptyModule.get();
1469 }
1470 }
1471
1472 EmitAssemblyHelper AsmHelper(CI, CGOpts, M, VFS);
1473 AsmHelper.emitAssembly(Action, std::move(OS), BC);
1474
1475 // Verify clang's TargetInfo DataLayout against the LLVM TargetMachine's
1476 // DataLayout.
1477 if (AsmHelper.TM) {
1478 std::string DLDesc = M->getDataLayout().getStringRepresentation();
1479 if (DLDesc != TDesc) {
1480 Diags.Report(diag::err_data_layout_mismatch) << DLDesc << TDesc;
1481 }
1482 }
1483}
1484
1485// With -fembed-bitcode, save a copy of the llvm IR as data in the
1486// __LLVM,__bitcode section.
1487void clang::EmbedBitcode(llvm::Module *M, const CodeGenOptions &CGOpts,
1488 llvm::MemoryBufferRef Buf) {
1489 if (CGOpts.getEmbedBitcode() == CodeGenOptions::Embed_Off)
1490 return;
1491 llvm::embedBitcodeInModule(
1492 *M, Buf, CGOpts.getEmbedBitcode() != CodeGenOptions::Embed_Marker,
1493 CGOpts.getEmbedBitcode() != CodeGenOptions::Embed_Bitcode,
1494 CGOpts.CmdArgs);
1495}
1496
1497void clang::EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts,
1498 llvm::vfs::FileSystem &VFS, DiagnosticsEngine &Diags) {
1499 if (CGOpts.OffloadObjects.empty())
1500 return;
1501
1502 for (StringRef OffloadObject : CGOpts.OffloadObjects) {
1503 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ObjectOrErr =
1504 VFS.getBufferForFile(OffloadObject);
1505 if (ObjectOrErr.getError()) {
1506 Diags.Report(diag::err_failed_to_open_for_embedding) << OffloadObject;
1507 return;
1508 }
1509
1510 llvm::embedBufferInModule(*M, **ObjectOrErr, ".llvm.offloading",
1511 Align(object::OffloadBinary::getAlignment()));
1512 }
1513}
static bool actionRequiresCodeGen(BackendAction Action)
static void addSanitizers(const Triple &TargetTriple, const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, PassBuilder &PB)
static std::optional< llvm::CodeModel::Model > getCodeModel(const CodeGenOptions &CodeGenOpts)
static void runThinLTOBackend(CompilerInstance &CI, ModuleSummaryIndex *CombinedIndex, llvm::Module *M, std::unique_ptr< raw_pwrite_stream > OS, std::string SampleProfile, std::string ProfileRemapping, BackendAction Action)
static SanitizerBinaryMetadataOptions getSanitizerBinaryMetadataOptions(const CodeGenOptions &CGOpts)
static std::optional< GCOVOptions > getGCOVOptions(const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts)
static bool initTargetOptions(const CompilerInstance &CI, DiagnosticsEngine &Diags, llvm::TargetOptions &Options)
static void setCommandLineOpts(const CodeGenOptions &CodeGenOpts, vfs::FileSystem &VFS)
static std::string getProfileGenName(const CodeGenOptions &CodeGenOpts)
static void addKCFIPass(const Triple &TargetTriple, const LangOptions &LangOpts, PassBuilder &PB)
static SanitizerCoverageOptions getSancovOptsFromCGOpts(const CodeGenOptions &CGOpts)
static OptimizationLevel mapToLevel(const CodeGenOptions &Opts)
static std::optional< InstrProfOptions > getInstrProfOptions(const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts)
static bool asanUseGlobalsGC(const Triple &T, const CodeGenOptions &CGOpts)
void addLowerAllowCheckPass(const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, PassBuilder &PB)
static CodeGenFileType getCodeGenFileType(BackendAction Action)
static std::string flattenClangCommandLine(ArrayRef< std::string > Args, StringRef MainFilename)
Defines the Diagnostic-related interfaces.
Defines the clang::LangOptions interface.
This file provides a pass to link in Modules from a provided BackendConsumer.
static bool contains(const std::set< tok::TokenKind > &Terminators, const Token &Tok)
Defines the clang::TargetOptions class.
__DEVICE__ int max(int __a, int __b)
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
SanitizerSet SanitizeMergeHandlers
Set of sanitizer checks that can merge handlers (smaller code size at the expense of debuggability).
std::string InstrProfileOutput
Name of the profile file to use as output for -fprofile-instr-generate, -fprofile-generate,...
bool hasDWARFExceptions() const
bool hasProfileIRUse() const
Check if IR level profile use is on.
char CoverageVersion[4]
The version string to put into coverage files.
std::string FloatABI
The ABI to use for passing floating point arguments.
std::string ThinLinkBitcodeFile
Name of a file that can optionally be written with minimized bitcode to be used as input for the Thin...
bool hasProfileCSIRInstr() const
Check if CS IR level profile instrumentation is on.
std::string DebugPass
Enable additional debugging information.
llvm::Reloc::Model RelocationModel
The name of the relocation model to use.
std::string CoverageNotesFile
The filename with path we use for coverage notes files.
std::string ProfileInstrumentUsePath
Name of the profile file to use as input for -fprofile-instr-use.
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
uint64_t LargeDataThreshold
The code model-specific large data threshold to use (-mlarge-data-threshold).
std::string MemoryProfileOutput
Name of the profile file to use as output for with -fmemory-profile.
std::vector< std::function< void(llvm::PassBuilder &)> > PassBuilderCallbacks
List of pass builder callbacks.
std::string LimitFloatPrecision
The float precision limit to use, if non-empty.
std::string CodeModel
The code model to use (-mcmodel).
std::string CoverageDataFile
The filename with path we use for coverage data files.
bool hasProfileClangInstr() const
Check if Clang profile instrumenation is on.
std::string StackUsageOutput
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
std::vector< std::string > SanitizeCoverageAllowlistFiles
Path to allowlist file specifying which objects (files, functions) should exclusively be instrumented...
std::vector< std::string > SanitizeCoverageIgnorelistFiles
Path to ignorelist file specifying which objects (files, functions) listed for instrumentation by san...
bool hasSanitizeCoverage() const
std::string MainFileName
The user provided name for the "main file", if non-empty.
bool hasProfileIRInstr() const
Check if IR level profile instrumentation is on.
bool hasProfileCSIRUse() const
Check if CSIR profile use is on.
SanitizerSet SanitizeTrap
Set of sanitizer checks that trap rather than diagnose.
std::vector< std::string > SanitizeMetadataIgnorelistFiles
Path to ignorelist file specifying which objects (files, functions) listed for instrumentation by san...
SanitizerSet SanitizeRecover
Set of sanitizer checks that are non-fatal (i.e.
std::string ProfileExcludeFiles
Regexes separated by a semi-colon to filter the files to not instrument.
std::string AsSecureLogFile
The name of a file to use with .secure_log_unique directives.
std::string ProfileRemappingFile
Name of the profile remapping file to apply to the profile data supplied by -fprofile-sample-use or -...
bool hasSanitizeBinaryMetadata() const
std::string ThinLTOIndexFile
Name of the function summary index file to use for ThinLTO function importing.
const char * Argv0
Executable and command-line used to create a given CompilerInvocation.
bool hasWasmExceptions() const
bool hasSjLjExceptions() const
SanitizerMaskCutoffs SanitizeSkipHotCutoffs
Set of thresholds in a range [0.0, 1.0]: the top hottest code responsible for the given fraction of P...
std::string SplitDwarfFile
The name for the split debug info file used for the DW_AT_[GNU_]dwo_name attribute in the skeleton CU...
std::vector< uint8_t > CmdArgs
List of backend command-line options for -fembed-bitcode.
std::optional< double > AllowRuntimeCheckSkipHotCutoff
std::vector< std::string > CommandLineArgs
bool hasSEHExceptions() const
std::string MemoryProfileUsePath
Name of the profile file to use as input for -fmemory-profile-use.
std::vector< std::string > OffloadObjects
List of filenames passed in using the -fembed-offload-object option.
std::string ProfileFilterFiles
Regexes separated by a semi-colon to filter the files to instrument.
std::string ObjectFilenameForDebug
Output filename used in the COFF debug information.
std::string SplitDwarfOutput
Output filename for the split debug info, not used in the skeleton CU.
std::string DIBugsReportFilePath
The file to use for dumping bug report by Debugify for original debug info.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
DiagnosticsEngine & getDiagnostics() const
Get the current diagnostics engine.
llvm::TimerGroup & getTimerGroup() const
llvm::Timer & getFrontendTimer() const
IntrusiveRefCntPtr< llvm::vfs::FileSystem > getVirtualFileSystemPtr() const
TargetOptions & getTargetOpts()
HeaderSearchOptions & getHeaderSearchOpts()
llvm::vfs::FileSystem & getVirtualFileSystem() const
llvm::ArrayRef< std::unique_ptr< llvm::PassPlugin > > getPassPlugins() const
CodeGenOptions & getCodeGenOpts()
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:232
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
@ Single
Single Threaded Environment.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
SanitizerSet Sanitize
Set of enabled sanitizers.
std::vector< std::string > NoSanitizeFiles
Paths to files specifying which objects (files, functions, variables) should not be instrumented.
std::optional< std::vector< unsigned > > getAllScaled(unsigned ScalingFactor) const
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string ABI
If given, the name of the target ABI to use.
std::string CPU
If given, the name of the target CPU to generate code for.
llvm::EABI EABIVersion
The EABI version to use.
@ Angled
Paths for '#include <>' added by '-I'.
@ System
Like Angled, but marks system directories.
@ Quoted
'#include ""' paths, added by 'gcc -iquote'.
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
llvm::cl::opt< bool > ClSanitizeGuardChecks
void emitBackendOutput(CompilerInstance &CI, CodeGenOptions &CGOpts, StringRef TDesc, llvm::Module *M, BackendAction Action, llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS, std::unique_ptr< raw_pwrite_stream > OS, BackendConsumer *BC=nullptr)
void EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, llvm::vfs::FileSystem &VFS, DiagnosticsEngine &Diags)
void EmbedBitcode(llvm::Module *M, const CodeGenOptions &CGOpts, llvm::MemoryBufferRef Buf)
BackendAction
Definition BackendUtil.h:33
@ Backend_EmitAssembly
Emit native assembly files.
Definition BackendUtil.h:34
@ Backend_EmitLL
Emit human-readable LLVM assembly.
Definition BackendUtil.h:36
@ Backend_EmitBC
Emit LLVM bitcode files.
Definition BackendUtil.h:35
@ Backend_EmitObj
Emit native object files.
Definition BackendUtil.h:39
@ Backend_EmitMCNull
Run CodeGen, but don't emit anything.
Definition BackendUtil.h:38
@ Backend_EmitNothing
Don't emit anything (benchmarking mode)
Definition BackendUtil.h:37
unsigned int uint32_t
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
LLVM_ABI cl::opt< InstrProfCorrelator::ProfCorrelatorKind > ProfileCorrelate
static cl::opt< PGOOptions::ColdFuncOpt > ClPGOColdFuncAttr("pgo-cold-func-opt", cl::init(PGOOptions::ColdFuncOpt::Default), cl::Hidden, cl::desc("Function attribute to apply to cold functions as determined by PGO"), cl::values(clEnumValN(PGOOptions::ColdFuncOpt::Default, "default", "Default (no attribute)"), clEnumValN(PGOOptions::ColdFuncOpt::OptSize, "optsize", "Mark cold functions with optsize."), clEnumValN(PGOOptions::ColdFuncOpt::MinSize, "minsize", "Mark cold functions with minsize."), clEnumValN(PGOOptions::ColdFuncOpt::OptNone, "optnone", "Mark cold functions with optnone.")))
static cl::opt< bool > ClSanitizeOnOptimizerEarlyEP("sanitizer-early-opt-ep", cl::Optional, cl::desc("Insert sanitizers on OptimizerEarlyEP."))
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
Definition Sanitizers.h:174
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.
Definition Sanitizers.h:184