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"
100#define HANDLE_EXTENSION(Ext) \
101 llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
102#include "llvm/Support/Extension.def"
107 "sanitizer-early-opt-ep", cl::Optional,
108 cl::desc(
"Insert sanitizers on OptimizerEarlyEP."));
113 "pgo-cold-func-opt", cl::init(PGOOptions::ColdFuncOpt::Default), cl::Hidden,
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.")));
125LLVM_ABI
extern cl::opt<InstrProfCorrelator::ProfCorrelatorKind>
135 ? llvm::driver::getDefaultProfileGenName()
137 if (CodeGenOpts.ContinuousProfileSync)
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;
153 std::unique_ptr<raw_pwrite_stream> OS;
157 TargetIRAnalysis getTargetIRAnalysis()
const {
159 return TM->getTargetIRAnalysis();
161 return TargetIRAnalysis();
172 void CreateTargetMachine(
bool MustCreateTM);
174 std::unique_ptr<llvm::ToolOutputFile> openOutputFile(StringRef Path) {
176 auto F = std::make_unique<llvm::ToolOutputFile>(Path, EC,
177 llvm::sys::fs::OF_None);
179 Diags.Report(diag::err_fe_unable_to_open_output) << Path << EC.message();
185 void RunOptimizationPipeline(
186 BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
187 std::unique_ptr<llvm::ToolOutputFile> &ThinLinkOS, BackendConsumer *BC);
189 std::unique_ptr<raw_pwrite_stream> &OS,
190 std::unique_ptr<llvm::ToolOutputFile> &DwoOS);
197 bool shouldEmitRegularLTOSummary()
const {
198 return CodeGenOpts.PrepareForLTO && !CodeGenOpts.DisableLLVMPasses &&
199 TargetTriple.getVendor() != llvm::Triple::Apple;
205 bool shouldEmitUnifiedLTOModueFlag()
const {
206 return CodeGenOpts.UnifiedLTO &&
207 (CodeGenOpts.PrepareForThinLTO || shouldEmitRegularLTOSummary());
211 EmitAssemblyHelper(CompilerInstance &CI, CodeGenOptions &CGOpts,
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()) {}
219 ~EmitAssemblyHelper() {
220 if (CodeGenOpts.DisableFree)
221 BuryPointer(std::move(TM));
224 std::unique_ptr<TargetMachine> TM;
227 void emitAssembly(
BackendAction Action, std::unique_ptr<raw_pwrite_stream> OS,
228 BackendConsumer *BC);
232static SanitizerCoverageOptions
234 SanitizerCoverageOptions Opts;
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;
257static SanitizerBinaryMetadataOptions
259 SanitizerBinaryMetadataOptions Opts;
260 Opts.Covered = CGOpts.SanitizeBinaryMetadataCovered;
261 Opts.Atomics = CGOpts.SanitizeBinaryMetadataAtomics;
262 Opts.UAR = CGOpts.SanitizeBinaryMetadataUAR;
271 if (!CGOpts.SanitizeAddressGlobalsDeadStripping)
273 switch (
T.getObjectFormat()) {
278 return !CGOpts.DisableIntegratedAS;
280 llvm::report_fatal_error(
"ASan not implemented for GOFF");
282 llvm::report_fatal_error(
"ASan not implemented for XCOFF.");
284 case Triple::DXContainer:
286 case Triple::UnknownObjectFormat:
292static std::optional<llvm::CodeModel::Model>
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)
302 assert(CodeModel != ~0u &&
"invalid code model!");
303 if (CodeModel == ~1u)
305 return static_cast<llvm::CodeModel::Model
>(CodeModel);
310 return CodeGenFileType::ObjectFile;
312 return CodeGenFileType::Null;
315 return CodeGenFileType::AssemblyFile;
325 StringRef MainFilename) {
327 return std::string{};
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",
true);
334 PrintedOneArg =
true;
336 for (
unsigned i = 0; i < Args.size(); i++) {
337 StringRef Arg = Args[i];
340 if (Arg ==
"-main-file-name" || Arg ==
"-o") {
344 if (Arg.starts_with(
"-object-file-name") || Arg == MainFilename)
347 if (Arg.starts_with(
"-fmessage-length"))
351 llvm::sys::printArg(OS, Arg,
true);
352 PrintedOneArg =
true;
359 llvm::TargetOptions &Options) {
364 switch (LangOpts.getThreadModel()) {
366 Options.ThreadModel = llvm::ThreadModel::POSIX;
369 Options.ThreadModel = llvm::ThreadModel::Single;
374 assert((CodeGenOpts.
FloatABI ==
"soft" || CodeGenOpts.
FloatABI ==
"softfp" ||
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);
385 switch (LangOpts.getDefaultFPContractMode()) {
389 Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
393 Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
396 Options.AllowFPOpFusion = llvm::FPOpFusion::Fast;
400 Options.BinutilsVersion =
401 llvm::TargetMachine::parseBinutilsVersion(CodeGenOpts.
BinutilsVersion);
402 Options.UseInitArray = CodeGenOpts.UseInitArray;
403 Options.DisableIntegratedAS = CodeGenOpts.DisableIntegratedAS;
409 Options.ExceptionModel = llvm::ExceptionHandling::SjLj;
411 Options.ExceptionModel = llvm::ExceptionHandling::WinEH;
413 Options.ExceptionModel = llvm::ExceptionHandling::DwarfCFI;
415 Options.ExceptionModel = llvm::ExceptionHandling::Wasm;
417 Options.NoInfsFPMath = LangOpts.NoHonorInfs;
418 Options.NoNaNsFPMath = LangOpts.NoHonorNaNs;
419 Options.NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
421 Options.BBAddrMap = CodeGenOpts.BBAddrMap;
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);
429 if (Options.BBSections == llvm::BasicBlockSection::List) {
430 ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
434 Diags.
Report(diag::err_fe_unable_to_load_basic_block_sections_file)
435 << MBOrErr.getError().message();
438 Options.BBSectionsFuncListBuf = std::move(*MBOrErr);
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;
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;
470 convertDriverVectorLibraryToVectorLibrary(CodeGenOpts.getVecLib());
472 switch (CodeGenOpts.getSwiftAsyncFramePointer()) {
474 Options.SwiftAsyncFramePointer =
475 SwiftAsyncFramePointerMode::DeploymentBased;
479 Options.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Always;
483 Options.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Never;
488 Options.MCOptions.EmitDwarfUnwind = CodeGenOpts.getEmitDwarfUnwind();
489 Options.MCOptions.EmitCompactUnwindNonCanonical =
490 CodeGenOpts.EmitCompactUnwindNonCanonical;
491 Options.MCOptions.MCRelaxAll = CodeGenOpts.RelaxAll;
492 Options.MCOptions.MCSaveTempLabels = CodeGenOpts.SaveTempLabels;
493 Options.MCOptions.MCUseDwarfDirectory =
494 CodeGenOpts.NoDwarfDirectoryAsm
495 ? llvm::MCTargetOptions::DisableDwarfDirectory
496 : llvm::MCTargetOptions::EnableDwarfDirectory;
497 Options.MCOptions.MCNoExecStack = CodeGenOpts.NoExecStack;
498 Options.MCOptions.MCIncrementalLinkerCompatible =
499 CodeGenOpts.IncrementalLinkerCompatible;
500 Options.MCOptions.MCFatalWarnings = CodeGenOpts.FatalWarnings;
501 Options.MCOptions.MCNoWarn = CodeGenOpts.NoWarn;
502 Options.MCOptions.AsmVerbose = CodeGenOpts.AsmVerbose;
503 Options.MCOptions.Dwarf64 = CodeGenOpts.Dwarf64;
504 Options.MCOptions.PreserveAsmComments = CodeGenOpts.PreserveAsmComments;
505 Options.MCOptions.Crel = CodeGenOpts.Crel;
506 Options.MCOptions.ImplicitMapSyms = CodeGenOpts.ImplicitMapSyms;
507 Options.MCOptions.X86RelaxRelocations = CodeGenOpts.X86RelaxRelocations;
508 Options.MCOptions.CompressDebugSections =
509 CodeGenOpts.getCompressDebugSections();
510 if (CodeGenOpts.OutputAsmVariant != 3)
511 Options.MCOptions.OutputAsmVariant = CodeGenOpts.OutputAsmVariant;
512 Options.MCOptions.ABIName = TargetOpts.
ABI;
513 for (
const auto &Entry : HSOpts.UserEntries)
514 if (!Entry.IsFramework &&
518 Options.MCOptions.IASSearchPaths.push_back(
519 Entry.IgnoreSysRoot ? Entry.Path : HSOpts.Sysroot + Entry.Path);
520 Options.MCOptions.Argv0 = CodeGenOpts.
Argv0 ? CodeGenOpts.
Argv0 :
"";
524 Options.MCOptions.PPCUseFullRegisterNames =
525 CodeGenOpts.PPCUseFullRegisterNames;
526 Options.MisExpect = CodeGenOpts.MisExpect;
531static std::optional<GCOVOptions>
542 Options.NoRedZone = CodeGenOpts.DisableRedZone;
545 Options.Atomic = CodeGenOpts.AtomicProfileUpdate;
549static std::optional<InstrProfOptions>
554 InstrProfOptions Options;
555 Options.NoRedZone = CodeGenOpts.DisableRedZone;
559 Options.Atomic = CodeGenOpts.AtomicProfileUpdate;
564 vfs::FileSystem &VFS) {
566 BackendArgs.push_back(
"clang");
568 BackendArgs.push_back(
"-debug-pass");
569 BackendArgs.push_back(CodeGenOpts.
DebugPass.c_str());
572 BackendArgs.push_back(
"-limit-float-precision");
579 if (BackendArgs.size() == 1)
581 BackendArgs.push_back(
nullptr);
585 llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1, BackendArgs.data(),
590void EmitAssemblyHelper::CreateTargetMachine(
bool MustCreateTM) {
593 const llvm::Triple &Triple = TheModule->getTargetTriple();
594 const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple,
Error);
597 Diags.
Report(diag::err_fe_unable_to_create_target) <<
Error;
601 std::optional<llvm::CodeModel::Model> CM =
getCodeModel(CodeGenOpts);
602 std::string FeaturesStr =
605 std::optional<CodeGenOptLevel> OptLevelOrNone =
606 CodeGenOpt::getLevel(CodeGenOpts.OptimizationLevel);
607 assert(OptLevelOrNone &&
"Invalid optimization level!");
608 CodeGenOptLevel OptLevel = *OptLevelOrNone;
610 llvm::TargetOptions Options;
613 TM.reset(TheTarget->createTargetMachine(Triple, TargetOpts.
CPU, FeaturesStr,
614 Options, RM, CM, OptLevel));
620 switch (Opts.OptimizationLevel) {
622 llvm_unreachable(
"Invalid optimization level!");
625 return OptimizationLevel::O0;
628 return OptimizationLevel::O1;
631 switch (Opts.OptimizeSize) {
633 llvm_unreachable(
"Invalid optimization level for size!");
636 return OptimizationLevel::O2;
639 return OptimizationLevel::Os;
642 return OptimizationLevel::Oz;
646 return OptimizationLevel::O3;
653 if (TargetTriple.getArch() == llvm::Triple::x86_64 ||
654 TargetTriple.isAArch64(64) || TargetTriple.isRISCV() ||
655 TargetTriple.isARM() || TargetTriple.isThumb())
659 PB.registerOptimizerLastEPCallback(
660 [&](ModulePassManager &MPM, OptimizationLevel Level, ThinOrFullLTOPhase) {
661 if (Level == OptimizationLevel::O0 &&
663 MPM.addPass(createModuleToFunctionPassAdaptor(KCFIPass()));
668 PB.registerPeepholeEPCallback(
669 [&](FunctionPassManager &FPM, OptimizationLevel Level) {
670 if (Level != OptimizationLevel::O0 &&
672 FPM.addPass(KCFIPass());
679 auto SanitizersCallback = [&](ModulePassManager &MPM, OptimizationLevel Level,
680 ThinOrFullLTOPhase) {
684 SanitizerCoveragePass(SancovOpts, PB.getVirtualFileSystemPtr(),
690 MPM.addPass(SanitizerBinaryMetadataPass(
692 PB.getVirtualFileSystemPtr(),
696 auto MSanPass = [&](
SanitizerMask Mask,
bool CompileKernel) {
698 int TrackOrigins = CodeGenOpts.SanitizeMemoryTrackOrigins;
701 MemorySanitizerOptions
options(TrackOrigins, Recover, CompileKernel,
702 CodeGenOpts.SanitizeMemoryParamRetval);
703 MPM.addPass(MemorySanitizerPass(
options));
704 if (Level != OptimizationLevel::O0) {
709 MPM.addPass(RequireAnalysisPass<GlobalsAA, llvm::Module>());
710 FunctionPassManager FPM;
711 FPM.addPass(EarlyCSEPass(
true ));
712 FPM.addPass(InstCombinePass());
713 FPM.addPass(JumpThreadingPass());
714 FPM.addPass(GVNPass());
715 FPM.addPass(InstCombinePass());
716 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
720 MSanPass(SanitizerKind::Memory,
false);
721 MSanPass(SanitizerKind::KernelMemory,
true);
723 if (LangOpts.
Sanitize.
has(SanitizerKind::Thread)) {
724 MPM.addPass(ModuleThreadSanitizerPass());
725 MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass()));
729 MPM.addPass(TypeSanitizerPass());
731 if (LangOpts.
Sanitize.
has(SanitizerKind::NumericalStability))
732 MPM.addPass(NumericalStabilitySanitizerPass());
734 if (LangOpts.
Sanitize.
has(SanitizerKind::Realtime))
735 MPM.addPass(RealtimeSanitizerPass());
737 auto ASanPass = [&](
SanitizerMask Mask,
bool CompileKernel) {
740 bool UseOdrIndicator = CodeGenOpts.SanitizeAddressUseOdrIndicator;
741 llvm::AsanDtorKind DestructorKind =
742 CodeGenOpts.getSanitizeAddressDtor();
743 AddressSanitizerOptions Opts;
744 Opts.CompileKernel = CompileKernel;
746 Opts.UseAfterScope = CodeGenOpts.SanitizeAddressUseAfterScope;
747 Opts.UseAfterReturn = CodeGenOpts.getSanitizeAddressUseAfterReturn();
748 MPM.addPass(AddressSanitizerPass(Opts, UseGlobalGC, UseOdrIndicator,
752 ASanPass(SanitizerKind::Address,
false);
753 ASanPass(SanitizerKind::KernelAddress,
true);
755 auto HWASanPass = [&](
SanitizerMask Mask,
bool CompileKernel) {
758 MPM.addPass(HWAddressSanitizerPass(
759 {CompileKernel, Recover,
760 CodeGenOpts.OptimizationLevel == 0}));
763 HWASanPass(SanitizerKind::HWAddress,
false);
764 HWASanPass(SanitizerKind::KernelHWAddress,
true);
766 if (LangOpts.
Sanitize.
has(SanitizerKind::DataFlow)) {
768 PB.getVirtualFileSystemPtr()));
772 PB.registerOptimizerEarlyEPCallback(
773 [SanitizersCallback](ModulePassManager &MPM, OptimizationLevel Level,
774 ThinOrFullLTOPhase Phase) {
775 ModulePassManager NewMPM;
776 SanitizersCallback(NewMPM, Level, Phase);
777 if (!NewMPM.isEmpty()) {
779 NewMPM.addPass(RequireAnalysisPass<GlobalsAA, llvm::Module>());
780 MPM.addPass(std::move(NewMPM));
785 PB.registerOptimizerLastEPCallback(SanitizersCallback);
794 uint64_t AllowRuntimeCheckSkipHotCutoff =
799 SanitizerKind::Address | SanitizerKind::KernelAddress |
800 SanitizerKind::Thread | SanitizerKind::Memory |
801 SanitizerKind::KernelMemory | SanitizerKind::HWAddress |
802 SanitizerKind::KernelHWAddress);
805 if (LowerAllowCheckPass::IsRequested() || ScaledCutoffs.has_value() ||
807 LowerAllowSanitize) {
809 PB.registerOptimizerEarlyEPCallback(
810 [ScaledCutoffs, AllowRuntimeCheckSkipHotCutoff](
811 ModulePassManager &MPM, OptimizationLevel Level,
812 ThinOrFullLTOPhase Phase) {
813 LowerAllowCheckPass::Options Opts;
815 if (ScaledCutoffs.has_value())
816 Opts.cutoffs = ScaledCutoffs.value();
817 Opts.runtime_check = AllowRuntimeCheckSkipHotCutoff;
819 createModuleToFunctionPassAdaptor(LowerAllowCheckPass(Opts)));
824void EmitAssemblyHelper::RunOptimizationPipeline(
825 BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
826 std::unique_ptr<llvm::ToolOutputFile> &ThinLinkOS, BackendConsumer *BC) {
827 std::optional<PGOOptions> PGOOpt;
834 CodeGenOpts.DebugInfoForProfiling,
836 CodeGenOpts.AtomicProfileUpdate);
840 : PGOOptions::NoCSAction;
845 CodeGenOpts.DebugInfoForProfiling);
852 CodeGenOpts.DebugInfoForProfiling, CodeGenOpts.PseudoProbeForProfiling);
856 PGOOptions::NoAction, PGOOptions::NoCSAction,
858 else if (CodeGenOpts.PseudoProbeForProfiling)
860 PGOOpt = PGOOptions(
"",
"",
"",
"", PGOOptions::NoAction,
862 CodeGenOpts.DebugInfoForProfiling,
true);
863 else if (CodeGenOpts.DebugInfoForProfiling)
865 PGOOpt = PGOOptions(
"",
"",
"",
"", PGOOptions::NoAction,
871 "Cannot have both CSProfileUse pass and CSProfileGen pass at "
874 assert(PGOOpt->Action != PGOOptions::IRInstr &&
875 PGOOpt->Action != PGOOptions::SampleUse &&
876 "Cannot run CSProfileGen pass with ProfileGen or SampleUse "
879 PGOOpt->CSAction = PGOOptions::CSIRInstr;
882 "", PGOOptions::NoAction,
884 CodeGenOpts.DebugInfoForProfiling);
887 TM->setPGOOption(PGOOpt);
889 PipelineTuningOptions PTO;
890 PTO.LoopUnrolling = CodeGenOpts.UnrollLoops;
891 PTO.LoopInterchange = CodeGenOpts.InterchangeLoops;
892 PTO.LoopFusion = CodeGenOpts.FuseLoops;
895 PTO.LoopInterleaving = CodeGenOpts.UnrollLoops;
896 PTO.LoopVectorization = CodeGenOpts.VectorizeLoop;
897 PTO.SLPVectorization = CodeGenOpts.VectorizeSLP;
898 PTO.MergeFunctions = CodeGenOpts.MergeFunctions;
901 PTO.CallGraphProfile = !CodeGenOpts.DisableIntegratedAS;
902 PTO.UnifiedLTO = CodeGenOpts.UnifiedLTO;
903 PTO.DevirtualizeSpeculatively = CodeGenOpts.DevirtualizeSpeculatively;
905 LoopAnalysisManager LAM;
906 FunctionAnalysisManager FAM;
907 CGSCCAnalysisManager CGAM;
908 ModuleAnalysisManager MAM;
910 bool DebugPassStructure = CodeGenOpts.
DebugPass ==
"Structure";
911 PassInstrumentationCallbacks PIC;
912 PrintPassOptions PrintPassOpts;
913 PrintPassOpts.Indent = DebugPassStructure;
914 PrintPassOpts.SkipAnalyses = DebugPassStructure;
915 StandardInstrumentations SI(
916 TheModule->getContext(),
917 (CodeGenOpts.DebugPassManager || DebugPassStructure),
918 CodeGenOpts.VerifyEach, PrintPassOpts);
919 SI.registerCallbacks(PIC, &MAM);
923 switch (CodeGenOpts.getAssignmentTrackingMode()) {
924 case CodeGenOptions::AssignmentTrackingOpts::Forced:
925 PB.registerPipelineStartEPCallback(
926 [&](ModulePassManager &MPM, OptimizationLevel Level) {
927 MPM.addPass(AssignmentTrackingPass());
930 case CodeGenOptions::AssignmentTrackingOpts::Enabled:
933 if (!CodeGenOpts.PrepareForThinLTO && !CodeGenOpts.PrepareForLTO &&
934 CodeGenOpts.getDebuggerTuning() != llvm::DebuggerKind::LLDB) {
935 PB.registerPipelineStartEPCallback(
936 [&](ModulePassManager &MPM, OptimizationLevel Level) {
938 if (Level != OptimizationLevel::O0)
939 MPM.addPass(AssignmentTrackingPass());
943 case CodeGenOptions::AssignmentTrackingOpts::Disabled:
948 DebugifyEachInstrumentation Debugify;
949 DebugInfoPerPass DebugInfoBeforePass;
950 if (CodeGenOpts.EnableDIPreservationVerify) {
951 Debugify.setDebugifyMode(DebugifyMode::OriginalDebugInfo);
952 Debugify.setDebugInfoBeforePass(DebugInfoBeforePass);
955 Debugify.setOrigDIVerifyBugsReportFilePath(
957 Debugify.registerCallbacks(PIC, MAM);
959#if LLVM_ENABLE_DEBUGLOC_TRACKING_COVERAGE
966 if (!F.getSubprogram())
968 for (BasicBlock &BB : F)
969 for (Instruction &I : BB)
970 if (!I.getDebugLoc())
971 I.setDebugLoc(DebugLoc::getCompilerGenerated());
976 for (
const std::unique_ptr<PassPlugin> &Plugin : CI.
getPassPlugins())
977 Plugin->registerPassBuilderCallbacks(PB);
980#define HANDLE_EXTENSION(Ext) \
981 get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
982#include "llvm/Support/Extension.def"
986 std::unique_ptr<TargetLibraryInfoImpl> TLII(
987 llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
988 FAM.registerPass([&] {
return TargetLibraryAnalysis(*TLII); });
991 PB.registerModuleAnalyses(MAM);
992 PB.registerCGSCCAnalyses(CGAM);
993 PB.registerFunctionAnalyses(FAM);
994 PB.registerLoopAnalyses(LAM);
995 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
997 ModulePassManager MPM;
999 if (CodeGenOpts.VerifyModule)
1000 MPM.addPass(VerifierPass());
1002 if (!CodeGenOpts.DisableLLVMPasses) {
1007 const bool PrepareForThinLTO = CodeGenOpts.PrepareForThinLTO;
1008 const bool PrepareForLTO = CodeGenOpts.PrepareForLTO;
1010 if (LangOpts.ObjCAutoRefCount) {
1011 PB.registerPipelineStartEPCallback(
1012 [](ModulePassManager &MPM, OptimizationLevel Level) {
1013 if (Level != OptimizationLevel::O0)
1015 createModuleToFunctionPassAdaptor(ObjCARCExpandPass()));
1017 PB.registerScalarOptimizerLateEPCallback(
1018 [](FunctionPassManager &FPM, OptimizationLevel Level) {
1019 if (Level != OptimizationLevel::O0)
1020 FPM.addPass(ObjCARCOptPass());
1030 if (IsThinLTOPostLink)
1031 PB.registerPipelineStartEPCallback(
1032 [](ModulePassManager &MPM, OptimizationLevel Level) {
1033 MPM.addPass(LowerTypeTestsPass(
1036 lowertypetests::DropTestKind::Assume));
1041 if (LangOpts.
Sanitize.
has(SanitizerKind::LocalBounds))
1042 PB.registerScalarOptimizerLateEPCallback([
this](FunctionPassManager &FPM,
1043 OptimizationLevel Level) {
1044 BoundsCheckingPass::Options Options;
1047 static_assert(SanitizerKind::SO_LocalBounds <=
1048 std::numeric_limits<
1049 decltype(Options.GuardKind)::value_type>
::max(),
1050 "Update type of llvm.allow.ubsan.check to represent "
1051 "SanitizerKind::SO_LocalBounds.");
1052 Options.GuardKind = SanitizerKind::SO_LocalBounds;
1059 CodeGenOpts.SanitizeMinimalRuntime),
1063 static_cast<bool>(CodeGenOpts.SanitizeHandlerPreserveAllRegs),
1066 FPM.addPass(BoundsCheckingPass(Options));
1069 if (!IsThinLTOPostLink) {
1075 PB.registerPipelineStartEPCallback(
1076 [&](ModulePassManager &MPM, OptimizationLevel Level) {
1077 if (Level == OptimizationLevel::O0 &&
1078 LangOpts.
Sanitize.
has(SanitizerKind::AllocToken)) {
1084 MPM.addPass(InferFunctionAttrsPass());
1089 if (std::optional<GCOVOptions> Options =
1091 PB.registerPipelineStartEPCallback(
1092 [
this, Options](ModulePassManager &MPM, OptimizationLevel Level) {
1096 if (std::optional<InstrProfOptions> Options =
1098 PB.registerPipelineStartEPCallback(
1099 [Options](ModulePassManager &MPM, OptimizationLevel Level) {
1100 MPM.addPass(InstrProfilingLoweringPass(*Options,
false));
1106 PB.registerOptimizerLastEPCallback([](ModulePassManager &MPM,
1107 OptimizationLevel Level,
1108 ThinOrFullLTOPhase) {
1109 MPM.addPass(createModuleToFunctionPassAdaptor(MemProfilerPass()));
1110 MPM.addPass(ModuleMemProfilerPass());
1114 if (CodeGenOpts.FatLTO) {
1115 MPM.addPass(PB.buildFatLTODefaultPipeline(
1116 Level, PrepareForThinLTO,
1117 PrepareForThinLTO || shouldEmitRegularLTOSummary()));
1118 }
else if (PrepareForThinLTO) {
1119 MPM.addPass(PB.buildThinLTOPreLinkDefaultPipeline(Level));
1120 }
else if (PrepareForLTO) {
1121 MPM.addPass(PB.buildLTOPreLinkDefaultPipeline(Level));
1123 MPM.addPass(PB.buildPerModuleDefaultPipeline(Level));
1128 if (CodeGenOpts.LinkBitcodePostopt)
1129 MPM.addPass(LinkInModulesPass(BC));
1131 if (LangOpts.HIPStdPar && !LangOpts.CUDAIsDevice &&
1132 LangOpts.HIPStdParInterposeAlloc)
1133 MPM.addPass(HipStdParAllocationInterpositionPass());
1141 MPM.addPass(VerifierPass());
1144 CodeGenOpts.FatLTO) {
1145 if (CodeGenOpts.PrepareForThinLTO && !CodeGenOpts.DisableLLVMPasses) {
1146 if (!TheModule->getModuleFlag(
"EnableSplitLTOUnit"))
1147 TheModule->addModuleFlag(llvm::Module::Error,
"EnableSplitLTOUnit",
1148 CodeGenOpts.EnableSplitLTOUnit);
1155 MPM.addPass(ThinLTOBitcodeWriterPass(
1156 *OS, ThinLinkOS ? &ThinLinkOS->os() :
nullptr));
1158 MPM.addPass(PrintModulePass(*OS,
"", CodeGenOpts.EmitLLVMUseLists,
1164 bool EmitLTOSummary = shouldEmitRegularLTOSummary();
1165 if (EmitLTOSummary) {
1166 if (!TheModule->getModuleFlag(
"ThinLTO") && !CodeGenOpts.UnifiedLTO)
1167 TheModule->addModuleFlag(llvm::Module::Error,
"ThinLTO",
uint32_t(0));
1168 if (!TheModule->getModuleFlag(
"EnableSplitLTOUnit"))
1169 TheModule->addModuleFlag(llvm::Module::Error,
"EnableSplitLTOUnit",
1173 MPM.addPass(BitcodeWriterPass(*OS, CodeGenOpts.EmitLLVMUseLists,
1176 MPM.addPass(PrintModulePass(*OS,
"", CodeGenOpts.EmitLLVMUseLists,
1181 if (shouldEmitUnifiedLTOModueFlag() &&
1182 !TheModule->getModuleFlag(
"UnifiedLTO"))
1183 TheModule->addModuleFlag(llvm::Module::Error,
"UnifiedLTO",
uint32_t(1));
1190 if (PrintPipelinePasses) {
1191 MPM.printPipeline(outs(), [&PIC](StringRef ClassName) {
1192 auto PassName = PIC.getPassNameForClassName(ClassName);
1193 return PassName.empty() ? ClassName : PassName;
1201 PrettyStackTraceString CrashInfo(
"Optimizer");
1202 llvm::TimeTraceScope TimeScope(
"Optimizer");
1208 MPM.run(*TheModule, MAM);
1214void EmitAssemblyHelper::RunCodegenPipeline(
1215 BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
1216 std::unique_ptr<llvm::ToolOutputFile> &DwoOS) {
1226 for (
const std::unique_ptr<llvm::PassPlugin> &Plugin : CI.
getPassPlugins()) {
1227 if (Plugin->invokePreCodeGenCallback(*TheModule, *TM, CGFT, *OS))
1234 legacy::PassManager CodeGenPasses;
1237 createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
1239 std::unique_ptr<TargetLibraryInfoImpl> TLII(
1240 llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
1241 CodeGenPasses.add(
new TargetLibraryInfoWrapperPass(*TLII));
1243 const llvm::TargetOptions &Options = TM->Options;
1244 CodeGenPasses.add(
new RuntimeLibraryInfoWrapper(
1245 TargetTriple, Options.ExceptionModel, Options.FloatABIType,
1246 Options.EABIVersion, Options.MCOptions.ABIName, Options.VecLib));
1254 if (TM->addPassesToEmitFile(CodeGenPasses, *OS,
1255 DwoOS ? &DwoOS->os() :
nullptr, CGFT,
1256 !CodeGenOpts.VerifyModule)) {
1257 Diags.
Report(diag::err_fe_unable_to_interface_with_target);
1264 if (PrintPipelinePasses) {
1269 PrettyStackTraceString CrashInfo(
"Code generation");
1270 llvm::TimeTraceScope TimeScope(
"CodeGenPasses");
1273 timer.init(
"codegen",
"Machine code generation", CI.
getTimerGroup());
1276 CodeGenPasses.run(*TheModule);
1283 std::unique_ptr<raw_pwrite_stream> OS,
1284 BackendConsumer *BC) {
1288 CreateTargetMachine(RequiresCodeGen);
1290 if (RequiresCodeGen && !TM)
1293 TheModule->setDataLayout(TM->createDataLayout());
1296 cl::PrintOptionValues();
1298 std::unique_ptr<llvm::ToolOutputFile> ThinLinkOS, DwoOS;
1299 RunOptimizationPipeline(Action, OS, ThinLinkOS, BC);
1300 RunCodegenPipeline(Action, OS, DwoOS);
1310 llvm::Module *M, std::unique_ptr<raw_pwrite_stream> OS,
1311 std::string SampleProfile, std::string ProfileRemapping,
1316 DenseMap<StringRef, DenseMap<GlobalValue::GUID, GlobalValueSummary *>>
1317 ModuleToDefinedGVSummaries;
1318 CombinedIndex->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
1325 FunctionImporter::ImportIDTable ImportIDs;
1326 FunctionImporter::ImportMapTy ImportList(ImportIDs);
1327 if (!lto::initImportList(*M, *CombinedIndex, ImportList))
1330 auto AddStream = [&](
size_t Task,
const Twine &ModuleName) {
1331 return std::make_unique<CachedFileStream>(std::move(OS),
1332 CGOpts.ObjectFilenameForDebug);
1335 if (CGOpts.SaveTempsFilePrefix !=
"") {
1336 if (
Error E = Conf.addSaveTemps(CGOpts.SaveTempsFilePrefix +
".",
1338 handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) {
1339 errs() <<
"Error setting up ThinLTO save-temps: " << EIB.message()
1344 Conf.CPU = TOpts.CPU;
1346 Conf.MAttrs = TOpts.Features;
1347 Conf.RelocModel = CGOpts.RelocationModel;
1348 std::optional<CodeGenOptLevel> OptLevelOrNone =
1349 CodeGenOpt::getLevel(CGOpts.OptimizationLevel);
1350 assert(OptLevelOrNone &&
"Invalid optimization level!");
1351 Conf.CGOptLevel = *OptLevelOrNone;
1352 Conf.OptLevel = CGOpts.OptimizationLevel;
1354 Conf.SampleProfile = std::move(SampleProfile);
1355 Conf.PTO.LoopUnrolling = CGOpts.UnrollLoops;
1356 Conf.PTO.LoopInterchange = CGOpts.InterchangeLoops;
1357 Conf.PTO.LoopFusion = CGOpts.FuseLoops;
1360 Conf.PTO.LoopInterleaving = CGOpts.UnrollLoops;
1361 Conf.PTO.LoopVectorization = CGOpts.VectorizeLoop;
1362 Conf.PTO.SLPVectorization = CGOpts.VectorizeSLP;
1365 Conf.PTO.CallGraphProfile = !CGOpts.DisableIntegratedAS;
1368 if (CGOpts.hasProfileCSIRInstr()) {
1369 Conf.RunCSIRInstr =
true;
1371 }
else if (CGOpts.hasProfileCSIRUse()) {
1372 Conf.RunCSIRInstr =
false;
1373 Conf.CSIRProfile = std::move(CGOpts.ProfileInstrumentUsePath);
1376 Conf.ProfileRemapping = std::move(ProfileRemapping);
1377 Conf.DebugPassManager = CGOpts.DebugPassManager;
1378 Conf.VerifyEach = CGOpts.VerifyEach;
1379 Conf.RemarksWithHotness = CGOpts.DiagnosticsWithHotness;
1380 Conf.RemarksFilename = CGOpts.OptRecordFile;
1381 Conf.RemarksPasses = CGOpts.OptRecordPasses;
1382 Conf.RemarksFormat = CGOpts.OptRecordFormat;
1383 Conf.SplitDwarfFile = CGOpts.SplitDwarfFile;
1384 Conf.SplitDwarfOutput = CGOpts.SplitDwarfOutput;
1387 Conf.PreCodeGenModuleHook = [](
size_t Task,
const llvm::Module &Mod) {
1392 Conf.PreCodeGenModuleHook = [&](
size_t Task,
const llvm::Module &Mod) {
1393 M->print(*OS,
nullptr, CGOpts.EmitLLVMUseLists);
1398 Conf.PreCodeGenModuleHook = [&](
size_t Task,
const llvm::Module &Mod) {
1399 WriteBitcodeToFile(*M, *OS, CGOpts.EmitLLVMUseLists);
1410 finalizeLLVMOptimizationRemarks(M->getContext());
1412 thinBackend(Conf, -1, AddStream, *M, *CombinedIndex, ImportList,
1413 ModuleToDefinedGVSummaries[M->getModuleIdentifier()],
1414 nullptr, Conf.CodeGenOnly,
1415 nullptr, CGOpts.CmdArgs)) {
1416 handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) {
1417 errs() <<
"Error running ThinLTO backend: " << EIB.message() <<
'\n';
1423 StringRef TDesc, llvm::Module *M,
1426 std::unique_ptr<raw_pwrite_stream> OS,
1428 llvm::TimeTraceScope TimeScope(
"Backend");
1431 std::unique_ptr<llvm::Module> EmptyModule;
1434 auto BypassSandbox = sys::sandbox::scopedDisable();
1438 std::unique_ptr<ModuleSummaryIndex> CombinedIndex;
1439 if (
Error E = llvm::getModuleSummaryIndexForFile(
1442 .moveInto(CombinedIndex)) {
1443 logAllUnhandledErrors(std::move(E), errs(),
1444 "Error loading index file '" +
1452 if (CombinedIndex) {
1453 if (!CombinedIndex->skipModuleByDistributedBackend()) {
1465 EmptyModule = std::make_unique<llvm::Module>(
"empty", M->getContext());
1466 EmptyModule->setTargetTriple(M->getTargetTriple());
1467 M = EmptyModule.get();
1471 EmitAssemblyHelper AsmHelper(CI, CGOpts, M, VFS);
1472 AsmHelper.emitAssembly(Action, std::move(OS), BC);
1477 std::string DLDesc = M->getDataLayout().getStringRepresentation();
1478 if (DLDesc != TDesc) {
1479 Diags.
Report(diag::err_data_layout_mismatch) << DLDesc << TDesc;
1487 llvm::MemoryBufferRef Buf) {
1490 llvm::embedBitcodeInModule(
1502 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ObjectOrErr =
1503 VFS.getBufferForFile(OffloadObject);
1504 if (ObjectOrErr.getError()) {
1505 Diags.
Report(diag::err_failed_to_open_for_embedding) << OffloadObject;
1509 llvm::embedBufferInModule(*M, **ObjectOrErr,
".llvm.offloading",
1510 Align(object::OffloadBinary::getAlignment()));
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,...
std::string BinutilsVersion
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
LangOptions & getLangOpts()
llvm::ArrayRef< std::unique_ptr< llvm::PassPlugin > > getPassPlugins() const
CodeGenOptions & getCodeGenOpts()
Concrete class used by the front-end to report problems and issues.
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)
@ Backend_EmitAssembly
Emit native assembly files.
@ Backend_EmitLL
Emit human-readable LLVM assembly.
@ Backend_EmitBC
Emit LLVM bitcode files.
@ Backend_EmitObj
Emit native object files.
@ Backend_EmitMCNull
Run CodeGen, but don't emit anything.
@ Backend_EmitNothing
Don't emit anything (benchmarking mode)
Diagnostic wrappers for TextAPI types for error reporting.
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.
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.