19#include "llvm/ADT/SmallSet.h"
20#include "llvm/ADT/StringExtras.h"
21#include "llvm/ADT/StringSwitch.h"
22#include "llvm/Analysis/AliasAnalysis.h"
23#include "llvm/Analysis/GlobalsModRef.h"
24#include "llvm/Analysis/TargetLibraryInfo.h"
25#include "llvm/Analysis/TargetTransformInfo.h"
26#include "llvm/Bitcode/BitcodeReader.h"
27#include "llvm/Bitcode/BitcodeWriter.h"
28#include "llvm/Bitcode/BitcodeWriterPass.h"
29#include "llvm/CodeGen/RegAllocRegistry.h"
30#include "llvm/CodeGen/SchedulerRegistry.h"
31#include "llvm/CodeGen/TargetSubtargetInfo.h"
32#include "llvm/Frontend/Driver/CodeGenOptions.h"
33#include "llvm/IR/DataLayout.h"
34#include "llvm/IR/DebugInfo.h"
35#include "llvm/IR/LegacyPassManager.h"
36#include "llvm/IR/Module.h"
37#include "llvm/IR/ModuleSummaryIndex.h"
38#include "llvm/IR/PassManager.h"
39#include "llvm/IR/Verifier.h"
40#include "llvm/IRPrinter/IRPrintingPasses.h"
41#include "llvm/LTO/LTOBackend.h"
42#include "llvm/MC/MCAsmInfo.h"
43#include "llvm/MC/TargetRegistry.h"
44#include "llvm/Object/OffloadBinary.h"
45#include "llvm/Passes/PassBuilder.h"
46#include "llvm/Passes/PassPlugin.h"
47#include "llvm/Passes/StandardInstrumentations.h"
48#include "llvm/ProfileData/InstrProfCorrelator.h"
49#include "llvm/Support/BuryPointer.h"
50#include "llvm/Support/CommandLine.h"
51#include "llvm/Support/MemoryBuffer.h"
52#include "llvm/Support/PrettyStackTrace.h"
53#include "llvm/Support/TimeProfiler.h"
54#include "llvm/Support/Timer.h"
55#include "llvm/Support/ToolOutputFile.h"
56#include "llvm/Support/VirtualFileSystem.h"
57#include "llvm/Support/raw_ostream.h"
58#include "llvm/Target/TargetMachine.h"
59#include "llvm/Target/TargetOptions.h"
60#include "llvm/TargetParser/SubtargetFeature.h"
61#include "llvm/TargetParser/Triple.h"
62#include "llvm/Transforms/HipStdPar/HipStdPar.h"
63#include "llvm/Transforms/IPO/EmbedBitcodePass.h"
64#include "llvm/Transforms/IPO/LowerTypeTests.h"
65#include "llvm/Transforms/IPO/ThinLTOBitcodeWriter.h"
66#include "llvm/Transforms/InstCombine/InstCombine.h"
67#include "llvm/Transforms/Instrumentation.h"
68#include "llvm/Transforms/Instrumentation/AddressSanitizer.h"
69#include "llvm/Transforms/Instrumentation/AddressSanitizerOptions.h"
70#include "llvm/Transforms/Instrumentation/BoundsChecking.h"
71#include "llvm/Transforms/Instrumentation/DataFlowSanitizer.h"
72#include "llvm/Transforms/Instrumentation/GCOVProfiler.h"
73#include "llvm/Transforms/Instrumentation/HWAddressSanitizer.h"
74#include "llvm/Transforms/Instrumentation/InstrProfiling.h"
75#include "llvm/Transforms/Instrumentation/KCFI.h"
76#include "llvm/Transforms/Instrumentation/LowerAllowCheckPass.h"
77#include "llvm/Transforms/Instrumentation/MemProfiler.h"
78#include "llvm/Transforms/Instrumentation/MemorySanitizer.h"
79#include "llvm/Transforms/Instrumentation/NumericalStabilitySanitizer.h"
80#include "llvm/Transforms/Instrumentation/PGOInstrumentation.h"
81#include "llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h"
82#include "llvm/Transforms/Instrumentation/SanitizerCoverage.h"
83#include "llvm/Transforms/Instrumentation/ThreadSanitizer.h"
84#include "llvm/Transforms/ObjCARC.h"
85#include "llvm/Transforms/Scalar/EarlyCSE.h"
86#include "llvm/Transforms/Scalar/GVN.h"
87#include "llvm/Transforms/Scalar/JumpThreading.h"
88#include "llvm/Transforms/Utils/Debugify.h"
89#include "llvm/Transforms/Utils/ModuleUtils.h"
95#define HANDLE_EXTENSION(Ext) \
96 llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
97#include "llvm/Support/Extension.def"
104 "sanitizer-early-opt-ep", cl::Optional,
105 cl::desc(
"Insert sanitizers on OptimizerEarlyEP."));
110 "pgo-cold-func-opt", cl::init(PGOOptions::ColdFuncOpt::Default), cl::Hidden,
112 "Function attribute to apply to cold functions as determined by PGO"),
113 cl::values(clEnumValN(PGOOptions::ColdFuncOpt::Default,
"default",
114 "Default (no attribute)"),
115 clEnumValN(PGOOptions::ColdFuncOpt::OptSize,
"optsize",
116 "Mark cold functions with optsize."),
117 clEnumValN(PGOOptions::ColdFuncOpt::MinSize,
"minsize",
118 "Mark cold functions with minsize."),
119 clEnumValN(PGOOptions::ColdFuncOpt::OptNone,
"optnone",
120 "Mark cold functions with optnone.")));
128std::string getDefaultProfileGenName() {
130 ?
"default_%m.proflite"
131 :
"default_%m.profraw";
134class EmitAssemblyHelper {
140 llvm::Module *TheModule;
143 Timer CodeGenerationTime;
145 std::unique_ptr<raw_pwrite_stream> OS;
149 TargetIRAnalysis getTargetIRAnalysis()
const {
151 return TM->getTargetIRAnalysis();
153 return TargetIRAnalysis();
164 void CreateTargetMachine(
bool MustCreateTM);
169 bool AddEmitPasses(legacy::PassManager &CodeGenPasses,
BackendAction Action,
170 raw_pwrite_stream &OS, raw_pwrite_stream *DwoOS);
172 std::unique_ptr<llvm::ToolOutputFile> openOutputFile(StringRef
Path) {
174 auto F = std::make_unique<llvm::ToolOutputFile>(
Path, EC,
175 llvm::sys::fs::OF_None);
177 Diags.
Report(diag::err_fe_unable_to_open_output) <<
Path << EC.message();
183 void RunOptimizationPipeline(
184 BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
185 std::unique_ptr<llvm::ToolOutputFile> &ThinLinkOS,
BackendConsumer *BC);
187 std::unique_ptr<raw_pwrite_stream> &OS,
188 std::unique_ptr<llvm::ToolOutputFile> &DwoOS);
195 bool shouldEmitRegularLTOSummary()
const {
196 return CodeGenOpts.PrepareForLTO && !CodeGenOpts.DisableLLVMPasses &&
197 TargetTriple.getVendor() != llvm::Triple::Apple;
203 bool shouldEmitUnifiedLTOModueFlag()
const {
204 return CodeGenOpts.UnifiedLTO &&
205 (CodeGenOpts.PrepareForThinLTO || shouldEmitRegularLTOSummary());
215 : Diags(_Diags), HSOpts(HeaderSearchOpts), CodeGenOpts(CGOpts),
216 TargetOpts(TOpts), LangOpts(LOpts), TheModule(M),
VFS(
std::move(
VFS)),
217 CodeGenerationTime(
"codegen",
"Code Generation Time"),
218 TargetTriple(TheModule->getTargetTriple()) {}
220 ~EmitAssemblyHelper() {
221 if (CodeGenOpts.DisableFree)
222 BuryPointer(std::move(TM));
225 std::unique_ptr<TargetMachine> TM;
233static SanitizerCoverageOptions
235 SanitizerCoverageOptions Opts;
237 static_cast<SanitizerCoverageOptions::Type
>(CGOpts.SanitizeCoverageType);
238 Opts.IndirectCalls = CGOpts.SanitizeCoverageIndirectCalls;
239 Opts.TraceBB = CGOpts.SanitizeCoverageTraceBB;
240 Opts.TraceCmp = CGOpts.SanitizeCoverageTraceCmp;
241 Opts.TraceDiv = CGOpts.SanitizeCoverageTraceDiv;
242 Opts.TraceGep = CGOpts.SanitizeCoverageTraceGep;
243 Opts.Use8bitCounters = CGOpts.SanitizeCoverage8bitCounters;
244 Opts.TracePC = CGOpts.SanitizeCoverageTracePC;
245 Opts.TracePCGuard = CGOpts.SanitizeCoverageTracePCGuard;
246 Opts.NoPrune = CGOpts.SanitizeCoverageNoPrune;
247 Opts.Inline8bitCounters = CGOpts.SanitizeCoverageInline8bitCounters;
248 Opts.InlineBoolFlag = CGOpts.SanitizeCoverageInlineBoolFlag;
249 Opts.PCTable = CGOpts.SanitizeCoveragePCTable;
250 Opts.StackDepth = CGOpts.SanitizeCoverageStackDepth;
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 .Case(
"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 llvm::TargetOptions &Options,
330 switch (LangOpts.getThreadModel()) {
331 case LangOptions::ThreadModelKind::POSIX:
332 Options.ThreadModel = llvm::ThreadModel::POSIX;
334 case LangOptions::ThreadModelKind::Single:
335 Options.ThreadModel = llvm::ThreadModel::Single;
340 assert((CodeGenOpts.
FloatABI ==
"soft" || CodeGenOpts.
FloatABI ==
"softfp" ||
342 "Invalid Floating Point ABI!");
343 Options.FloatABIType =
344 llvm::StringSwitch<llvm::FloatABI::ABIType>(CodeGenOpts.
FloatABI)
345 .Case(
"soft", llvm::FloatABI::Soft)
346 .Case(
"softfp", llvm::FloatABI::Soft)
347 .Case(
"hard", llvm::FloatABI::Hard)
348 .Default(llvm::FloatABI::Default);
351 switch (LangOpts.getDefaultFPContractMode()) {
352 case LangOptions::FPM_Off:
355 Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
357 case LangOptions::FPM_On:
358 case LangOptions::FPM_FastHonorPragmas:
359 Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
361 case LangOptions::FPM_Fast:
362 Options.AllowFPOpFusion = llvm::FPOpFusion::Fast;
366 Options.BinutilsVersion =
367 llvm::TargetMachine::parseBinutilsVersion(CodeGenOpts.
BinutilsVersion);
368 Options.UseInitArray = CodeGenOpts.UseInitArray;
369 Options.DisableIntegratedAS = CodeGenOpts.DisableIntegratedAS;
375 Options.ExceptionModel = llvm::ExceptionHandling::SjLj;
377 Options.ExceptionModel = llvm::ExceptionHandling::WinEH;
379 Options.ExceptionModel = llvm::ExceptionHandling::DwarfCFI;
381 Options.ExceptionModel = llvm::ExceptionHandling::Wasm;
383 Options.NoInfsFPMath = LangOpts.NoHonorInfs;
384 Options.NoNaNsFPMath = LangOpts.NoHonorNaNs;
385 Options.NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
386 Options.UnsafeFPMath = LangOpts.AllowFPReassoc && LangOpts.AllowRecip &&
387 LangOpts.NoSignedZero && LangOpts.ApproxFunc &&
388 (LangOpts.getDefaultFPContractMode() ==
389 LangOptions::FPModeKind::FPM_Fast ||
390 LangOpts.getDefaultFPContractMode() ==
391 LangOptions::FPModeKind::FPM_FastHonorPragmas);
392 Options.ApproxFuncFPMath = LangOpts.ApproxFunc;
394 Options.BBAddrMap = CodeGenOpts.BBAddrMap;
396 llvm::StringSwitch<llvm::BasicBlockSection>(CodeGenOpts.
BBSections)
397 .Case(
"all", llvm::BasicBlockSection::All)
398 .Case(
"labels", llvm::BasicBlockSection::Labels)
399 .StartsWith(
"list=", llvm::BasicBlockSection::List)
400 .Case(
"none", llvm::BasicBlockSection::None)
401 .Default(llvm::BasicBlockSection::None);
403 if (Options.BBSections == llvm::BasicBlockSection::List) {
404 ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
405 MemoryBuffer::getFile(CodeGenOpts.
BBSections.substr(5));
407 Diags.
Report(diag::err_fe_unable_to_load_basic_block_sections_file)
408 << MBOrErr.getError().message();
411 Options.BBSectionsFuncListBuf = std::move(*MBOrErr);
414 Options.EnableMachineFunctionSplitter = CodeGenOpts.SplitMachineFunctions;
415 Options.FunctionSections = CodeGenOpts.FunctionSections;
416 Options.DataSections = CodeGenOpts.DataSections;
417 Options.IgnoreXCOFFVisibility = LangOpts.IgnoreXCOFFVisibility;
418 Options.UniqueSectionNames = CodeGenOpts.UniqueSectionNames;
419 Options.UniqueBasicBlockSectionNames =
420 CodeGenOpts.UniqueBasicBlockSectionNames;
421 Options.SeparateNamedSections = CodeGenOpts.SeparateNamedSections;
422 Options.TLSSize = CodeGenOpts.TLSSize;
423 Options.EnableTLSDESC = CodeGenOpts.EnableTLSDESC;
424 Options.EmulatedTLS = CodeGenOpts.EmulatedTLS;
425 Options.DebuggerTuning = CodeGenOpts.getDebuggerTuning();
426 Options.EmitStackSizeSection = CodeGenOpts.StackSizeSection;
428 Options.EmitAddrsig = CodeGenOpts.Addrsig;
429 Options.ForceDwarfFrameSection = CodeGenOpts.ForceDwarfFrameSection;
430 Options.EmitCallSiteInfo = CodeGenOpts.EmitCallSiteInfo;
431 Options.EnableAIXExtendedAltivecABI = LangOpts.EnableAIXExtendedAltivecABI;
432 Options.XRayFunctionIndex = CodeGenOpts.XRayFunctionIndex;
433 Options.LoopAlignment = CodeGenOpts.LoopAlignment;
434 Options.DebugStrictDwarf = CodeGenOpts.DebugStrictDwarf;
436 Options.Hotpatch = CodeGenOpts.HotPatch;
437 Options.JMCInstrument = CodeGenOpts.JMCInstrument;
438 Options.XCOFFReadOnlyPointers = CodeGenOpts.XCOFFReadOnlyPointers;
440 switch (CodeGenOpts.getSwiftAsyncFramePointer()) {
441 case CodeGenOptions::SwiftAsyncFramePointerKind::Auto:
442 Options.SwiftAsyncFramePointer =
443 SwiftAsyncFramePointerMode::DeploymentBased;
446 case CodeGenOptions::SwiftAsyncFramePointerKind::Always:
447 Options.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Always;
450 case CodeGenOptions::SwiftAsyncFramePointerKind::Never:
451 Options.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Never;
456 Options.MCOptions.EmitDwarfUnwind = CodeGenOpts.getEmitDwarfUnwind();
457 Options.MCOptions.EmitCompactUnwindNonCanonical =
458 CodeGenOpts.EmitCompactUnwindNonCanonical;
459 Options.MCOptions.MCRelaxAll = CodeGenOpts.RelaxAll;
460 Options.MCOptions.MCSaveTempLabels = CodeGenOpts.SaveTempLabels;
461 Options.MCOptions.MCUseDwarfDirectory =
462 CodeGenOpts.NoDwarfDirectoryAsm
463 ? llvm::MCTargetOptions::DisableDwarfDirectory
464 : llvm::MCTargetOptions::EnableDwarfDirectory;
465 Options.MCOptions.MCNoExecStack = CodeGenOpts.NoExecStack;
466 Options.MCOptions.MCIncrementalLinkerCompatible =
467 CodeGenOpts.IncrementalLinkerCompatible;
468 Options.MCOptions.MCFatalWarnings = CodeGenOpts.FatalWarnings;
469 Options.MCOptions.MCNoWarn = CodeGenOpts.NoWarn;
470 Options.MCOptions.AsmVerbose = CodeGenOpts.AsmVerbose;
471 Options.MCOptions.Dwarf64 = CodeGenOpts.Dwarf64;
472 Options.MCOptions.PreserveAsmComments = CodeGenOpts.PreserveAsmComments;
473 Options.MCOptions.Crel = CodeGenOpts.Crel;
474 Options.MCOptions.ImplicitMapSyms = CodeGenOpts.ImplicitMapSyms;
475 Options.MCOptions.X86RelaxRelocations = CodeGenOpts.X86RelaxRelocations;
476 Options.MCOptions.CompressDebugSections =
477 CodeGenOpts.getCompressDebugSections();
478 Options.MCOptions.ABIName = TargetOpts.
ABI;
480 if (!Entry.IsFramework &&
481 (Entry.Group == frontend::IncludeDirGroup::Quoted ||
482 Entry.Group == frontend::IncludeDirGroup::Angled ||
483 Entry.Group == frontend::IncludeDirGroup::System))
484 Options.MCOptions.IASSearchPaths.push_back(
485 Entry.IgnoreSysRoot ? Entry.Path : HSOpts.
Sysroot + Entry.Path);
486 Options.MCOptions.Argv0 = CodeGenOpts.
Argv0;
489 Options.MCOptions.PPCUseFullRegisterNames =
490 CodeGenOpts.PPCUseFullRegisterNames;
491 Options.MisExpect = CodeGenOpts.MisExpect;
496static std::optional<GCOVOptions>
507 Options.NoRedZone = CodeGenOpts.DisableRedZone;
510 Options.Atomic = CodeGenOpts.AtomicProfileUpdate;
514static std::optional<InstrProfOptions>
519 InstrProfOptions Options;
520 Options.NoRedZone = CodeGenOpts.DisableRedZone;
522 Options.Atomic = CodeGenOpts.AtomicProfileUpdate;
528 BackendArgs.push_back(
"clang");
530 BackendArgs.push_back(
"-debug-pass");
531 BackendArgs.push_back(CodeGenOpts.
DebugPass.c_str());
534 BackendArgs.push_back(
"-limit-float-precision");
540 if (BackendArgs.size() == 1)
542 BackendArgs.push_back(
nullptr);
546 llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1,
550void EmitAssemblyHelper::CreateTargetMachine(
bool MustCreateTM) {
553 std::string Triple = TheModule->getTargetTriple();
554 const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
557 Diags.
Report(diag::err_fe_unable_to_create_target) <<
Error;
561 std::optional<llvm::CodeModel::Model> CM =
getCodeModel(CodeGenOpts);
562 std::string FeaturesStr =
565 std::optional<CodeGenOptLevel> OptLevelOrNone =
566 CodeGenOpt::getLevel(CodeGenOpts.OptimizationLevel);
567 assert(OptLevelOrNone &&
"Invalid optimization level!");
568 CodeGenOptLevel OptLevel = *OptLevelOrNone;
570 llvm::TargetOptions Options;
574 TM.reset(TheTarget->createTargetMachine(Triple, TargetOpts.
CPU, FeaturesStr,
575 Options, RM, CM, OptLevel));
579bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses,
581 raw_pwrite_stream &OS,
582 raw_pwrite_stream *DwoOS) {
584 std::unique_ptr<TargetLibraryInfoImpl> TLII(
585 llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
586 CodeGenPasses.add(
new TargetLibraryInfoWrapperPass(*TLII));
592 if (TM->addPassesToEmitFile(CodeGenPasses, OS, DwoOS, CGFT,
593 !CodeGenOpts.VerifyModule)) {
594 Diags.
Report(diag::err_fe_unable_to_interface_with_target);
602 switch (Opts.OptimizationLevel) {
604 llvm_unreachable(
"Invalid optimization level!");
607 return OptimizationLevel::O0;
610 return OptimizationLevel::O1;
613 switch (Opts.OptimizeSize) {
615 llvm_unreachable(
"Invalid optimization level for size!");
618 return OptimizationLevel::O2;
621 return OptimizationLevel::Os;
624 return OptimizationLevel::Oz;
628 return OptimizationLevel::O3;
635 if (TargetTriple.getArch() == llvm::Triple::x86_64 ||
636 TargetTriple.isAArch64(64) || TargetTriple.isRISCV())
640 PB.registerOptimizerLastEPCallback(
641 [&](ModulePassManager &MPM, OptimizationLevel Level) {
642 if (Level == OptimizationLevel::O0 &&
644 MPM.addPass(createModuleToFunctionPassAdaptor(KCFIPass()));
649 PB.registerPeepholeEPCallback(
650 [&](FunctionPassManager &FPM, OptimizationLevel Level) {
651 if (Level != OptimizationLevel::O0 &&
653 FPM.addPass(KCFIPass());
660 auto SanitizersCallback = [&](ModulePassManager &MPM,
661 OptimizationLevel Level) {
664 MPM.addPass(SanitizerCoveragePass(
670 MPM.addPass(SanitizerBinaryMetadataPass(
675 auto MSanPass = [&](
SanitizerMask Mask,
bool CompileKernel) {
677 int TrackOrigins = CodeGenOpts.SanitizeMemoryTrackOrigins;
680 MemorySanitizerOptions options(TrackOrigins, Recover, CompileKernel,
681 CodeGenOpts.SanitizeMemoryParamRetval);
682 MPM.addPass(MemorySanitizerPass(options));
683 if (Level != OptimizationLevel::O0) {
688 MPM.addPass(RequireAnalysisPass<GlobalsAA, llvm::Module>());
689 FunctionPassManager FPM;
690 FPM.addPass(EarlyCSEPass(
true ));
691 FPM.addPass(InstCombinePass());
692 FPM.addPass(JumpThreadingPass());
693 FPM.addPass(GVNPass());
694 FPM.addPass(InstCombinePass());
695 MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
699 MSanPass(SanitizerKind::Memory,
false);
700 MSanPass(SanitizerKind::KernelMemory,
true);
702 if (LangOpts.
Sanitize.
has(SanitizerKind::Thread)) {
703 MPM.addPass(ModuleThreadSanitizerPass());
704 MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass()));
707 if (LangOpts.
Sanitize.
has(SanitizerKind::NumericalStability))
708 MPM.addPass(NumericalStabilitySanitizerPass());
710 auto ASanPass = [&](
SanitizerMask Mask,
bool CompileKernel) {
713 bool UseOdrIndicator = CodeGenOpts.SanitizeAddressUseOdrIndicator;
714 llvm::AsanDtorKind DestructorKind =
715 CodeGenOpts.getSanitizeAddressDtor();
716 AddressSanitizerOptions Opts;
717 Opts.CompileKernel = CompileKernel;
719 Opts.UseAfterScope = CodeGenOpts.SanitizeAddressUseAfterScope;
720 Opts.UseAfterReturn = CodeGenOpts.getSanitizeAddressUseAfterReturn();
721 MPM.addPass(AddressSanitizerPass(Opts, UseGlobalGC, UseOdrIndicator,
725 ASanPass(SanitizerKind::Address,
false);
726 ASanPass(SanitizerKind::KernelAddress,
true);
728 auto HWASanPass = [&](
SanitizerMask Mask,
bool CompileKernel) {
731 MPM.addPass(HWAddressSanitizerPass(
732 {CompileKernel, Recover,
733 CodeGenOpts.OptimizationLevel == 0}));
736 HWASanPass(SanitizerKind::HWAddress,
false);
737 HWASanPass(SanitizerKind::KernelHWAddress,
true);
739 if (LangOpts.
Sanitize.
has(SanitizerKind::DataFlow)) {
744 PB.registerOptimizerEarlyEPCallback(
745 [SanitizersCallback](ModulePassManager &MPM, OptimizationLevel Level) {
746 ModulePassManager NewMPM;
747 SanitizersCallback(NewMPM, Level);
748 if (!NewMPM.isEmpty()) {
750 NewMPM.addPass(RequireAnalysisPass<GlobalsAA, llvm::Module>());
751 MPM.addPass(std::move(NewMPM));
756 PB.registerOptimizerLastEPCallback(SanitizersCallback);
759 if (LowerAllowCheckPass::IsRequested()) {
763 PB.registerScalarOptimizerLateEPCallback(
764 [](FunctionPassManager &FPM, OptimizationLevel Level) {
765 FPM.addPass(LowerAllowCheckPass());
770void EmitAssemblyHelper::RunOptimizationPipeline(
771 BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
772 std::unique_ptr<llvm::ToolOutputFile> &ThinLinkOS,
BackendConsumer *BC) {
773 std::optional<PGOOptions> PGOOpt;
782 CodeGenOpts.DebugInfoForProfiling,
783 false, CodeGenOpts.AtomicProfileUpdate);
787 : PGOOptions::NoCSAction;
792 CodeGenOpts.DebugInfoForProfiling);
799 CodeGenOpts.DebugInfoForProfiling, CodeGenOpts.PseudoProbeForProfiling);
803 PGOOptions::NoAction, PGOOptions::NoCSAction,
805 else if (CodeGenOpts.PseudoProbeForProfiling)
808 PGOOptions(
"",
"",
"",
"",
nullptr,
809 PGOOptions::NoAction, PGOOptions::NoCSAction,
811 else if (CodeGenOpts.DebugInfoForProfiling)
813 PGOOpt = PGOOptions(
"",
"",
"",
"",
nullptr,
814 PGOOptions::NoAction, PGOOptions::NoCSAction,
820 "Cannot have both CSProfileUse pass and CSProfileGen pass at "
823 assert(PGOOpt->Action != PGOOptions::IRInstr &&
824 PGOOpt->Action != PGOOptions::SampleUse &&
825 "Cannot run CSProfileGen pass with ProfileGen or SampleUse "
828 ? getDefaultProfileGenName()
829 : CodeGenOpts.InstrProfileOutput;
830 PGOOpt->CSAction = PGOOptions::CSIRInstr;
832 PGOOpt = PGOOptions(
"",
834 ? getDefaultProfileGenName()
837 PGOOptions::NoAction, PGOOptions::CSIRInstr,
841 TM->setPGOOption(PGOOpt);
843 PipelineTuningOptions PTO;
844 PTO.LoopUnrolling = CodeGenOpts.UnrollLoops;
847 PTO.LoopInterleaving = CodeGenOpts.UnrollLoops;
848 PTO.LoopVectorization = CodeGenOpts.VectorizeLoop;
849 PTO.SLPVectorization = CodeGenOpts.VectorizeSLP;
850 PTO.MergeFunctions = CodeGenOpts.MergeFunctions;
853 PTO.CallGraphProfile = !CodeGenOpts.DisableIntegratedAS;
854 PTO.UnifiedLTO = CodeGenOpts.UnifiedLTO;
856 LoopAnalysisManager LAM;
857 FunctionAnalysisManager FAM;
858 CGSCCAnalysisManager CGAM;
859 ModuleAnalysisManager MAM;
861 bool DebugPassStructure = CodeGenOpts.
DebugPass ==
"Structure";
862 PassInstrumentationCallbacks PIC;
863 PrintPassOptions PrintPassOpts;
864 PrintPassOpts.Indent = DebugPassStructure;
865 PrintPassOpts.SkipAnalyses = DebugPassStructure;
866 StandardInstrumentations SI(
867 TheModule->getContext(),
868 (CodeGenOpts.DebugPassManager || DebugPassStructure),
869 CodeGenOpts.VerifyEach, PrintPassOpts);
870 SI.registerCallbacks(PIC, &MAM);
871 PassBuilder PB(TM.get(), PTO, PGOOpt, &PIC);
874 switch (CodeGenOpts.getAssignmentTrackingMode()) {
875 case CodeGenOptions::AssignmentTrackingOpts::Forced:
876 PB.registerPipelineStartEPCallback(
877 [&](ModulePassManager &MPM, OptimizationLevel Level) {
878 MPM.addPass(AssignmentTrackingPass());
881 case CodeGenOptions::AssignmentTrackingOpts::Enabled:
884 if (!CodeGenOpts.PrepareForThinLTO && !CodeGenOpts.PrepareForLTO &&
885 CodeGenOpts.getDebuggerTuning() != llvm::DebuggerKind::LLDB) {
886 PB.registerPipelineStartEPCallback(
887 [&](ModulePassManager &MPM, OptimizationLevel Level) {
889 if (Level != OptimizationLevel::O0)
890 MPM.addPass(AssignmentTrackingPass());
894 case CodeGenOptions::AssignmentTrackingOpts::Disabled:
899 DebugifyEachInstrumentation Debugify;
900 DebugInfoPerPass DebugInfoBeforePass;
901 if (CodeGenOpts.EnableDIPreservationVerify) {
902 Debugify.setDebugifyMode(DebugifyMode::OriginalDebugInfo);
903 Debugify.setDebugInfoBeforePass(DebugInfoBeforePass);
906 Debugify.setOrigDIVerifyBugsReportFilePath(
908 Debugify.registerCallbacks(PIC, MAM);
912 auto PassPlugin = PassPlugin::Load(PluginFN);
914 PassPlugin->registerPassBuilderCallbacks(PB);
916 Diags.
Report(diag::err_fe_unable_to_load_plugin)
917 << PluginFN <<
toString(PassPlugin.takeError());
922#define HANDLE_EXTENSION(Ext) \
923 get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
924#include "llvm/Support/Extension.def"
928 std::unique_ptr<TargetLibraryInfoImpl> TLII(
929 llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
930 FAM.registerPass([&] {
return TargetLibraryAnalysis(*TLII); });
933 PB.registerModuleAnalyses(MAM);
934 PB.registerCGSCCAnalyses(CGAM);
935 PB.registerFunctionAnalyses(FAM);
936 PB.registerLoopAnalyses(LAM);
937 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
939 ModulePassManager MPM;
941 if (CodeGenOpts.VerifyModule)
942 MPM.addPass(VerifierPass());
944 if (!CodeGenOpts.DisableLLVMPasses) {
949 const bool PrepareForThinLTO = CodeGenOpts.PrepareForThinLTO;
950 const bool PrepareForLTO = CodeGenOpts.PrepareForLTO;
952 if (LangOpts.ObjCAutoRefCount) {
953 PB.registerPipelineStartEPCallback(
954 [](ModulePassManager &MPM, OptimizationLevel Level) {
955 if (Level != OptimizationLevel::O0)
957 createModuleToFunctionPassAdaptor(ObjCARCExpandPass()));
959 PB.registerPipelineEarlySimplificationEPCallback(
960 [](ModulePassManager &MPM, OptimizationLevel Level) {
961 if (Level != OptimizationLevel::O0)
962 MPM.addPass(ObjCARCAPElimPass());
964 PB.registerScalarOptimizerLateEPCallback(
965 [](FunctionPassManager &FPM, OptimizationLevel Level) {
966 if (Level != OptimizationLevel::O0)
967 FPM.addPass(ObjCARCOptPass());
977 if (IsThinLTOPostLink)
978 PB.registerPipelineStartEPCallback(
979 [](ModulePassManager &MPM, OptimizationLevel Level) {
980 MPM.addPass(LowerTypeTestsPass(
nullptr,
987 if (LangOpts.
Sanitize.
has(SanitizerKind::LocalBounds))
988 PB.registerScalarOptimizerLateEPCallback(
989 [](FunctionPassManager &FPM, OptimizationLevel Level) {
990 FPM.addPass(BoundsCheckingPass());
995 if (!IsThinLTOPostLink) {
1000 if (std::optional<GCOVOptions> Options =
1002 PB.registerPipelineStartEPCallback(
1003 [Options](ModulePassManager &MPM, OptimizationLevel Level) {
1004 MPM.addPass(GCOVProfilerPass(*Options));
1006 if (std::optional<InstrProfOptions> Options =
1008 PB.registerPipelineStartEPCallback(
1009 [Options](ModulePassManager &MPM, OptimizationLevel Level) {
1010 MPM.addPass(InstrProfilingLoweringPass(*Options,
false));
1016 PB.registerOptimizerLastEPCallback(
1017 [](ModulePassManager &MPM, OptimizationLevel Level) {
1018 MPM.addPass(createModuleToFunctionPassAdaptor(MemProfilerPass()));
1019 MPM.addPass(ModuleMemProfilerPass());
1023 if (CodeGenOpts.FatLTO) {
1024 MPM.addPass(PB.buildFatLTODefaultPipeline(
1025 Level, PrepareForThinLTO,
1026 PrepareForThinLTO || shouldEmitRegularLTOSummary()));
1027 }
else if (PrepareForThinLTO) {
1028 MPM.addPass(PB.buildThinLTOPreLinkDefaultPipeline(Level));
1029 }
else if (PrepareForLTO) {
1030 MPM.addPass(PB.buildLTOPreLinkDefaultPipeline(Level));
1032 MPM.addPass(PB.buildPerModuleDefaultPipeline(Level));
1037 if (CodeGenOpts.LinkBitcodePostopt)
1046 MPM.addPass(VerifierPass());
1049 CodeGenOpts.FatLTO) {
1050 if (CodeGenOpts.PrepareForThinLTO && !CodeGenOpts.DisableLLVMPasses) {
1051 if (!TheModule->getModuleFlag(
"EnableSplitLTOUnit"))
1052 TheModule->addModuleFlag(llvm::Module::Error,
"EnableSplitLTOUnit",
1053 CodeGenOpts.EnableSplitLTOUnit);
1060 MPM.addPass(ThinLTOBitcodeWriterPass(
1061 *OS, ThinLinkOS ? &ThinLinkOS->os() :
nullptr));
1063 MPM.addPass(PrintModulePass(*OS,
"", CodeGenOpts.EmitLLVMUseLists,
1069 bool EmitLTOSummary = shouldEmitRegularLTOSummary();
1070 if (EmitLTOSummary) {
1071 if (!TheModule->getModuleFlag(
"ThinLTO") && !CodeGenOpts.UnifiedLTO)
1072 TheModule->addModuleFlag(llvm::Module::Error,
"ThinLTO",
uint32_t(0));
1073 if (!TheModule->getModuleFlag(
"EnableSplitLTOUnit"))
1074 TheModule->addModuleFlag(llvm::Module::Error,
"EnableSplitLTOUnit",
1078 MPM.addPass(BitcodeWriterPass(*OS, CodeGenOpts.EmitLLVMUseLists,
1081 MPM.addPass(PrintModulePass(*OS,
"", CodeGenOpts.EmitLLVMUseLists,
1086 if (shouldEmitUnifiedLTOModueFlag())
1087 TheModule->addModuleFlag(llvm::Module::Error,
"UnifiedLTO",
uint32_t(1));
1093 MPM.printPipeline(outs(), [&PIC](StringRef ClassName) {
1094 auto PassName = PIC.getPassNameForClassName(ClassName);
1095 return PassName.empty() ? ClassName : PassName;
1101 if (LangOpts.HIPStdPar && !LangOpts.CUDAIsDevice &&
1102 LangOpts.HIPStdParInterposeAlloc)
1103 MPM.addPass(HipStdParAllocationInterpositionPass());
1107 PrettyStackTraceString CrashInfo(
"Optimizer");
1108 llvm::TimeTraceScope TimeScope(
"Optimizer");
1109 MPM.run(*TheModule, MAM);
1113void EmitAssemblyHelper::RunCodegenPipeline(
1114 BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
1115 std::unique_ptr<llvm::ToolOutputFile> &DwoOS) {
1119 legacy::PassManager CodeGenPasses;
1127 createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
1133 if (!AddEmitPasses(CodeGenPasses, Action, *OS,
1134 DwoOS ? &DwoOS->os() :
nullptr))
1150 PrettyStackTraceString CrashInfo(
"Code generation");
1151 llvm::TimeTraceScope TimeScope(
"CodeGenPasses");
1152 CodeGenPasses.run(*TheModule);
1157 std::unique_ptr<raw_pwrite_stream> OS,
1159 TimeRegion Region(CodeGenOpts.TimePasses ? &CodeGenerationTime :
nullptr);
1163 CreateTargetMachine(RequiresCodeGen);
1165 if (RequiresCodeGen && !TM)
1168 TheModule->setDataLayout(TM->createDataLayout());
1171 cl::PrintOptionValues();
1173 std::unique_ptr<llvm::ToolOutputFile> ThinLinkOS, DwoOS;
1174 RunOptimizationPipeline(Action, OS, ThinLinkOS, BC);
1175 RunCodegenPipeline(Action, OS, DwoOS);
1187 const LangOptions &LOpts, std::unique_ptr<raw_pwrite_stream> OS,
1188 std::string SampleProfile, std::string ProfileRemapping,
1190 DenseMap<StringRef, DenseMap<GlobalValue::GUID, GlobalValueSummary *>>
1191 ModuleToDefinedGVSummaries;
1192 CombinedIndex->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries);
1199 FunctionImporter::ImportMapTy ImportList;
1200 if (!lto::initImportList(*M, *CombinedIndex, ImportList))
1203 auto AddStream = [&](
size_t Task,
const Twine &ModuleName) {
1204 return std::make_unique<CachedFileStream>(std::move(OS),
1211 handleAllErrors(std::move(
E), [&](ErrorInfoBase &EIB) {
1212 errs() <<
"Error setting up ThinLTO save-temps: " << EIB.message()
1217 Conf.CPU = TOpts.
CPU;
1221 std::optional<CodeGenOptLevel> OptLevelOrNone =
1222 CodeGenOpt::getLevel(CGOpts.OptimizationLevel);
1223 assert(OptLevelOrNone &&
"Invalid optimization level!");
1224 Conf.CGOptLevel = *OptLevelOrNone;
1225 Conf.OptLevel = CGOpts.OptimizationLevel;
1227 Conf.SampleProfile = std::move(SampleProfile);
1228 Conf.PTO.LoopUnrolling = CGOpts.UnrollLoops;
1231 Conf.PTO.LoopInterleaving = CGOpts.UnrollLoops;
1232 Conf.PTO.LoopVectorization = CGOpts.VectorizeLoop;
1233 Conf.PTO.SLPVectorization = CGOpts.VectorizeSLP;
1236 Conf.PTO.CallGraphProfile = !CGOpts.DisableIntegratedAS;
1240 Conf.RunCSIRInstr =
true;
1243 Conf.RunCSIRInstr =
false;
1247 Conf.ProfileRemapping = std::move(ProfileRemapping);
1248 Conf.DebugPassManager = CGOpts.DebugPassManager;
1249 Conf.VerifyEach = CGOpts.VerifyEach;
1250 Conf.RemarksWithHotness = CGOpts.DiagnosticsWithHotness;
1258 Conf.PreCodeGenModuleHook = [](
size_t Task,
const llvm::Module &Mod) {
1263 Conf.PreCodeGenModuleHook = [&](
size_t Task,
const llvm::Module &Mod) {
1264 M->print(*OS,
nullptr, CGOpts.EmitLLVMUseLists);
1269 Conf.PreCodeGenModuleHook = [&](
size_t Task,
const llvm::Module &Mod) {
1270 WriteBitcodeToFile(*M, *OS, CGOpts.EmitLLVMUseLists);
1279 thinBackend(Conf, -1, AddStream, *M, *CombinedIndex, ImportList,
1280 ModuleToDefinedGVSummaries[M->getModuleIdentifier()],
1282 handleAllErrors(std::move(
E), [&](ErrorInfoBase &EIB) {
1283 errs() <<
"Error running ThinLTO backend: " << EIB.message() <<
'\n';
1291 const LangOptions &LOpts, StringRef TDesc, llvm::Module *M,
1295 llvm::TimeTraceScope TimeScope(
"Backend");
1297 std::unique_ptr<llvm::Module> EmptyModule;
1302 std::unique_ptr<ModuleSummaryIndex> CombinedIndex;
1303 if (Error
E = llvm::getModuleSummaryIndexForFile(
1306 .moveInto(CombinedIndex)) {
1307 logAllUnhandledErrors(std::move(
E), errs(),
1308 "Error loading index file '" +
1316 if (CombinedIndex) {
1317 if (!CombinedIndex->skipModuleByDistributedBackend()) {
1329 EmptyModule = std::make_unique<llvm::Module>(
"empty", M->getContext());
1330 EmptyModule->setTargetTriple(M->getTargetTriple());
1331 M = EmptyModule.get();
1335 EmitAssemblyHelper AsmHelper(Diags, HeaderOpts, CGOpts, TOpts, LOpts, M, VFS);
1336 AsmHelper.EmitAssembly(Action, std::move(OS), BC);
1341 std::string DLDesc = M->getDataLayout().getStringRepresentation();
1342 if (DLDesc != TDesc) {
1345 "expected target description '%1'");
1346 Diags.
Report(DiagID) << DLDesc << TDesc;
1354 llvm::MemoryBufferRef Buf) {
1357 llvm::embedBitcodeInModule(
1369 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ObjectOrErr =
1370 llvm::MemoryBuffer::getFileOrSTDIN(OffloadObject);
1371 if (ObjectOrErr.getError()) {
1373 "could not open '%0' for embedding");
1374 Diags.
Report(DiagID) << OffloadObject;
1378 llvm::embedBufferInModule(*M, **ObjectOrErr,
".llvm.offloading",
1379 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 SanitizerBinaryMetadataOptions getSanitizerBinaryMetadataOptions(const CodeGenOptions &CGOpts)
static std::optional< GCOVOptions > getGCOVOptions(const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts)
static bool initTargetOptions(DiagnosticsEngine &Diags, llvm::TargetOptions &Options, const CodeGenOptions &CodeGenOpts, const clang::TargetOptions &TargetOpts, const LangOptions &LangOpts, const HeaderSearchOptions &HSOpts)
static void addKCFIPass(const Triple &TargetTriple, const LangOptions &LangOpts, PassBuilder &PB)
static void runThinLTOBackend(DiagnosticsEngine &Diags, ModuleSummaryIndex *CombinedIndex, llvm::Module *M, const HeaderSearchOptions &HeaderOpts, const CodeGenOptions &CGOpts, const clang::TargetOptions &TOpts, const LangOptions &LOpts, std::unique_ptr< raw_pwrite_stream > OS, std::string SampleProfile, std::string ProfileRemapping, BackendAction Action)
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)
static void setCommandLineOpts(const CodeGenOptions &CodeGenOpts)
static CodeGenFileType getCodeGenFileType(BackendAction Action)
Defines the Diagnostic-related interfaces.
Defines the clang::LangOptions interface.
This file provides a pass to link in Modules from a provided BackendConsumer.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::TargetOptions class.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
std::string OptRecordFile
The name of the file to which the backend should save YAML optimization records.
std::string InstrProfileOutput
Name of the profile file to use as output for -fprofile-instr-generate, -fprofile-generate,...
std::string BinutilsVersion
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.
std::vector< std::string > PassPlugins
List of dynamic shared object files to be loaded as pass plugins.
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::string OptRecordPasses
The regex that filters the passes that should be saved to the optimization records.
std::vector< std::string > SanitizeCoverageAllowlistFiles
Path to allowlist file specifying which objects (files, functions) should exclusively be instrumented...
std::string SaveTempsFilePrefix
Prefix to use for -save-temps output.
std::vector< std::string > SanitizeCoverageIgnorelistFiles
Path to ignorelist file specifying which objects (files, functions) listed for instrumentation by san...
bool hasSanitizeCoverage() const
bool hasProfileIRInstr() const
Check if IR level profile instrumentation is on.
bool hasProfileCSIRUse() const
Check if CSIR profile use is on.
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.
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::vector< std::string > CommandLineArgs
std::string MemoryProfileUsePath
Name of the profile file to use as input for -fmemory-profile-use.
std::string OptRecordFormat
The format used for serializing remarks (default: YAML)
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.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool hasWasmExceptions() const
bool hasSjLjExceptions() const
SanitizerSet Sanitize
Set of enabled sanitizers.
bool hasDWARFExceptions() const
bool hasSEHExceptions() const
std::vector< std::string > NoSanitizeFiles
Paths to files specifying which objects (files, functions, variables) should not be instrumented.
Options for controlling the target.
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.
Create and return a pass that links in Moduels from a provided BackendConsumer to a given primary Mod...
@ EmitAssembly
Emit a .s file.
The JSON file list parser is used to communicate input to InstallAPI.
void EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, DiagnosticsEngine &Diags)
void EmitBackendOutput(DiagnosticsEngine &Diags, const HeaderSearchOptions &, const CodeGenOptions &CGOpts, const TargetOptions &TOpts, const LangOptions &LOpts, StringRef TDesc, llvm::Module *M, BackendAction Action, llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS, std::unique_ptr< raw_pwrite_stream > OS, BackendConsumer *BC=nullptr)
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)
const FunctionProtoType * T
Diagnostic wrappers for TextAPI types for error reporting.
cl::opt< bool > PrintPipelinePasses
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.