Skip to content

Commit f6ca37b

Browse files
authored
[NewPM] Set diagnostic handler in MachineModuleAnalysis (#88229)
`setDiagnosticHandler` is idempotent.
1 parent 6775285 commit f6ca37b

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

llvm/lib/CodeGen/MachineModuleInfo.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@ static unsigned getLocCookie(const SMDiagnostic &SMD, const SourceMgr &SrcMgr,
213213
bool MachineModuleInfoWrapperPass::doInitialization(Module &M) {
214214
MMI.initialize();
215215
MMI.TheModule = &M;
216-
// FIXME: Do this for new pass manager.
217216
LLVMContext &Ctx = M.getContext();
218217
MMI.getContext().setDiagnosticHandler(
219218
[&Ctx, &M](const SMDiagnostic &SMD, bool IsInlineAsm,
@@ -240,6 +239,17 @@ AnalysisKey MachineModuleAnalysis::Key;
240239
MachineModuleAnalysis::Result
241240
MachineModuleAnalysis::run(Module &M, ModuleAnalysisManager &) {
242241
MMI.TheModule = &M;
242+
LLVMContext &Ctx = M.getContext();
243+
MMI.getContext().setDiagnosticHandler(
244+
[&Ctx, &M](const SMDiagnostic &SMD, bool IsInlineAsm,
245+
const SourceMgr &SrcMgr,
246+
std::vector<const MDNode *> &LocInfos) {
247+
unsigned LocCookie = 0;
248+
if (IsInlineAsm)
249+
LocCookie = getLocCookie(SMD, SrcMgr, LocInfos);
250+
Ctx.diagnose(
251+
DiagnosticInfoSrcMgr(SMD, M.getName(), IsInlineAsm, LocCookie));
252+
});
243253
MMI.DbgInfoAvailable =
244254
!DisableDebugInfoPrinting && !M.debug_compile_units().empty();
245255
return Result(MMI);

llvm/unittests/CodeGen/PassManagerTest.cpp

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,15 @@ struct TestMachineModulePass : public PassInfoMixin<TestMachineModulePass> {
125125
std::vector<int> &Counts;
126126
};
127127

128+
struct ReportWarningPass : public PassInfoMixin<ReportWarningPass> {
129+
PreservedAnalyses run(MachineFunction &MF,
130+
MachineFunctionAnalysisManager &MFAM) {
131+
auto &Ctx = MF.getContext();
132+
Ctx.reportWarning(SMLoc(), "Test warning message.");
133+
return PreservedAnalyses::all();
134+
}
135+
};
136+
128137
std::unique_ptr<Module> parseIR(LLVMContext &Context, const char *IR) {
129138
SMDiagnostic Err;
130139
return parseAssemblyString(IR, Err, Context);
@@ -176,10 +185,10 @@ TEST_F(PassManagerTest, Basic) {
176185
MachineModuleInfo MMI(LLVMTM);
177186

178187
LoopAnalysisManager LAM;
188+
MachineFunctionAnalysisManager MFAM;
179189
FunctionAnalysisManager FAM;
180190
CGSCCAnalysisManager CGAM;
181191
ModuleAnalysisManager MAM;
182-
MachineFunctionAnalysisManager MFAM;
183192
PassBuilder PB(TM.get());
184193
PB.registerModuleAnalyses(MAM);
185194
PB.registerCGSCCAnalyses(CGAM);
@@ -204,10 +213,49 @@ TEST_F(PassManagerTest, Basic) {
204213
MFPM.addPass(TestMachineFunctionPass(Count, Counts));
205214
MPM.addPass(createModuleToMachineFunctionPassAdaptor(std::move(MFPM)));
206215

216+
testing::internal::CaptureStderr();
207217
MPM.run(*M, MAM);
218+
std::string Output = testing::internal::GetCapturedStderr();
208219

209220
EXPECT_EQ((std::vector<int>{10, 16, 18, 20, 30, 36, 38, 40}), Counts);
210221
EXPECT_EQ(40, Count);
211222
}
212223

224+
TEST_F(PassManagerTest, DiagnosticHandler) {
225+
if (!TM)
226+
GTEST_SKIP();
227+
228+
LLVMTargetMachine *LLVMTM = static_cast<LLVMTargetMachine *>(TM.get());
229+
M->setDataLayout(TM->createDataLayout());
230+
231+
MachineModuleInfo MMI(LLVMTM);
232+
233+
LoopAnalysisManager LAM;
234+
MachineFunctionAnalysisManager MFAM;
235+
FunctionAnalysisManager FAM;
236+
CGSCCAnalysisManager CGAM;
237+
ModuleAnalysisManager MAM;
238+
PassBuilder PB(TM.get());
239+
PB.registerModuleAnalyses(MAM);
240+
PB.registerCGSCCAnalyses(CGAM);
241+
PB.registerFunctionAnalyses(FAM);
242+
PB.registerLoopAnalyses(LAM);
243+
PB.registerMachineFunctionAnalyses(MFAM);
244+
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM, &MFAM);
245+
246+
MAM.registerPass([&] { return MachineModuleAnalysis(MMI); });
247+
248+
ModulePassManager MPM;
249+
FunctionPassManager FPM;
250+
MachineFunctionPassManager MFPM;
251+
MFPM.addPass(ReportWarningPass());
252+
MPM.addPass(createModuleToMachineFunctionPassAdaptor(std::move(MFPM)));
253+
testing::internal::CaptureStderr();
254+
MPM.run(*M, MAM);
255+
std::string Output = testing::internal::GetCapturedStderr();
256+
257+
EXPECT_TRUE(Output.find("warning: <unknown>:0: Test warning message.") !=
258+
std::string::npos);
259+
}
260+
213261
} // namespace

0 commit comments

Comments
 (0)