[flang-commits] [clang] [flang] [lld] [llvm] [polly] [Option] Make Passes, Scalar, Instrumentation, and CGData options per-context (PR #232599)
via flang-commits
flang-commits at lists.llvm.org
Thu Oct 15 22:33:34 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld
Author: Fangrui Song (MaskRay)
<details>
<summary>Changes</summary>
Follow-up to #<!-- -->232365: drop `perContext = false` from PassesOptions,
ScalarOptions, InstrumentationOptions, and CGDataOptions.
* IR passes read their LLVMContext's options in run(). Legacy passes
that chose analyses from an option now always require them
(ConstantHoisting, StructurizeCFG, GVN).
* Pass parameters that an option overrides are combined in run(), so
-print-pipeline-passes no longer folds such options (e.g.
-bonus-inst-threshold) into the printed parameters.
* PipelineTuningOptions carries the library options to PassBuilder,
which falls back to the TargetMachine's. opt, clang, flang, and Polly
pass their module's.
* The CodeGenData singleton is configured by its first caller. lld and
llvm-cgdata pass an empty context.
* GCOVOptions::getDefault is removed.
LLM-aided
---
Patch is 222.08 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/232599.diff
115 Files Affected:
- (modified) clang/lib/CodeGen/BackendUtil.cpp (+29-19)
- (modified) flang/lib/Frontend/FrontendActions.cpp (+4-2)
- (modified) lld/MachO/Driver.cpp (+2-1)
- (modified) llvm/include/llvm/CGData/CodeGenData.h (+33-16)
- (modified) llvm/include/llvm/CGData/CodeGenDataReader.h (+9-4)
- (modified) llvm/include/llvm/CGData/StableFunctionMap.h (+6-1)
- (modified) llvm/include/llvm/CGData/StableFunctionMapRecord.h (+4-1)
- (modified) llvm/include/llvm/Frontend/Driver/CodeGenOptions.h (+5-1)
- (modified) llvm/include/llvm/Passes/PassBuilder.h (+22-3)
- (modified) llvm/include/llvm/Passes/StandardInstrumentations.h (+24-7)
- (modified) llvm/include/llvm/Transforms/Instrumentation/AddressSanitizerCommon.h (+2-1)
- (modified) llvm/include/llvm/Transforms/Instrumentation/ControlHeightReduction.h (+7-1)
- (modified) llvm/include/llvm/Transforms/Instrumentation/GCOVProfiler.h (+3-2)
- (modified) llvm/include/llvm/Transforms/Instrumentation/InstrProfiling.h (+5-1)
- (modified) llvm/include/llvm/Transforms/Instrumentation/LowerAllowCheckPass.h (+6-1)
- (modified) llvm/include/llvm/Transforms/Instrumentation/MemorySanitizer.h (+6)
- (modified) llvm/include/llvm/Transforms/Instrumentation/PGOCtxProfLowering.h (+5-1)
- (modified) llvm/include/llvm/Transforms/Instrumentation/PGOInstrumentation.h (+4-2)
- (modified) llvm/include/llvm/Transforms/Scalar/ConstantHoisting.h (+2)
- (modified) llvm/include/llvm/Transforms/Scalar/LICM.h (+17-11)
- (modified) llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h (+8-2)
- (modified) llvm/include/llvm/Transforms/Scalar/Reassociate.h (+1)
- (modified) llvm/include/llvm/Transforms/Scalar/SpeculativeExecution.h (+3)
- (modified) llvm/include/llvm/Transforms/Utils/Instrumentation.h (-2)
- (modified) llvm/lib/CGData/CGDataOptions.td (+1-1)
- (modified) llvm/lib/CGData/CodeGenData.cpp (+17-12)
- (modified) llvm/lib/CGData/CodeGenDataReader.cpp (+11-7)
- (modified) llvm/lib/CGData/StableFunctionMap.cpp (+6-4)
- (modified) llvm/lib/CodeGen/GlobalMergeFunctions.cpp (+8-4)
- (modified) llvm/lib/CodeGen/MachineOutliner.cpp (+8-4)
- (modified) llvm/lib/Frontend/Driver/CodeGenOptions.cpp (+4-3)
- (modified) llvm/lib/LTO/LTO.cpp (+3-2)
- (modified) llvm/lib/Passes/PassBuilder.cpp (+11-6)
- (modified) llvm/lib/Passes/PassBuilderPipelines.cpp (+15-9)
- (modified) llvm/lib/Passes/PassesOptions.td (+1-1)
- (modified) llvm/lib/Passes/RunCodeGen.cpp (+4-3)
- (modified) llvm/lib/Passes/StandardInstrumentations.cpp (+38-44)
- (modified) llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp (+2-2)
- (modified) llvm/lib/Target/X86/X86MCInstLower.cpp (+2-1)
- (modified) llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp (+7-4)
- (modified) llvm/lib/Transforms/Instrumentation/AllocToken.cpp (+3-1)
- (modified) llvm/lib/Transforms/Instrumentation/BoundsChecking.cpp (+8-7)
- (modified) llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp (+25-17)
- (modified) llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp (+3-2)
- (modified) llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp (+4-5)
- (modified) llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp (+2-1)
- (modified) llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp (+2-1)
- (modified) llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp (+10-6)
- (modified) llvm/lib/Transforms/Instrumentation/InstrumentationOptions.td (+1-1)
- (modified) llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp (+6-3)
- (modified) llvm/lib/Transforms/Instrumentation/MemProfInstrumentation.cpp (+5-2)
- (modified) llvm/lib/Transforms/Instrumentation/MemProfUse.cpp (+6-3)
- (modified) llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp (+37-14)
- (modified) llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp (+3-1)
- (modified) llvm/lib/Transforms/Instrumentation/PGOCtxProfLowering.cpp (+7-3)
- (modified) llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp (+27-17)
- (modified) llvm/lib/Transforms/Instrumentation/PGOMemOPSizeOpt.cpp (+3-2)
- (modified) llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp (+3-2)
- (modified) llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp (+2-1)
- (modified) llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp (+2-1)
- (modified) llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp (+2-1)
- (modified) llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc (+4-2)
- (modified) llvm/lib/Transforms/Scalar/ADCE.cpp (+7-5)
- (modified) llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp (+9-6)
- (modified) llvm/lib/Transforms/Scalar/ConstantHoisting.cpp (+10-7)
- (modified) llvm/lib/Transforms/Scalar/ConstraintElimination.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp (+7-5)
- (modified) llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/EarlyCSE.cpp (+20-9)
- (modified) llvm/lib/Transforms/Scalar/ExpandMemCmp.cpp (+7-6)
- (modified) llvm/lib/Transforms/Scalar/Float2Int.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/GVN.cpp (+38-44)
- (modified) llvm/lib/Transforms/Scalar/GVNHoist.cpp (+6-4)
- (modified) llvm/lib/Transforms/Scalar/GuardWidening.cpp (+17-11)
- (modified) llvm/lib/Transforms/Scalar/IndVarSimplify.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/JumpTableToSwitch.cpp (+5-3)
- (modified) llvm/lib/Transforms/Scalar/JumpThreading.cpp (+1-1)
- (modified) llvm/lib/Transforms/Scalar/LICM.cpp (+40-38)
- (modified) llvm/lib/Transforms/Scalar/LoopDataPrefetch.cpp (+10-6)
- (modified) llvm/lib/Transforms/Scalar/LoopDeletion.cpp (+5-1)
- (modified) llvm/lib/Transforms/Scalar/LoopDistribute.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/LoopFlatten.cpp (+5-3)
- (modified) llvm/lib/Transforms/Scalar/LoopFuse.cpp (+3-1)
- (modified) llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp (+8-6)
- (modified) llvm/lib/Transforms/Scalar/LoopInterchange.cpp (+7-5)
- (modified) llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/LoopPredication.cpp (+7-5)
- (modified) llvm/lib/Transforms/Scalar/LoopRotation.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp (+6-3)
- (modified) llvm/lib/Transforms/Scalar/LoopSink.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/LoopUnrollAndJamPass.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp (+16-6)
- (modified) llvm/lib/Transforms/Scalar/LoopVersioningLICM.cpp (+3-2)
- (modified) llvm/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp (+17-13)
- (modified) llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp (+54-53)
- (modified) llvm/lib/Transforms/Scalar/NewGVN.cpp (+7-7)
- (modified) llvm/lib/Transforms/Scalar/PlaceSafepoints.cpp (+7-6)
- (modified) llvm/lib/Transforms/Scalar/Reassociate.cpp (+5-1)
- (modified) llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/SROA.cpp (+1-1)
- (modified) llvm/lib/Transforms/Scalar/ScalarOptions.td (+1-1)
- (modified) llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp (+2-1)
- (modified) llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp (+10-13)
- (modified) llvm/lib/Transforms/Scalar/SpeculativeExecution.cpp (+7-11)
- (modified) llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp (+12-6)
- (modified) llvm/lib/Transforms/Scalar/StructurizeCFG.cpp (+20-19)
- (modified) llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp (+2-1)
- (modified) llvm/tools/llvm-cgdata/llvm-cgdata.cpp (+6-3)
- (modified) llvm/tools/opt/NewPMDriver.cpp (+1-1)
- (modified) llvm/unittests/CGData/StableFunctionMapTest.cpp (+4-3)
- (modified) polly/lib/Support/RegisterPasses.cpp (+25-18)
- (modified) polly/lib/Transform/ScopInliner.cpp (+1-1)
``````````diff
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index 77c53c612df8f1..1ffcf7d7f6b0a7 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -144,10 +144,13 @@ extern llvm::cl::opt<bool> ClSanitizeGuardChecks;
}
// Path and name of file used for profile generation
-static std::string getProfileGenName(const CodeGenOptions &CodeGenOpts) {
- std::string FileName = CodeGenOpts.InstrProfileOutput.empty()
- ? llvm::driver::getDefaultProfileGenName()
- : CodeGenOpts.InstrProfileOutput;
+static std::string
+getProfileGenName(const cl::LibraryOptionsContext &LibraryOptions,
+ const CodeGenOptions &CodeGenOpts) {
+ std::string FileName =
+ CodeGenOpts.InstrProfileOutput.empty()
+ ? llvm::driver::getDefaultProfileGenName(LibraryOptions)
+ : CodeGenOpts.InstrProfileOutput;
if (CodeGenOpts.ContinuousProfileSync)
FileName = "%c" + FileName;
return FileName;
@@ -529,8 +532,8 @@ getGCOVOptions(const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts) {
if (CodeGenOpts.CoverageNotesFile.empty() &&
CodeGenOpts.CoverageDataFile.empty())
return std::nullopt;
- // Not using 'GCOVOptions::getDefault' allows us to avoid exiting if
- // LLVM's -default-gcov-version flag is set to something invalid.
+ // Not using GCOVProfilerPass's default options allows us to avoid exiting
+ // if LLVM's -default-gcov-version flag is set to something invalid.
GCOVOptions Options;
Options.EmitNotes = !CodeGenOpts.CoverageNotesFile.empty();
Options.EmitData = !CodeGenOpts.CoverageDataFile.empty();
@@ -773,7 +776,8 @@ static void addSanitizers(const Triple &TargetTriple,
}
}
-void addLowerAllowCheckPass(const CodeGenOptions &CodeGenOpts,
+void addLowerAllowCheckPass(const cl::LibraryOptionsContext &LibraryOptions,
+ const CodeGenOptions &CodeGenOpts,
const LangOptions &LangOpts, PassBuilder &PB) {
// SanitizeSkipHotCutoffs: doubles with range [0, 1]
// Opts.cutoffs: unsigned ints with range [0, 1000000]
@@ -788,8 +792,9 @@ void addLowerAllowCheckPass(const CodeGenOptions &CodeGenOpts,
SanitizerKind::KernelMemory | SanitizerKind::HWAddress |
SanitizerKind::KernelHWAddress);
- // TODO: remove IsRequested()
- if (LowerAllowCheckPass::IsRequested() || ScaledCutoffs.has_value() ||
+ // TODO: remove isRequested()
+ if (LowerAllowCheckPass::isRequested(LibraryOptions) ||
+ ScaledCutoffs.has_value() ||
CodeGenOpts.AllowRuntimeCheckSkipHotCutoff.has_value() ||
LowerAllowSanitize) {
// We want to call it after inline, which is about OptimizerEarlyEPCallback.
@@ -798,7 +803,7 @@ void addLowerAllowCheckPass(const CodeGenOptions &CodeGenOpts,
ModulePassManager &MPM, OptimizationLevel Level,
ThinOrFullLTOPhase Phase) {
LowerAllowCheckPass::Options Opts;
- // TODO: after removing IsRequested(), make this unconditional
+ // TODO: after removing isRequested(), make this unconditional
if (ScaledCutoffs.has_value())
Opts.cutoffs = ScaledCutoffs.value();
Opts.runtime_check = AllowRuntimeCheckSkipHotCutoff;
@@ -843,11 +848,13 @@ static void addAMDGCNSPIRVSizeOptimizationPasses(ModulePassManager &MPM) {
void EmitAssemblyHelper::RunOptimizationPipeline(
BackendAction Action, std::unique_ptr<raw_pwrite_stream> &OS,
std::unique_ptr<llvm::ToolOutputFile> &ThinLinkOS, BackendConsumer *BC) {
+ const cl::LibraryOptionsContext &LibraryOptions =
+ TheModule->getContext().getLibraryOptions();
std::optional<PGOOptions> PGOOpt;
if (CodeGenOpts.hasProfileIRInstr())
// -fprofile-generate.
- PGOOpt = PGOOptions(getProfileGenName(CodeGenOpts), "", "",
+ PGOOpt = PGOOptions(getProfileGenName(LibraryOptions, CodeGenOpts), "", "",
CodeGenOpts.MemoryProfileUsePath, PGOOptions::IRInstr,
PGOOptions::NoCSAction, ClPGOColdFuncAttr,
CodeGenOpts.DebugInfoForProfiling,
@@ -894,18 +901,18 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
PGOOpt->Action != PGOOptions::SampleUse &&
"Cannot run CSProfileGen pass with ProfileGen or SampleUse "
" pass");
- PGOOpt->CSProfileGenFile = getProfileGenName(CodeGenOpts);
+ PGOOpt->CSProfileGenFile = getProfileGenName(LibraryOptions, CodeGenOpts);
PGOOpt->CSAction = PGOOptions::CSIRInstr;
} else
- PGOOpt = PGOOptions("", getProfileGenName(CodeGenOpts), "",
- /*MemoryProfile=*/"", PGOOptions::NoAction,
- PGOOptions::CSIRInstr, ClPGOColdFuncAttr,
- CodeGenOpts.DebugInfoForProfiling);
+ PGOOpt = PGOOptions(
+ "", getProfileGenName(LibraryOptions, CodeGenOpts), "",
+ /*MemoryProfile=*/"", PGOOptions::NoAction, PGOOptions::CSIRInstr,
+ ClPGOColdFuncAttr, CodeGenOpts.DebugInfoForProfiling);
}
if (TM)
TM->setPGOOption(PGOOpt);
- PipelineTuningOptions PTO;
+ PipelineTuningOptions PTO(&LibraryOptions);
PTO.LoopUnrolling = CodeGenOpts.UnrollLoops;
PTO.LoopInterchange = CodeGenOpts.InterchangeLoops;
PTO.LoopFusion = CodeGenOpts.FuseLoops;
@@ -1086,7 +1093,7 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
// Most sanitizers only run during PreLink stage.
addSanitizers(TargetTriple, CodeGenOpts, LangOpts, PB);
addKCFIPass(TargetTriple, LangOpts, PB);
- addLowerAllowCheckPass(CodeGenOpts, LangOpts, PB);
+ addLowerAllowCheckPass(LibraryOptions, CodeGenOpts, LangOpts, PB);
PB.registerPipelineStartEPCallback(
[&](ModulePassManager &MPM, OptimizationLevel Level) {
@@ -1378,6 +1385,9 @@ runThinLTOBackend(CompilerInstance &CI, ModuleSummaryIndex *CombinedIndex,
Conf.OptLevel = CGOpts.OptimizationLevel;
initTargetOptions(CI, Diags, Conf.Options);
Conf.SampleProfile = std::move(SampleProfile);
+ const cl::LibraryOptionsContext &LibraryOptions =
+ M->getContext().getLibraryOptions();
+ Conf.PTO = PipelineTuningOptions(&LibraryOptions);
Conf.PTO.LoopUnrolling = CGOpts.UnrollLoops;
Conf.PTO.LoopInterchange = CGOpts.InterchangeLoops;
Conf.PTO.LoopFusion = CGOpts.FuseLoops;
@@ -1393,7 +1403,7 @@ runThinLTOBackend(CompilerInstance &CI, ModuleSummaryIndex *CombinedIndex,
// Context sensitive profile.
if (CGOpts.hasProfileCSIRInstr()) {
Conf.RunCSIRInstr = true;
- Conf.CSIRProfile = getProfileGenName(CGOpts);
+ Conf.CSIRProfile = getProfileGenName(LibraryOptions, CGOpts);
} else if (CGOpts.hasProfileCSIRUse()) {
Conf.RunCSIRInstr = false;
Conf.CSIRProfile = std::move(CGOpts.ProfileInstrumentUsePath);
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index b8b8b426dfe86d..21170893e6e898 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -974,14 +974,16 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
// Create the pass manager builder.
llvm::PassInstrumentationCallbacks pic;
- llvm::PipelineTuningOptions pto;
+ const llvm::cl::LibraryOptionsContext &libraryOptions =
+ llvmModule->getContext().getLibraryOptions();
+ llvm::PipelineTuningOptions pto(&libraryOptions);
std::optional<llvm::PGOOptions> pgoOpt;
if (opts.hasProfileIRInstr()) {
// -fprofile-generate.
pgoOpt = llvm::PGOOptions(
opts.InstrProfileOutput.empty()
- ? llvm::driver::getDefaultProfileGenName()
+ ? llvm::driver::getDefaultProfileGenName(libraryOptions)
: opts.InstrProfileOutput,
"", "", opts.MemoryProfileUsePath, llvm::PGOOptions::IRInstr,
llvm::PGOOptions::NoCSAction, llvm::PGOOptions::ColdFuncOpt::Default,
diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index 0dfced91c511dd..5f2c541bdd2fd9 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -45,6 +45,7 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/LibraryOptionsContext.h"
#include "llvm/Support/Parallel.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/Process.h"
@@ -1562,7 +1563,7 @@ static void codegenDataGenerate() {
}
}
- globalMergeRecord.finalize();
+ globalMergeRecord.finalize(cl::LibraryOptionsContext());
CodeGenDataWriter Writer;
if (!globalOutlineRecord.empty())
diff --git a/llvm/include/llvm/CGData/CodeGenData.h b/llvm/include/llvm/CGData/CodeGenData.h
index cd1d849fdc1551..c1919428fa1d07 100644
--- a/llvm/include/llvm/CGData/CodeGenData.h
+++ b/llvm/include/llvm/CGData/CodeGenData.h
@@ -30,6 +30,10 @@
namespace llvm {
+namespace cl {
+class LibraryOptionsContext;
+} // namespace cl
+
enum CGDataSectKind {
#define CG_DATA_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) Kind,
#include "llvm/CGData/CodeGenData.inc"
@@ -131,7 +135,9 @@ class CodeGenData {
public:
~CodeGenData() = default;
- LLVM_ABI static CodeGenData &getInstance();
+ /// The first call's \p LibraryOptions configure the singleton.
+ LLVM_ABI static CodeGenData &
+ getInstance(const cl::LibraryOptionsContext &LibraryOptions);
/// Returns true if we have a valid outlined hash tree.
bool hasOutlinedHashTree() {
@@ -169,32 +175,42 @@ class CodeGenData {
namespace cgdata {
-inline bool hasOutlinedHashTree() {
- return CodeGenData::getInstance().hasOutlinedHashTree();
+inline bool
+hasOutlinedHashTree(const cl::LibraryOptionsContext &LibraryOptions) {
+ return CodeGenData::getInstance(LibraryOptions).hasOutlinedHashTree();
}
-inline bool hasStableFunctionMap() {
- return CodeGenData::getInstance().hasStableFunctionMap();
+inline bool
+hasStableFunctionMap(const cl::LibraryOptionsContext &LibraryOptions) {
+ return CodeGenData::getInstance(LibraryOptions).hasStableFunctionMap();
}
-inline const OutlinedHashTree *getOutlinedHashTree() {
- return CodeGenData::getInstance().getOutlinedHashTree();
+inline const OutlinedHashTree *
+getOutlinedHashTree(const cl::LibraryOptionsContext &LibraryOptions) {
+ return CodeGenData::getInstance(LibraryOptions).getOutlinedHashTree();
}
-inline const StableFunctionMap *getStableFunctionMap() {
- return CodeGenData::getInstance().getStableFunctionMap();
+inline const StableFunctionMap *
+getStableFunctionMap(const cl::LibraryOptionsContext &LibraryOptions) {
+ return CodeGenData::getInstance(LibraryOptions).getStableFunctionMap();
}
-inline bool emitCGData() { return CodeGenData::getInstance().emitCGData(); }
+inline bool emitCGData(const cl::LibraryOptionsContext &LibraryOptions) {
+ return CodeGenData::getInstance(LibraryOptions).emitCGData();
+}
inline void
-publishOutlinedHashTree(std::unique_ptr<OutlinedHashTree> HashTree) {
- CodeGenData::getInstance().publishOutlinedHashTree(std::move(HashTree));
+publishOutlinedHashTree(const cl::LibraryOptionsContext &LibraryOptions,
+ std::unique_ptr<OutlinedHashTree> HashTree) {
+ CodeGenData::getInstance(LibraryOptions)
+ .publishOutlinedHashTree(std::move(HashTree));
}
inline void
-publishStableFunctionMap(std::unique_ptr<StableFunctionMap> FunctionMap) {
- CodeGenData::getInstance().publishStableFunctionMap(std::move(FunctionMap));
+publishStableFunctionMap(const cl::LibraryOptionsContext &LibraryOptions,
+ std::unique_ptr<StableFunctionMap> FunctionMap) {
+ CodeGenData::getInstance(LibraryOptions)
+ .publishStableFunctionMap(std::move(FunctionMap));
}
struct StreamCacheData {
@@ -244,7 +260,7 @@ struct StreamCacheData {
/// Returns whether ThinLTO runs two rounds of code generation
/// (-codegen-data-thinlto-two-rounds).
-LLVM_ABI bool thinLTOTwoRounds();
+LLVM_ABI bool thinLTOTwoRounds(const cl::LibraryOptionsContext &LibraryOptions);
/// Save \p TheModule before the first codegen round.
/// \p Task represents the partition number in the parallel code generation
@@ -267,7 +283,8 @@ loadModuleForTwoRounds(BitcodeModule &OrigModule, unsigned Task,
/// first codegen round.
/// \return the combined hash of the merged codegen data.
LLVM_ABI Expected<stable_hash>
-mergeCodeGenData(ArrayRef<StringRef> ObjectFiles);
+mergeCodeGenData(const cl::LibraryOptionsContext &LibraryOptions,
+ ArrayRef<StringRef> ObjectFiles);
LLVM_ABI void warn(Error E, StringRef Whence = "");
LLVM_ABI void warn(Twine Message, StringRef Whence = "", StringRef Hint = "");
diff --git a/llvm/include/llvm/CGData/CodeGenDataReader.h b/llvm/include/llvm/CGData/CodeGenDataReader.h
index 94f7af2de17012..0b827cd97c08b5 100644
--- a/llvm/include/llvm/CGData/CodeGenDataReader.h
+++ b/llvm/include/llvm/CGData/CodeGenDataReader.h
@@ -52,12 +52,14 @@ class CodeGenDataReader {
/// codegen data file path and file system. \p LazyLoading defers
/// deserializing the stable function map of indexed codegen data.
LLVM_ABI static Expected<std::unique_ptr<CodeGenDataReader>>
- create(const Twine &Path, vfs::FileSystem &FS, bool LazyLoading = false);
+ create(const cl::LibraryOptionsContext &LibraryOptions, const Twine &Path,
+ vfs::FileSystem &FS, bool LazyLoading = false);
/// Factory method to create an appropriately typed reader for the given
/// memory buffer.
LLVM_ABI static Expected<std::unique_ptr<CodeGenDataReader>>
- create(std::unique_ptr<MemoryBuffer> Buffer, bool LazyLoading = false);
+ create(const cl::LibraryOptionsContext &LibraryOptions,
+ std::unique_ptr<MemoryBuffer> Buffer, bool LazyLoading = false);
/// Extract the cgdata embedded in sections from the given object file and
/// merge them into the GlobalOutlineRecord. This is a static helper that
@@ -101,6 +103,7 @@ class CodeGenDataReader {
};
class LLVM_ABI IndexedCodeGenDataReader : public CodeGenDataReader {
+ bool ReadStableFunctionMapNames;
/// The codegen data file contents.
std::unique_ptr<MemoryBuffer> DataBuffer;
/// The header
@@ -108,9 +111,11 @@ class LLVM_ABI IndexedCodeGenDataReader : public CodeGenDataReader {
bool LazyLoading;
public:
- IndexedCodeGenDataReader(std::unique_ptr<MemoryBuffer> DataBuffer,
+ IndexedCodeGenDataReader(bool ReadStableFunctionMapNames,
+ std::unique_ptr<MemoryBuffer> DataBuffer,
bool LazyLoading = false)
- : DataBuffer(std::move(DataBuffer)), LazyLoading(LazyLoading) {}
+ : ReadStableFunctionMapNames(ReadStableFunctionMapNames),
+ DataBuffer(std::move(DataBuffer)), LazyLoading(LazyLoading) {}
IndexedCodeGenDataReader(const IndexedCodeGenDataReader &) = delete;
IndexedCodeGenDataReader &
operator=(const IndexedCodeGenDataReader &) = delete;
diff --git a/llvm/include/llvm/CGData/StableFunctionMap.h b/llvm/include/llvm/CGData/StableFunctionMap.h
index 909d0e1debe7e6..b9be47177c9a31 100644
--- a/llvm/include/llvm/CGData/StableFunctionMap.h
+++ b/llvm/include/llvm/CGData/StableFunctionMap.h
@@ -26,6 +26,10 @@
namespace llvm {
+namespace cl {
+class LibraryOptionsContext;
+} // namespace cl
+
using IndexPairHash = std::pair<IndexPair, stable_hash>;
using IndexOperandHashVecType = SmallVector<IndexPairHash>;
@@ -153,7 +157,8 @@ struct StableFunctionMap {
LLVM_ABI size_t size(SizeType Type = UniqueHashCount) const;
/// Finalize the stable function map by trimming content.
- LLVM_ABI void finalize(bool SkipTrim = false);
+ LLVM_ABI void finalize(const cl::LibraryOptionsContext &LibraryOptions,
+ bool SkipTrim = false);
private:
/// Insert a `StableFunctionEntry` into the function map directly. This
diff --git a/llvm/include/llvm/CGData/StableFunctionMapRecord.h b/llvm/include/llvm/CGData/StableFunctionMapRecord.h
index 2d8b573a3cb467..24e7ef1af2ea81 100644
--- a/llvm/include/llvm/CGData/StableFunctionMapRecord.h
+++ b/llvm/include/llvm/CGData/StableFunctionMapRecord.h
@@ -87,7 +87,10 @@ struct StableFunctionMapRecord {
LLVM_ABI void deserializeYAML(yaml::Input &YIS);
/// Finalize the stable function map by trimming content.
- void finalize(bool SkipTrim = false) { FunctionMap->finalize(SkipTrim); }
+ void finalize(const cl::LibraryOptionsContext &LibraryOptions,
+ bool SkipTrim = false) {
+ FunctionMap->finalize(LibraryOptions, SkipTrim);
+ }
/// Merge the stable function map into this one.
void merge(const StableFunctionMapRecord &Other) {
diff --git a/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h b/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h
index 77ab477986d31c..3d292139cb7d06 100644
--- a/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h
+++ b/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h
@@ -20,6 +20,9 @@ namespace llvm {
class Triple;
class TargetLibraryInfoImpl;
enum class VectorLibrary;
+namespace cl {
+class LibraryOptionsContext;
+} // namespace cl
} // namespace llvm
namespace llvm::driver {
@@ -67,7 +70,8 @@ enum ProfileInstrKind {
};
// Default filename used for profile generation.
-LLVM_ABI std::string getDefaultProfileGenName();
+LLVM_ABI std::string
+getDefaultProfileGenName(const cl::LibraryOptionsContext &LibraryOptions);
} // end namespace llvm::driver
#endif
diff --git a/llvm/include/llvm/Passes/PassBuilder.h b/llvm/include/llvm/Passes/PassBuilder.h
index 502dfd93842bea..2dd74624b424e3 100644
--- a/llvm/include/llvm/Passes/PassBuilder.h
+++ b/llvm/include/llvm/Passes/PassBuilder.h
@@ -37,13 +37,24 @@ class AAManager;
class TargetMachine;
class ModuleSummaryIndex;
struct PassesOptions;
+namespace cl {
+class LibraryOptionsContext;
+} // namespace cl
/// Tunable parameters for passes in the default pipelines.
class PipelineTuningOptions {
public:
- /// Constructor sets pipeline tuning defaults based on cl::opts. Each option
- /// can be set in the PassBuilder when using a LLVM as a library.
- LLVM_ABI PipelineTuningOptions();
+ /// Constructor sets pipeline tuning defaults based on the global values of
+ /// the library options. Each option can be set in the PassBuilder when using
+ /// a LLVM as a library.
+ PipelineTuningOptions() : PipelineTuningOptions(nullptr) {}
+
+ /// Reads the defaults from \p LibraryOptions, or their global values if
+ /// null.
+ LLVM_ABI explicit PipelineTuningOptions(
+ const cl::LibraryOptionsContext *LibraryOptions);
+
+ const cl::LibraryOptionsContext *LibraryOptions;
/// Tuning option to set loop interleaving on/off, set based on opt level.
bool LoopInterleaving;
@@ -118,6 +129,7 @@ enum class PrintPipelinePassesFormat {
/// of the built-in passes, and those may reference these members during
/// construction.
class PassBuilder {
+ const cl::LibraryOptionsContext *LibraryOptions;
const PassesOptions &Opts;
TargetMachine *TM;
PipelineTuningOptions PTO;
@@ -674,6 +686,13 @@ class PassBuilder {
return PIC;
}
+ /// Returns the library options the pipelines read: the
+ /// PipelineTuningOptions', else the TargetMachine's, else null for the global
+ /// values.
+ const cl::LibraryOptionsContext *getLibraryOptions() const {
+ return LibraryOptions;
+ }
+
/// Returns the virtual file system.
IntrusiveRefCntPtr<vfs::FileSystem> getVirtualFileSystemPtr() const {
return FS;
diff --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index d485ea78f462a1..1c378941cc1259 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -43,6 +43,7 @@ class Function;
class MachineFunction;
class PassInstrumentationCallbacks;
struct ExtendedIRContext;
+struct PassesOptions;
/// Instrumentation to print IR before/after passes.
///
@@ -50,6 +51,7 @@ struct ExtendedIRContext;
/// (typically Loop or SCC).
class PrintIRInstrumentation {
public:
+ explicit PrintIRInstrumentation(const PassesOptions &Opts) : Opts(Opts) {}
LLVM_ABI ~PrintIRInstrumentation();
LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC,
@@ -98,6 +100,7 @@ class PrintIRInstrumentation {
unsigned PassNumber,
IRDumpFileSuffixType SuffixType);
+ const PassesOptions ...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/232599
More information about the flang-commits
mailing list