17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/ADT/StringSwitch.h"
19 #include "llvm/Analysis/TargetLibraryInfo.h"
20 #include "llvm/Analysis/TargetTransformInfo.h"
21 #include "llvm/Bitcode/BitcodeWriterPass.h"
22 #include "llvm/CodeGen/RegAllocRegistry.h"
23 #include "llvm/CodeGen/SchedulerRegistry.h"
24 #include "llvm/IR/DataLayout.h"
25 #include "llvm/IR/FunctionInfo.h"
26 #include "llvm/IR/IRPrintingPasses.h"
27 #include "llvm/IR/LegacyPassManager.h"
28 #include "llvm/IR/Module.h"
29 #include "llvm/IR/Verifier.h"
30 #include "llvm/MC/SubtargetFeature.h"
31 #include "llvm/Object/FunctionIndexObjectFile.h"
32 #include "llvm/Support/CommandLine.h"
33 #include "llvm/Support/PrettyStackTrace.h"
34 #include "llvm/Support/TargetRegistry.h"
35 #include "llvm/Support/Timer.h"
36 #include "llvm/Support/raw_ostream.h"
37 #include "llvm/Target/TargetMachine.h"
38 #include "llvm/Target/TargetOptions.h"
39 #include "llvm/Target/TargetSubtargetInfo.h"
40 #include "llvm/Transforms/IPO.h"
41 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
42 #include "llvm/Transforms/Instrumentation.h"
43 #include "llvm/Transforms/ObjCARC.h"
44 #include "llvm/Transforms/Scalar.h"
45 #include "llvm/Transforms/Utils/SymbolRewriter.h"
47 using namespace clang;
52 class EmitAssemblyHelper {
59 Timer CodeGenerationTime;
61 mutable legacy::PassManager *CodeGenPasses;
62 mutable legacy::PassManager *PerModulePasses;
63 mutable legacy::FunctionPassManager *PerFunctionPasses;
66 TargetIRAnalysis getTargetIRAnalysis()
const {
68 return TM->getTargetIRAnalysis();
70 return TargetIRAnalysis();
73 legacy::PassManager *getCodeGenPasses()
const {
75 CodeGenPasses =
new legacy::PassManager();
77 createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
82 legacy::PassManager *getPerModulePasses()
const {
83 if (!PerModulePasses) {
84 PerModulePasses =
new legacy::PassManager();
86 createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
88 return PerModulePasses;
91 legacy::FunctionPassManager *getPerFunctionPasses()
const {
92 if (!PerFunctionPasses) {
93 PerFunctionPasses =
new legacy::FunctionPassManager(TheModule);
94 PerFunctionPasses->add(
95 createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
97 return PerFunctionPasses;
100 void CreatePasses(FunctionInfoIndex *FunctionIndex);
110 TargetMachine *CreateTargetMachine(
bool MustCreateTM);
121 : Diags(_Diags), CodeGenOpts(CGOpts), TargetOpts(TOpts), LangOpts(LOpts),
122 TheModule(M), CodeGenerationTime(
"Code Generation Time"),
123 CodeGenPasses(nullptr), PerModulePasses(nullptr),
124 PerFunctionPasses(nullptr) {}
126 ~EmitAssemblyHelper() {
127 delete CodeGenPasses;
128 delete PerModulePasses;
129 delete PerFunctionPasses;
130 if (CodeGenOpts.DisableFree)
134 std::unique_ptr<TargetMachine> TM;
141 class PassManagerBuilderWrapper :
public PassManagerBuilder {
145 : PassManagerBuilder(), CGOpts(CGOpts), LangOpts(LangOpts) {}
147 const LangOptions &getLangOpts()
const {
return LangOpts; }
156 if (Builder.OptLevel > 0)
157 PM.add(createObjCARCAPElimPass());
161 if (Builder.OptLevel > 0)
162 PM.add(createObjCARCExpandPass());
166 if (Builder.OptLevel > 0)
167 PM.add(createObjCARCOptPass());
171 legacy::PassManagerBase &PM) {
172 PM.add(createAddDiscriminatorsPass());
176 legacy::PassManagerBase &PM) {
177 PM.add(createBoundsCheckingPass());
181 legacy::PassManagerBase &PM) {
182 const PassManagerBuilderWrapper &BuilderWrapper =
183 static_cast<const PassManagerBuilderWrapper&
>(
Builder);
185 SanitizerCoverageOptions Opts;
187 static_cast<SanitizerCoverageOptions::Type
>(CGOpts.SanitizeCoverageType);
188 Opts.IndirectCalls = CGOpts.SanitizeCoverageIndirectCalls;
189 Opts.TraceBB = CGOpts.SanitizeCoverageTraceBB;
190 Opts.TraceCmp = CGOpts.SanitizeCoverageTraceCmp;
191 Opts.Use8bitCounters = CGOpts.SanitizeCoverage8bitCounters;
192 PM.add(createSanitizerCoverageModulePass(Opts));
196 legacy::PassManagerBase &PM) {
197 const PassManagerBuilderWrapper &BuilderWrapper =
198 static_cast<const PassManagerBuilderWrapper&
>(
Builder);
201 PM.add(createAddressSanitizerFunctionPass(
false, Recover));
202 PM.add(createAddressSanitizerModulePass(
false, Recover));
206 legacy::PassManagerBase &PM) {
207 PM.add(createAddressSanitizerFunctionPass(
true,
209 PM.add(createAddressSanitizerModulePass(
true,
214 legacy::PassManagerBase &PM) {
215 const PassManagerBuilderWrapper &BuilderWrapper =
216 static_cast<const PassManagerBuilderWrapper&
>(
Builder);
218 PM.add(createMemorySanitizerPass(CGOpts.SanitizeMemoryTrackOrigins));
223 if (Builder.OptLevel > 0) {
224 PM.add(createEarlyCSEPass());
225 PM.add(createReassociatePass());
226 PM.add(createLICMPass());
227 PM.add(createGVNPass());
228 PM.add(createInstructionCombiningPass());
229 PM.add(createDeadStoreEliminationPass());
234 legacy::PassManagerBase &PM) {
235 PM.add(createThreadSanitizerPass());
239 legacy::PassManagerBase &PM) {
240 const PassManagerBuilderWrapper &BuilderWrapper =
241 static_cast<const PassManagerBuilderWrapper&
>(
Builder);
242 const LangOptions &LangOpts = BuilderWrapper.getLangOpts();
246 static TargetLibraryInfoImpl *
createTLII(llvm::Triple &TargetTriple,
248 TargetLibraryInfoImpl *TLII =
new TargetLibraryInfoImpl(TargetTriple);
249 if (!CodeGenOpts.SimplifyLibCalls)
250 TLII->disableAllFunctions();
255 if (TLII->getLibFunc(FuncName, F))
256 TLII->setUnavailable(F);
259 switch (CodeGenOpts.getVecLib()) {
261 TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate);
270 legacy::PassManager *MPM) {
271 llvm::SymbolRewriter::RewriteDescriptorList DL;
273 llvm::SymbolRewriter::RewriteMapParser MapParser;
275 MapParser.parse(MapFile, &DL);
277 MPM->add(createRewriteSymbolsPass(DL));
280 void EmitAssemblyHelper::CreatePasses(FunctionInfoIndex *FunctionIndex) {
281 if (CodeGenOpts.DisableLLVMPasses)
284 unsigned OptLevel = CodeGenOpts.OptimizationLevel;
289 if (CodeGenOpts.DisableLLVMOpts) {
291 Inlining = CodeGenOpts.NoInlining;
294 PassManagerBuilderWrapper PMBuilder(CodeGenOpts, LangOpts);
297 Triple TargetTriple(TheModule->getTargetTriple());
298 PMBuilder.LibraryInfo =
createTLII(TargetTriple, CodeGenOpts);
305 createFunctionInliningPass(OptLevel, CodeGenOpts.OptimizeSize);
312 PMBuilder.Inliner = createAlwaysInlinerPass(
false);
314 PMBuilder.Inliner = createAlwaysInlinerPass();
318 PMBuilder.OptLevel = OptLevel;
319 PMBuilder.SizeLevel = CodeGenOpts.OptimizeSize;
320 PMBuilder.BBVectorize = CodeGenOpts.VectorizeBB;
321 PMBuilder.SLPVectorize = CodeGenOpts.VectorizeSLP;
322 PMBuilder.LoopVectorize = CodeGenOpts.VectorizeLoop;
324 PMBuilder.DisableUnitAtATime = !CodeGenOpts.UnitAtATime;
325 PMBuilder.DisableUnrollLoops = !CodeGenOpts.UnrollLoops;
326 PMBuilder.MergeFunctions = CodeGenOpts.MergeFunctions;
327 PMBuilder.PrepareForLTO = CodeGenOpts.PrepareForLTO;
328 PMBuilder.RerollLoops = CodeGenOpts.RerollLoops;
330 legacy::PassManager *MPM = getPerModulePasses();
335 PMBuilder.FunctionIndex = FunctionIndex;
336 PMBuilder.populateLTOPassManager(*MPM);
340 PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
344 if (LangOpts.ObjCAutoRefCount) {
345 PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,
347 PMBuilder.addExtension(PassManagerBuilder::EP_ModuleOptimizerEarly,
349 PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
353 if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds)) {
354 PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
356 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
360 if (CodeGenOpts.SanitizeCoverageType ||
361 CodeGenOpts.SanitizeCoverageIndirectCalls ||
362 CodeGenOpts.SanitizeCoverageTraceCmp) {
363 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
365 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
369 if (LangOpts.Sanitize.has(SanitizerKind::Address)) {
370 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
372 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
376 if (LangOpts.Sanitize.has(SanitizerKind::KernelAddress)) {
377 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
379 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
383 if (LangOpts.Sanitize.has(SanitizerKind::Memory)) {
384 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
386 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
390 if (LangOpts.Sanitize.has(SanitizerKind::Thread)) {
391 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
393 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
397 if (LangOpts.Sanitize.has(SanitizerKind::DataFlow)) {
398 PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
400 PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
405 legacy::FunctionPassManager *FPM = getPerFunctionPasses();
406 if (CodeGenOpts.VerifyModule)
407 FPM->add(createVerifierPass());
408 PMBuilder.populateFunctionPassManager(*FPM);
411 if (!CodeGenOpts.RewriteMapFiles.empty())
414 if (!CodeGenOpts.DisableGCov &&
415 (CodeGenOpts.EmitGcovArcs || CodeGenOpts.EmitGcovNotes)) {
419 Options.EmitNotes = CodeGenOpts.EmitGcovNotes;
420 Options.EmitData = CodeGenOpts.EmitGcovArcs;
421 memcpy(Options.Version, CodeGenOpts.CoverageVersion, 4);
422 Options.UseCfgChecksum = CodeGenOpts.CoverageExtraChecksum;
423 Options.NoRedZone = CodeGenOpts.DisableRedZone;
424 Options.FunctionNamesInData =
425 !CodeGenOpts.CoverageNoFunctionNamesInData;
426 Options.ExitBlockBeforeBody = CodeGenOpts.CoverageExitBlockBeforeBody;
427 MPM->add(createGCOVProfilerPass(Options));
429 MPM->add(createStripSymbolsPass(
true));
432 if (CodeGenOpts.ProfileInstrGenerate) {
434 Options.NoRedZone = CodeGenOpts.DisableRedZone;
435 Options.InstrProfileOutput = CodeGenOpts.InstrProfileOutput;
436 MPM->add(createInstrProfilingPass(Options));
439 if (!CodeGenOpts.SampleProfileFile.empty())
440 MPM->add(createSampleProfileLoaderPass(CodeGenOpts.SampleProfileFile));
442 PMBuilder.populateModulePassManager(*MPM);
445 TargetMachine *EmitAssemblyHelper::CreateTargetMachine(
bool MustCreateTM) {
448 std::string Triple = TheModule->getTargetTriple();
449 const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
452 Diags.Report(diag::err_fe_unable_to_create_target) <<
Error;
457 llvm::StringSwitch<unsigned>(CodeGenOpts.CodeModel)
458 .Case(
"small", llvm::CodeModel::Small)
459 .Case(
"kernel", llvm::CodeModel::Kernel)
460 .Case(
"medium", llvm::CodeModel::Medium)
461 .Case(
"large", llvm::CodeModel::Large)
462 .Case(
"default", llvm::CodeModel::Default)
464 assert(CodeModel != ~0u &&
"invalid code model!");
465 llvm::CodeModel::Model CM =
static_cast<llvm::CodeModel::Model
>(CodeModel);
468 BackendArgs.push_back(
"clang");
469 if (!CodeGenOpts.DebugPass.empty()) {
470 BackendArgs.push_back(
"-debug-pass");
471 BackendArgs.push_back(CodeGenOpts.DebugPass.c_str());
473 if (!CodeGenOpts.LimitFloatPrecision.empty()) {
474 BackendArgs.push_back(
"-limit-float-precision");
475 BackendArgs.push_back(CodeGenOpts.LimitFloatPrecision.c_str());
477 for (
const std::string &BackendOption : CodeGenOpts.BackendOptions)
478 BackendArgs.push_back(BackendOption.c_str());
479 BackendArgs.push_back(
nullptr);
480 llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1,
483 std::string FeaturesStr =
484 llvm::join(TargetOpts.Features.begin(), TargetOpts.Features.end(),
",");
487 llvm::Reloc::Model RM = llvm::Reloc::Default;
488 if (CodeGenOpts.RelocationModel ==
"static") {
489 RM = llvm::Reloc::Static;
490 }
else if (CodeGenOpts.RelocationModel ==
"pic") {
491 RM = llvm::Reloc::PIC_;
493 assert(CodeGenOpts.RelocationModel ==
"dynamic-no-pic" &&
494 "Invalid PIC model!");
495 RM = llvm::Reloc::DynamicNoPIC;
499 switch (CodeGenOpts.OptimizationLevel) {
502 case 3: OptLevel = CodeGenOpt::Aggressive;
break;
507 if (!TargetOpts.Reciprocals.empty())
508 Options.Reciprocals = TargetRecip(TargetOpts.Reciprocals);
510 Options.ThreadModel =
511 llvm::StringSwitch<llvm::ThreadModel::Model>(CodeGenOpts.ThreadModel)
512 .Case(
"posix", llvm::ThreadModel::POSIX)
513 .Case(
"single", llvm::ThreadModel::Single);
516 assert((CodeGenOpts.FloatABI ==
"soft" || CodeGenOpts.FloatABI ==
"softfp" ||
517 CodeGenOpts.FloatABI ==
"hard" || CodeGenOpts.FloatABI.empty()) &&
518 "Invalid Floating Point ABI!");
519 Options.FloatABIType =
520 llvm::StringSwitch<llvm::FloatABI::ABIType>(CodeGenOpts.FloatABI)
521 .Case(
"soft", llvm::FloatABI::Soft)
522 .Case(
"softfp", llvm::FloatABI::Soft)
523 .Case(
"hard", llvm::FloatABI::Hard)
524 .Default(llvm::FloatABI::Default);
527 switch (CodeGenOpts.getFPContractMode()) {
529 Options.AllowFPOpFusion = llvm::FPOpFusion::Strict;
532 Options.AllowFPOpFusion = llvm::FPOpFusion::Standard;
535 Options.AllowFPOpFusion = llvm::FPOpFusion::Fast;
539 Options.UseInitArray = CodeGenOpts.UseInitArray;
540 Options.DisableIntegratedAS = CodeGenOpts.DisableIntegratedAS;
541 Options.CompressDebugSections = CodeGenOpts.CompressDebugSections;
544 Options.EABIVersion = llvm::StringSwitch<llvm::EABI>(CodeGenOpts.EABIVersion)
545 .Case(
"4", llvm::EABI::EABI4)
546 .Case(
"5", llvm::EABI::EABI5)
547 .Case(
"gnu", llvm::EABI::GNU)
548 .Default(llvm::EABI::Default);
550 Options.LessPreciseFPMADOption = CodeGenOpts.LessPreciseFPMAD;
551 Options.NoInfsFPMath = CodeGenOpts.NoInfsFPMath;
552 Options.NoNaNsFPMath = CodeGenOpts.NoNaNsFPMath;
553 Options.NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
554 Options.UnsafeFPMath = CodeGenOpts.UnsafeFPMath;
555 Options.StackAlignmentOverride = CodeGenOpts.StackAlignment;
556 Options.PositionIndependentExecutable = LangOpts.PIELevel != 0;
557 Options.FunctionSections = CodeGenOpts.FunctionSections;
558 Options.DataSections = CodeGenOpts.DataSections;
559 Options.UniqueSectionNames = CodeGenOpts.UniqueSectionNames;
560 Options.EmulatedTLS = CodeGenOpts.EmulatedTLS;
561 switch (CodeGenOpts.getDebuggerTuning()) {
563 Options.DebuggerTuning = llvm::DebuggerKind::GDB;
566 Options.DebuggerTuning = llvm::DebuggerKind::LLDB;
569 Options.DebuggerTuning = llvm::DebuggerKind::SCE;
575 Options.MCOptions.MCRelaxAll = CodeGenOpts.RelaxAll;
576 Options.MCOptions.MCSaveTempLabels = CodeGenOpts.SaveTempLabels;
577 Options.MCOptions.MCUseDwarfDirectory = !CodeGenOpts.NoDwarfDirectoryAsm;
578 Options.MCOptions.MCNoExecStack = CodeGenOpts.NoExecStack;
579 Options.MCOptions.MCIncrementalLinkerCompatible =
580 CodeGenOpts.IncrementalLinkerCompatible;
581 Options.MCOptions.MCFatalWarnings = CodeGenOpts.FatalWarnings;
582 Options.MCOptions.AsmVerbose = CodeGenOpts.AsmVerbose;
583 Options.MCOptions.ABIName = TargetOpts.ABI;
585 TargetMachine *TM = TheTarget->createTargetMachine(Triple, TargetOpts.CPU,
586 FeaturesStr, Options,
593 raw_pwrite_stream &OS) {
596 legacy::PassManager *PM = getCodeGenPasses();
599 llvm::Triple TargetTriple(TheModule->getTargetTriple());
600 std::unique_ptr<TargetLibraryInfoImpl> TLII(
602 PM->add(
new TargetLibraryInfoWrapperPass(*TLII));
606 TargetMachine::CodeGenFileType CGFT = TargetMachine::CGFT_AssemblyFile;
608 CGFT = TargetMachine::CGFT_ObjectFile;
610 CGFT = TargetMachine::CGFT_Null;
617 if (CodeGenOpts.OptimizationLevel > 0)
618 PM->add(createObjCARCContractPass());
620 if (TM->addPassesToEmitFile(*PM, OS, CGFT,
621 !CodeGenOpts.VerifyModule)) {
622 Diags.Report(diag::err_fe_unable_to_interface_with_target);
630 raw_pwrite_stream *OS) {
631 TimeRegion Region(llvm::TimePassesIsEnabled ? &CodeGenerationTime :
nullptr);
637 TM.reset(CreateTargetMachine(UsesCodeGen));
639 if (UsesCodeGen && !TM)
642 TheModule->setDataLayout(TM->createDataLayout());
647 std::unique_ptr<FunctionInfoIndex> FunctionIndex;
648 if (!CodeGenOpts.ThinLTOIndexFile.empty()) {
649 ErrorOr<std::unique_ptr<FunctionInfoIndex>> IndexOrErr =
650 llvm::getFunctionIndexForFile(CodeGenOpts.ThinLTOIndexFile,
651 [&](
const DiagnosticInfo &DI) {
652 TheModule->getContext().diagnose(DI);
654 if (std::error_code EC = IndexOrErr.getError()) {
655 std::string Error = EC.message();
656 errs() <<
"Error loading index file '" << CodeGenOpts.ThinLTOIndexFile
657 <<
"': " << Error <<
"\n";
660 FunctionIndex = std::move(IndexOrErr.get());
661 assert(FunctionIndex &&
"Expected non-empty function index");
664 CreatePasses(FunctionIndex.get());
671 getPerModulePasses()->add(createBitcodeWriterPass(
672 *OS, CodeGenOpts.EmitLLVMUseLists, CodeGenOpts.EmitFunctionSummary));
676 getPerModulePasses()->add(
677 createPrintModulePass(*OS,
"", CodeGenOpts.EmitLLVMUseLists));
681 if (!AddEmitPasses(Action, *OS))
686 cl::PrintOptionValues();
691 if (PerFunctionPasses) {
692 PrettyStackTraceString CrashInfo(
"Per-function optimization");
694 PerFunctionPasses->doInitialization();
695 for (Function &F : *TheModule)
696 if (!F.isDeclaration())
697 PerFunctionPasses->run(F);
698 PerFunctionPasses->doFinalization();
701 if (PerModulePasses) {
702 PrettyStackTraceString CrashInfo(
"Per-module optimization passes");
703 PerModulePasses->run(*TheModule);
707 PrettyStackTraceString CrashInfo(
"Code generation");
708 CodeGenPasses->run(*TheModule);
717 raw_pwrite_stream *OS) {
718 EmitAssemblyHelper AsmHelper(Diags, CGOpts, TOpts, LOpts, M);
720 AsmHelper.EmitAssembly(Action, OS);
724 if (AsmHelper.TM && !TDesc.empty()) {
725 std::string DLDesc = M->getDataLayout().getStringRepresentation();
726 if (DLDesc != TDesc) {
729 "expected target description '%1'");
730 Diags.
Report(DiagID) << DLDesc << TDesc;
static void addObjCARCExpandPass(const PassManagerBuilder &Builder, PassManagerBase &PM)
Emit human-readable LLVM assembly.
Run CodeGen, but don't emit anything.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
static void addAddressSanitizerPasses(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
std::vector< std::string > RewriteMapFiles
Set of files definining the rules for the symbol rewriting.
Don't emit anything (benchmarking mode)
Options for controlling the target.
SanitizerSet SanitizeRecover
Set of sanitizer checks that are non-fatal (i.e.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Describes a module or submodule.
void EmitBackendOutput(DiagnosticsEngine &Diags, const CodeGenOptions &CGOpts, const TargetOptions &TOpts, const LangOptions &LOpts, StringRef TDesc, llvm::Module *M, BackendAction Action, raw_pwrite_stream *OS)
Concrete class used by the front-end to report problems and issues.
static void addThreadSanitizerPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
static void addSanitizerCoveragePass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
Defines the clang::LangOptions interface.
static void addObjCARCAPElimPass(const PassManagerBuilder &Builder, PassManagerBase &PM)
static TargetLibraryInfoImpl * createTLII(llvm::Triple &TargetTriple, const CodeGenOptions &CodeGenOpts)
Emit native object files.
Emit native assembly files.
const MatchFinder::MatchFinderOptions & Options
static void addKernelAddressSanitizerPasses(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
static void addSymbolRewriterPass(const CodeGenOptions &Opts, legacy::PassManager *MPM)
const std::vector< std::string > & getNoBuiltinFuncs() const
static void addDataFlowSanitizerPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
Defines the clang::TargetOptions class.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
Defines the Diagnostic-related interfaces.
void BuryPointer(const void *Ptr)
static void addBoundsCheckingPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
static void addObjCARCOptPass(const PassManagerBuilder &Builder, PassManagerBase &PM)
BoundNodesTreeBuilder *const Builder
static void addAddDiscriminatorsPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)
std::vector< std::string > SanitizerBlacklistFiles
Paths to blacklist files specifying which objects (files, functions, variables) should not be instrum...
static void addMemorySanitizerPass(const PassManagerBuilder &Builder, legacy::PassManagerBase &PM)