Skip to content

Commit e8692b8

Browse files
authored
[NewPM] Add pass options for InternalizePass to preserve GVs (reland) (#92383)
Reland of #91334, which broke the gcc7 buildbot and was reverted in #92321. Work around the failure by being explicit about returning an `Expected`. cc @joker-eph
1 parent b82fd5d commit e8692b8

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,24 @@ Expected<GlobalMergeOptions> parseGlobalMergeOptions(StringRef Params) {
11421142
return Result;
11431143
}
11441144

1145+
Expected<SmallVector<std::string, 0>> parseInternalizeGVs(StringRef Params) {
1146+
SmallVector<std::string, 1> PreservedGVs;
1147+
while (!Params.empty()) {
1148+
StringRef ParamName;
1149+
std::tie(ParamName, Params) = Params.split(';');
1150+
1151+
if (ParamName.consume_front("preserve-gv=")) {
1152+
PreservedGVs.push_back(ParamName.str());
1153+
} else {
1154+
return make_error<StringError>(
1155+
formatv("invalid Internalize pass parameter '{0}' ", ParamName).str(),
1156+
inconvertibleErrorCode());
1157+
}
1158+
}
1159+
1160+
return Expected<SmallVector<std::string, 0>>(std::move(PreservedGVs));
1161+
}
1162+
11451163
} // namespace
11461164

11471165
/// Tests whether a pass name starts with a valid prefix for a default pipeline

llvm/lib/Passes/PassRegistry.def

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ MODULE_PASS("insert-gcov-profiling", GCOVProfilerPass())
7878
MODULE_PASS("instrorderfile", InstrOrderFilePass())
7979
MODULE_PASS("instrprof", InstrProfilingLoweringPass())
8080
MODULE_PASS("ctx-instr-lower", PGOCtxProfLoweringPass())
81-
MODULE_PASS("internalize", InternalizePass())
8281
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
8382
MODULE_PASS("iroutliner", IROutlinerPass())
8483
MODULE_PASS("jmc-instrumenter", JMCInstrumenterPass())
@@ -175,6 +174,20 @@ MODULE_PASS_WITH_PARAMS(
175174
"hwasan", "HWAddressSanitizerPass",
176175
[](HWAddressSanitizerOptions Opts) { return HWAddressSanitizerPass(Opts); },
177176
parseHWASanPassOptions, "kernel;recover")
177+
MODULE_PASS_WITH_PARAMS(
178+
"internalize", "InternalizePass",
179+
[](SmallVector<std::string, 0> PreservedGVs) {
180+
if (PreservedGVs.empty())
181+
return InternalizePass();
182+
auto MustPreserveGV = [=](const GlobalValue &GV) {
183+
for (auto &PreservedGV : PreservedGVs)
184+
if (GV.getName() == PreservedGV)
185+
return true;
186+
return false;
187+
};
188+
return InternalizePass(MustPreserveGV);
189+
},
190+
parseInternalizeGVs, "preserve-gv=GV")
178191
MODULE_PASS_WITH_PARAMS(
179192
"ipsccp", "IPSCCPPass", [](IPSCCPOptions Opts) { return IPSCCPPass(Opts); },
180193
parseIPSCCPOptions, "no-func-spec;func-spec")

llvm/test/Transforms/Internalize/lists.ll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
; -file and -list options should be merged, the apifile contains foo and j
1414
; RUN: opt < %s -passes=internalize -internalize-public-api-list bar -internalize-public-api-file %S/apifile -S | FileCheck --check-prefix=FOO_J_AND_BAR %s
1515

16+
; specifying through pass builder option
17+
; RUN: opt < %s -passes='internalize<preserve-gv=foo;preserve-gv=j>' -S | FileCheck --check-prefix=FOO_AND_J %s
18+
; RUN: opt < %s -passes='internalize<preserve-gv=foo;preserve-gv=bar>' -S | FileCheck --check-prefix=FOO_AND_BAR %s
19+
; RUN: opt < %s -passes='internalize<preserve-gv=foo;preserve-gv=j;preserve-gv=bar>' -S | FileCheck --check-prefix=FOO_J_AND_BAR %s
20+
1621
; ALL: @i = internal global
1722
; FOO_AND_J: @i = internal global
1823
; FOO_AND_BAR: @i = internal global

0 commit comments

Comments
 (0)