[llvm-branch-commits] [llvm] DwarfEHPrepare: Use LibcallLoweringInfo analysis (PR #176380)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jan 16 05:46:15 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-nvptx
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/176380.diff
6 Files Affected:
- (modified) llvm/lib/CodeGen/DwarfEHPrepare.cpp (+39-15)
- (modified) llvm/test/CodeGen/AArch64/dwarf-eh-prepare-dbg.ll (+1-1)
- (modified) llvm/test/CodeGen/X86/dwarf-eh-prepare-dbg.ll (+1-1)
- (modified) llvm/test/CodeGen/X86/dwarf-eh-prepare.ll (+1-1)
- (modified) llvm/test/CodeGen/X86/dwarf_eh_resume.ll (+1-1)
- (added) llvm/test/Transforms/DwarfEHPrepare/missing-analysis.ll (+7)
``````````diff
diff --git a/llvm/lib/CodeGen/DwarfEHPrepare.cpp b/llvm/lib/CodeGen/DwarfEHPrepare.cpp
index 74b9b093adcca..8244435bd78d5 100644
--- a/llvm/lib/CodeGen/DwarfEHPrepare.cpp
+++ b/llvm/lib/CodeGen/DwarfEHPrepare.cpp
@@ -57,7 +57,7 @@ class DwarfEHPrepare {
CodeGenOptLevel OptLevel;
Function &F;
- const TargetLowering &TLI;
+ const LibcallLoweringInfo &Libcalls;
DomTreeUpdater *DTU;
const TargetTransformInfo *TTI;
const Triple &TargetTriple;
@@ -79,9 +79,9 @@ class DwarfEHPrepare {
public:
DwarfEHPrepare(CodeGenOptLevel OptLevel_, Function &F_,
- const TargetLowering &TLI_, DomTreeUpdater *DTU_,
+ const LibcallLoweringInfo &Libcalls_, DomTreeUpdater *DTU_,
const TargetTransformInfo *TTI_, const Triple &TargetTriple_)
- : OptLevel(OptLevel_), F(F_), TLI(TLI_), DTU(DTU_), TTI(TTI_),
+ : OptLevel(OptLevel_), F(F_), Libcalls(Libcalls_), DTU(DTU_), TTI(TTI_),
TargetTriple(TargetTriple_) {}
bool run();
@@ -216,21 +216,22 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls() {
FunctionCallee RewindFunction;
CallingConv::ID RewindFunctionCallingConv;
FunctionType *FTy;
- const char *RewindName;
+ StringRef RewindName;
bool DoesRewindFunctionNeedExceptionObject;
if ((Pers == EHPersonality::GNU_CXX || Pers == EHPersonality::GNU_CXX_SjLj) &&
TargetTriple.isTargetEHABICompatible()) {
- RewindName = TLI.getLibcallName(RTLIB::CXA_END_CLEANUP);
+ RewindName = Libcalls.getLibcallName(RTLIB::CXA_END_CLEANUP);
FTy = FunctionType::get(Type::getVoidTy(Ctx), false);
RewindFunctionCallingConv =
- TLI.getLibcallCallingConv(RTLIB::CXA_END_CLEANUP);
+ Libcalls.getLibcallCallingConv(RTLIB::CXA_END_CLEANUP);
DoesRewindFunctionNeedExceptionObject = false;
} else {
- RewindName = TLI.getLibcallName(RTLIB::UNWIND_RESUME);
+ RewindName = Libcalls.getLibcallName(RTLIB::UNWIND_RESUME);
FTy = FunctionType::get(Type::getVoidTy(Ctx), PointerType::getUnqual(Ctx),
false);
- RewindFunctionCallingConv = TLI.getLibcallCallingConv(RTLIB::UNWIND_RESUME);
+ RewindFunctionCallingConv =
+ Libcalls.getLibcallCallingConv(RTLIB::UNWIND_RESUME);
DoesRewindFunctionNeedExceptionObject = true;
}
RewindFunction = F.getParent()->getOrInsertFunction(RewindName, FTy);
@@ -318,12 +319,12 @@ bool DwarfEHPrepare::run() {
}
static bool prepareDwarfEH(CodeGenOptLevel OptLevel, Function &F,
- const TargetLowering &TLI, DominatorTree *DT,
- const TargetTransformInfo *TTI,
+ const LibcallLoweringInfo &Libcalls,
+ DominatorTree *DT, const TargetTransformInfo *TTI,
const Triple &TargetTriple) {
DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
- return DwarfEHPrepare(OptLevel, F, TLI, DT ? &DTU : nullptr, TTI,
+ return DwarfEHPrepare(OptLevel, F, Libcalls, DT ? &DTU : nullptr, TTI,
TargetTriple)
.run();
}
@@ -343,7 +344,12 @@ class DwarfEHPrepareLegacyPass : public FunctionPass {
bool runOnFunction(Function &F) override {
const TargetMachine &TM =
getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
- const TargetLowering &TLI = *TM.getSubtargetImpl(F)->getTargetLowering();
+ const TargetSubtargetInfo *Subtarget = TM.getSubtargetImpl(F);
+
+ const LibcallLoweringInfo &Libcalls =
+ getAnalysis<LibcallLoweringInfoWrapper>().getLibcallLowering(
+ *F.getParent(), *Subtarget);
+
DominatorTree *DT = nullptr;
const TargetTransformInfo *TTI = nullptr;
if (auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>())
@@ -353,10 +359,11 @@ class DwarfEHPrepareLegacyPass : public FunctionPass {
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
TTI = &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
}
- return prepareDwarfEH(OptLevel, F, TLI, DT, TTI, TM.getTargetTriple());
+ return prepareDwarfEH(OptLevel, F, Libcalls, DT, TTI, TM.getTargetTriple());
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
+ AU.addRequired<LibcallLoweringInfoWrapper>();
AU.addRequired<TargetPassConfig>();
AU.addRequired<TargetTransformInfoWrapperPass>();
if (OptLevel != CodeGenOptLevel::None) {
@@ -375,17 +382,33 @@ class DwarfEHPrepareLegacyPass : public FunctionPass {
PreservedAnalyses DwarfEHPreparePass::run(Function &F,
FunctionAnalysisManager &FAM) {
- const auto &TLI = *TM->getSubtargetImpl(F)->getTargetLowering();
auto *DT = FAM.getCachedResult<DominatorTreeAnalysis>(F);
const TargetTransformInfo *TTI = nullptr;
auto OptLevel = TM->getOptLevel();
+
+ auto &MAMProxy = FAM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
+
+ const LibcallLoweringModuleAnalysisResult *LibcallLowering =
+ MAMProxy.getCachedResult<LibcallLoweringModuleAnalysis>(*F.getParent());
+
+ if (!LibcallLowering) {
+ F.getContext().emitError("'" + LibcallLoweringModuleAnalysis::name() +
+ "' analysis required");
+ return PreservedAnalyses::all();
+ }
+
if (OptLevel != CodeGenOptLevel::None) {
if (!DT)
DT = &FAM.getResult<DominatorTreeAnalysis>(F);
TTI = &FAM.getResult<TargetIRAnalysis>(F);
}
+
+ const TargetSubtargetInfo *Subtarget = TM->getSubtargetImpl(F);
+ const LibcallLoweringInfo &Libcalls =
+ LibcallLowering->getLibcallLowering(*Subtarget);
+
bool Changed =
- prepareDwarfEH(OptLevel, F, TLI, DT, TTI, TM->getTargetTriple());
+ prepareDwarfEH(OptLevel, F, Libcalls, DT, TTI, TM->getTargetTriple());
if (!Changed)
return PreservedAnalyses::all();
@@ -399,6 +422,7 @@ char DwarfEHPrepareLegacyPass::ID = 0;
INITIALIZE_PASS_BEGIN(DwarfEHPrepareLegacyPass, DEBUG_TYPE,
"Prepare DWARF exceptions", false, false)
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
+INITIALIZE_PASS_DEPENDENCY(LibcallLoweringInfoWrapper)
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
INITIALIZE_PASS_END(DwarfEHPrepareLegacyPass, DEBUG_TYPE,
diff --git a/llvm/test/CodeGen/AArch64/dwarf-eh-prepare-dbg.ll b/llvm/test/CodeGen/AArch64/dwarf-eh-prepare-dbg.ll
index 020a10f278ed6..5ad348d746f52 100644
--- a/llvm/test/CodeGen/AArch64/dwarf-eh-prepare-dbg.ll
+++ b/llvm/test/CodeGen/AArch64/dwarf-eh-prepare-dbg.ll
@@ -1,5 +1,5 @@
; RUN: opt -S -mtriple=aarch64-unknown-linux-gnu -dwarf-eh-prepare < %s | FileCheck %s
-; RUN: opt -S -mtriple=aarch64-unknown-linux-gnu -passes=dwarf-eh-prepare < %s | FileCheck %s
+; RUN: opt -S -mtriple=aarch64-unknown-linux-gnu -passes='require<libcall-lowering-info>,dwarf-eh-prepare' < %s | FileCheck %s
; If _Unwind_Resume is defined in the same module and we have debug
; info, then the inserted _Unwind_Resume calls also need to have a dummy debug
diff --git a/llvm/test/CodeGen/X86/dwarf-eh-prepare-dbg.ll b/llvm/test/CodeGen/X86/dwarf-eh-prepare-dbg.ll
index 0345b736e9e60..0636b83383369 100644
--- a/llvm/test/CodeGen/X86/dwarf-eh-prepare-dbg.ll
+++ b/llvm/test/CodeGen/X86/dwarf-eh-prepare-dbg.ll
@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -mtriple=x86_64-linux-gnu -dwarf-eh-prepare < %s | FileCheck %s
-; RUN: opt -S -mtriple=x86_64-linux-gnu -passes=dwarf-eh-prepare < %s | FileCheck %s
+; RUN: opt -S -mtriple=x86_64-linux-gnu -passes='require<libcall-lowering-info>,dwarf-eh-prepare' < %s | FileCheck %s
; PR57469: If _Unwind_Resume is defined in the same module and we have debug
; info, then the inserted _Unwind_Resume calls also need to have a dummy debug
diff --git a/llvm/test/CodeGen/X86/dwarf-eh-prepare.ll b/llvm/test/CodeGen/X86/dwarf-eh-prepare.ll
index dd27e7fe14117..7d3069f5198ba 100644
--- a/llvm/test/CodeGen/X86/dwarf-eh-prepare.ll
+++ b/llvm/test/CodeGen/X86/dwarf-eh-prepare.ll
@@ -1,5 +1,5 @@
; RUN: opt -mtriple=x86_64-linux-gnu -dwarf-eh-prepare -simplifycfg-require-and-preserve-domtree=1 -run-twice < %s -S | FileCheck %s
-; RUN: opt -mtriple=x86_64-linux-gnu -passes=dwarf-eh-prepare -codegen-opt-level=2 -simplifycfg-require-and-preserve-domtree=1 -run-twice < %s -S | FileCheck %s
+; RUN: opt -mtriple=x86_64-linux-gnu -passes='require<libcall-lowering-info>,dwarf-eh-prepare' -codegen-opt-level=2 -simplifycfg-require-and-preserve-domtree=1 -run-twice < %s -S | FileCheck %s
; Check basic functionality of IR-to-IR DWARF EH preparation. This should
; eliminate resumes. This pass requires a TargetMachine, so we put it under X86
diff --git a/llvm/test/CodeGen/X86/dwarf_eh_resume.ll b/llvm/test/CodeGen/X86/dwarf_eh_resume.ll
index d66d89d16a394..f07be957685bb 100644
--- a/llvm/test/CodeGen/X86/dwarf_eh_resume.ll
+++ b/llvm/test/CodeGen/X86/dwarf_eh_resume.ll
@@ -1,5 +1,5 @@
; RUN: opt -mtriple=x86_64-linux-gnu -dwarf-eh-prepare -S %s | FileCheck %s
-; RUN: opt -mtriple=x86_64-linux-gnu -passes=dwarf-eh-prepare -S %s | FileCheck %s
+; RUN: opt -mtriple=x86_64-linux-gnu -passes='require<libcall-lowering-info>,dwarf-eh-prepare' -S %s | FileCheck %s
declare i32 @hoge(...)
diff --git a/llvm/test/Transforms/DwarfEHPrepare/missing-analysis.ll b/llvm/test/Transforms/DwarfEHPrepare/missing-analysis.ll
new file mode 100644
index 0000000000000..62325f8c7091e
--- /dev/null
+++ b/llvm/test/Transforms/DwarfEHPrepare/missing-analysis.ll
@@ -0,0 +1,7 @@
+; REQUIRES: x86-registered-target
+; RUN: not opt -mtriple=x86_64-- -passes=dwarf-eh-prepare -disable-output %s 2>&1 | FileCheck %s
+
+; CHECK: 'LibcallLoweringModuleAnalysis' analysis required
+define void @empty() {
+ ret void
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/176380
More information about the llvm-branch-commits
mailing list