[llvm] 648ce3d - Cleanup unwind table emission code a bit.
James Y Knight via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 6 10:53:34 PST 2023
Author: James Y Knight
Date: 2023-01-06T13:53:10-05:00
New Revision: 648ce3d358560c0f60340fcf28ad2563d213eca2
URL: https://github.com/llvm/llvm-project/commit/648ce3d358560c0f60340fcf28ad2563d213eca2
DIFF: https://github.com/llvm/llvm-project/commit/648ce3d358560c0f60340fcf28ad2563d213eca2.diff
LOG: Cleanup unwind table emission code a bit.
This change removes the `tidyLandingPads` function, which previously
had a few responsibilities:
1. Dealing with the deletion of an invoke, after MachineFunction lowering.
2. Dealing with the deletion of a landing pad BB, after MachineFunction lowering.
3. Cleaning up the type-id list generated by `MachineFunction::addLandingPad`.
Case 3 has been fixed in the generator, and the others are now handled
during table emission.
This change also removes `MachineFunction`'s `addCatchTypeInfo`,
`addFilterTypeInfo`, and `addCleanup` helper fns, as they had a single
caller, and being outlined didn't make it simpler.
Finally, as calling `tidyLandingPads` was effectively the only thing
`DwarfCFIExceptionBase` did, that class has been eliminated.
Added:
Modified:
llvm/include/llvm/CodeGen/MachineFunction.h
llvm/lib/CodeGen/AsmPrinter/AIXException.cpp
llvm/lib/CodeGen/AsmPrinter/ARMException.cpp
llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
llvm/lib/CodeGen/AsmPrinter/DwarfException.h
llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp
llvm/lib/CodeGen/AsmPrinter/WasmException.cpp
llvm/lib/CodeGen/AsmPrinter/WasmException.h
llvm/lib/CodeGen/AsmPrinter/WinException.cpp
llvm/lib/CodeGen/MachineFunction.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/MachineFunction.h b/llvm/include/llvm/CodeGen/MachineFunction.h
index 3cb8d7b35e374..22e002d2594b1 100644
--- a/llvm/include/llvm/CodeGen/MachineFunction.h
+++ b/llvm/include/llvm/CodeGen/MachineFunction.h
@@ -1105,10 +1105,6 @@ class LLVM_EXTERNAL_VISIBILITY MachineFunction {
/// Find or create an LandingPadInfo for the specified MachineBasicBlock.
LandingPadInfo &getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad);
- /// Remap landing pad labels and remove any deleted landing pads.
- void tidyLandingPads(DenseMap<MCSymbol *, uintptr_t> *LPMap = nullptr,
- bool TidyIfNoBeginLabels = true);
-
/// Return a reference to the landing pad info for the current function.
const std::vector<LandingPadInfo> &getLandingPads() const {
return LandingPads;
@@ -1124,22 +1120,11 @@ class LLVM_EXTERNAL_VISIBILITY MachineFunction {
/// entry.
MCSymbol *addLandingPad(MachineBasicBlock *LandingPad);
- /// Provide the catch typeinfo for a landing pad.
- void addCatchTypeInfo(MachineBasicBlock *LandingPad,
- ArrayRef<const GlobalValue *> TyInfo);
-
- /// Provide the filter typeinfo for a landing pad.
- void addFilterTypeInfo(MachineBasicBlock *LandingPad,
- ArrayRef<const GlobalValue *> TyInfo);
-
- /// Add a cleanup action for a landing pad.
- void addCleanup(MachineBasicBlock *LandingPad);
-
/// Return the type id for the specified typeinfo. This is function wide.
unsigned getTypeIDFor(const GlobalValue *TI);
/// Return the id of the filter encoded by TyIds. This is function wide.
- int getFilterIDFor(std::vector<unsigned> &TyIds);
+ int getFilterIDFor(ArrayRef<unsigned> TyIds);
/// Map the landing pad's EH symbol to the call site indexes.
void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef<unsigned> Sites);
diff --git a/llvm/lib/CodeGen/AsmPrinter/AIXException.cpp b/llvm/lib/CodeGen/AsmPrinter/AIXException.cpp
index 6943c95845945..82b5ccdc70ea1 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AIXException.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AIXException.cpp
@@ -21,16 +21,7 @@
namespace llvm {
-AIXException::AIXException(AsmPrinter *A) : DwarfCFIExceptionBase(A) {}
-
-// This overrides 'DwarfCFIExceptionBase::markFunctionEnd', to avoid the call to
-// tidyLandingPads. This is necessary, because the
-// 'PPCAIXAsmPrinter::emitFunctionBodyEnd' function already checked whether we
-// need ehinfo, and emitted a traceback table with the bits set to indicate that
-// we will be emitting it, if so. Thus, if we remove it now -- so late in the
-// process -- we'll end up having emitted a reference to __ehinfo.N symbol, but
-// not emitting a definition for said symbol.
-void AIXException::markFunctionEnd() {}
+AIXException::AIXException(AsmPrinter *A) : EHStreamer(A) {}
void AIXException::emitExceptionInfoTable(const MCSymbol *LSDA,
const MCSymbol *PerSym) {
diff --git a/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp b/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp
index aa56442881d46..de6ebcf0c3419 100644
--- a/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp
@@ -19,7 +19,7 @@
#include "llvm/MC/MCStreamer.h"
using namespace llvm;
-ARMException::ARMException(AsmPrinter *A) : DwarfCFIExceptionBase(A) {}
+ARMException::ARMException(AsmPrinter *A) : EHStreamer(A) {}
ARMException::~ARMException() = default;
@@ -51,7 +51,6 @@ void ARMException::beginFunction(const MachineFunction *MF) {
void ARMException::markFunctionEnd() {
if (shouldEmitCFI)
Asm->OutStreamer->emitCFIEndProc();
- DwarfCFIExceptionBase::markFunctionEnd();
}
/// endFunction - Gather and emit post-function exception information.
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
index 1c1c5dadfb699..72ed2bd78e7a5 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
@@ -23,18 +23,7 @@
#include "llvm/Target/TargetOptions.h"
using namespace llvm;
-DwarfCFIExceptionBase::DwarfCFIExceptionBase(AsmPrinter *A) : EHStreamer(A) {}
-
-void DwarfCFIExceptionBase::markFunctionEnd() {
- // Map all labels and get rid of any dead landing pads.
- if (!Asm->MF->getLandingPads().empty()) {
- MachineFunction *NonConstMF = const_cast<MachineFunction*>(Asm->MF);
- NonConstMF->tidyLandingPads();
- }
-}
-
-DwarfCFIException::DwarfCFIException(AsmPrinter *A)
- : DwarfCFIExceptionBase(A) {}
+DwarfCFIException::DwarfCFIException(AsmPrinter *A) : EHStreamer(A) {}
DwarfCFIException::~DwarfCFIException() = default;
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfException.h b/llvm/lib/CodeGen/AsmPrinter/DwarfException.h
index 4285b408c0f98..0dc98314b828e 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfException.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfException.h
@@ -21,19 +21,7 @@ namespace llvm {
class MachineFunction;
class ARMTargetStreamer;
-class LLVM_LIBRARY_VISIBILITY DwarfCFIExceptionBase : public EHStreamer {
-protected:
- DwarfCFIExceptionBase(AsmPrinter *A);
-
- /// Per-function flag to indicate if frame CFI info should be emitted.
- bool shouldEmitCFI = false;
- /// Per-module flag to indicate if .cfi_section has beeen emitted.
- bool hasEmittedCFISections = false;
-
- void markFunctionEnd() override;
-};
-
-class LLVM_LIBRARY_VISIBILITY DwarfCFIException : public DwarfCFIExceptionBase {
+class LLVM_LIBRARY_VISIBILITY DwarfCFIException : public EHStreamer {
/// Per-function flag to indicate if .cfi_personality should be emitted.
bool shouldEmitPersonality = false;
@@ -43,6 +31,12 @@ class LLVM_LIBRARY_VISIBILITY DwarfCFIException : public DwarfCFIExceptionBase {
/// Per-function flag to indicate if .cfi_lsda should be emitted.
bool shouldEmitLSDA = false;
+ /// Per-function flag to indicate if frame CFI info should be emitted.
+ bool shouldEmitCFI = false;
+
+ /// Per-module flag to indicate if .cfi_section has beeen emitted.
+ bool hasEmittedCFISections = false;
+
public:
//===--------------------------------------------------------------------===//
// Main entry points.
@@ -64,7 +58,13 @@ class LLVM_LIBRARY_VISIBILITY DwarfCFIException : public DwarfCFIExceptionBase {
void endBasicBlockSection(const MachineBasicBlock &MBB) override;
};
-class LLVM_LIBRARY_VISIBILITY ARMException : public DwarfCFIExceptionBase {
+class LLVM_LIBRARY_VISIBILITY ARMException : public EHStreamer {
+ /// Per-function flag to indicate if frame CFI info should be emitted.
+ bool shouldEmitCFI = false;
+
+ /// Per-module flag to indicate if .cfi_section has beeen emitted.
+ bool hasEmittedCFISections = false;
+
void emitTypeInfos(unsigned TTypeEncoding, MCSymbol *TTBaseLabel) override;
ARMTargetStreamer &getTargetStreamer();
@@ -88,7 +88,7 @@ class LLVM_LIBRARY_VISIBILITY ARMException : public DwarfCFIExceptionBase {
void markFunctionEnd() override;
};
-class LLVM_LIBRARY_VISIBILITY AIXException : public DwarfCFIExceptionBase {
+class LLVM_LIBRARY_VISIBILITY AIXException : public EHStreamer {
/// This is AIX's compat unwind section, which unwinder would use
/// to find the location of LSDA area and personality rountine.
void emitExceptionInfoTable(const MCSymbol *LSDA, const MCSymbol *PerSym);
@@ -96,8 +96,6 @@ class LLVM_LIBRARY_VISIBILITY AIXException : public DwarfCFIExceptionBase {
public:
AIXException(AsmPrinter *A);
- void markFunctionEnd() override;
-
void endModule() override {}
void beginFunction(const MachineFunction *MF) override {}
void endFunction(const MachineFunction *MF) override;
diff --git a/llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp b/llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp
index 07a2efaf9383a..67e2c0e070958 100644
--- a/llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp
@@ -195,6 +195,12 @@ void EHStreamer::computePadMap(
const LandingPadInfo *LandingPad = LandingPads[i];
for (unsigned j = 0, E = LandingPad->BeginLabels.size(); j != E; ++j) {
MCSymbol *BeginLabel = LandingPad->BeginLabels[j];
+ MCSymbol *EndLabel = LandingPad->BeginLabels[j];
+ // If we have deleted the code for a given invoke after registering it in
+ // the LandingPad label list, the associated symbols will not have been
+ // emitted. In that case, ignore this callsite entry.
+ if (!BeginLabel->isDefined() || !EndLabel->isDefined())
+ continue;
assert(!PadMap.count(BeginLabel) && "Duplicate landing pad labels!");
PadRange P = { i, j };
PadMap[BeginLabel] = P;
@@ -383,8 +389,14 @@ MCSymbol *EHStreamer::emitExceptionTable() {
SmallVector<const LandingPadInfo *, 64> LandingPads;
LandingPads.reserve(PadInfos.size());
- for (const LandingPadInfo &LPI : PadInfos)
+ for (const LandingPadInfo &LPI : PadInfos) {
+ // If a landing-pad has an associated label, but the label wasn't ever
+ // emitted, then skip it. (This can occur if the landingpad's MBB was
+ // deleted).
+ if (LPI.LandingPadLabel && !LPI.LandingPadLabel->isDefined())
+ continue;
LandingPads.push_back(&LPI);
+ }
// Order landing pads lexicographically by type id.
llvm::sort(LandingPads, [](const LandingPadInfo *L, const LandingPadInfo *R) {
diff --git a/llvm/lib/CodeGen/AsmPrinter/WasmException.cpp b/llvm/lib/CodeGen/AsmPrinter/WasmException.cpp
index a514ff161ceea..bf65e525dde14 100644
--- a/llvm/lib/CodeGen/AsmPrinter/WasmException.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/WasmException.cpp
@@ -42,16 +42,6 @@ void WasmException::endModule() {
}
}
-void WasmException::markFunctionEnd() {
- // Get rid of any dead landing pads.
- if (!Asm->MF->getLandingPads().empty()) {
- auto *NonConstMF = const_cast<MachineFunction *>(Asm->MF);
- // Wasm does not set BeginLabel and EndLabel information for landing pads,
- // so we should set the second argument false.
- NonConstMF->tidyLandingPads(nullptr, /* TidyIfNoBeginLabels */ false);
- }
-}
-
void WasmException::endFunction(const MachineFunction *MF) {
bool ShouldEmitExceptionTable = false;
for (const LandingPadInfo &Info : MF->getLandingPads()) {
diff --git a/llvm/lib/CodeGen/AsmPrinter/WasmException.h b/llvm/lib/CodeGen/AsmPrinter/WasmException.h
index 419b569d123ca..86cc37dfde079 100644
--- a/llvm/lib/CodeGen/AsmPrinter/WasmException.h
+++ b/llvm/lib/CodeGen/AsmPrinter/WasmException.h
@@ -28,7 +28,6 @@ class LLVM_LIBRARY_VISIBILITY WasmException : public EHStreamer {
void endModule() override;
void beginFunction(const MachineFunction *MF) override {}
- void markFunctionEnd() override;
void endFunction(const MachineFunction *MF) override;
protected:
diff --git a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp b/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
index 2f1f15e1de39b..7a800438592cb 100644
--- a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
@@ -130,14 +130,6 @@ void WinException::endFunction(const MachineFunction *MF) {
if (F.hasPersonalityFn())
Per = classifyEHPersonality(F.getPersonalityFn()->stripPointerCasts());
- // Get rid of any dead landing pads if we're not using funclets. In funclet
- // schemes, the landing pad is not actually reachable. It only exists so
- // that we can emit the right table data.
- if (!isFuncletEHPersonality(Per)) {
- MachineFunction *NonConstMF = const_cast<MachineFunction*>(MF);
- NonConstMF->tidyLandingPads();
- }
-
endFuncletImpl();
// endFunclet will emit the necessary .xdata tables for table-based SEH.
diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp
index a7f0abc50119b..fad5981695abd 100644
--- a/llvm/lib/CodeGen/MachineFunction.cpp
+++ b/llvm/lib/CodeGen/MachineFunction.cpp
@@ -763,8 +763,10 @@ MCSymbol *MachineFunction::addLandingPad(MachineBasicBlock *LandingPad) {
dyn_cast<Function>(F.getPersonalityFn()->stripPointerCasts()))
getMMI().addPersonality(PF);
- if (LPI->isCleanup())
- addCleanup(LandingPad);
+ // If there's no typeid list specified, then "cleanup" is implicit.
+ // Otherwise, id 0 is reserved for the cleanup action.
+ if (LPI->isCleanup() && LPI->getNumClauses() != 0)
+ LP.TypeIds.push_back(0);
// FIXME: New EH - Add the clauses in reverse order. This isn't 100%
// correct, but we need to do it this way because of how the DWARF EH
@@ -772,23 +774,25 @@ MCSymbol *MachineFunction::addLandingPad(MachineBasicBlock *LandingPad) {
for (unsigned I = LPI->getNumClauses(); I != 0; --I) {
Value *Val = LPI->getClause(I - 1);
if (LPI->isCatch(I - 1)) {
- addCatchTypeInfo(LandingPad,
- dyn_cast<GlobalValue>(Val->stripPointerCasts()));
+ LP.TypeIds.push_back(
+ getTypeIDFor(dyn_cast<GlobalValue>(Val->stripPointerCasts())));
} else {
// Add filters in a list.
auto *CVal = cast<Constant>(Val);
- SmallVector<const GlobalValue *, 4> FilterList;
+ SmallVector<unsigned, 4> FilterList;
for (const Use &U : CVal->operands())
- FilterList.push_back(cast<GlobalValue>(U->stripPointerCasts()));
+ FilterList.push_back(
+ getTypeIDFor(cast<GlobalValue>(U->stripPointerCasts())));
- addFilterTypeInfo(LandingPad, FilterList);
+ LP.TypeIds.push_back(getFilterIDFor(FilterList));
}
}
} else if (const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
for (unsigned I = CPI->arg_size(); I != 0; --I) {
- Value *TypeInfo = CPI->getArgOperand(I - 1)->stripPointerCasts();
- addCatchTypeInfo(LandingPad, dyn_cast<GlobalValue>(TypeInfo));
+ auto *TypeInfo =
+ dyn_cast<GlobalValue>(CPI->getArgOperand(I - 1)->stripPointerCasts());
+ LP.TypeIds.push_back(getTypeIDFor(TypeInfo));
}
} else {
@@ -798,73 +802,6 @@ MCSymbol *MachineFunction::addLandingPad(MachineBasicBlock *LandingPad) {
return LandingPadLabel;
}
-void MachineFunction::addCatchTypeInfo(MachineBasicBlock *LandingPad,
- ArrayRef<const GlobalValue *> TyInfo) {
- LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
- for (const GlobalValue *GV : llvm::reverse(TyInfo))
- LP.TypeIds.push_back(getTypeIDFor(GV));
-}
-
-void MachineFunction::addFilterTypeInfo(MachineBasicBlock *LandingPad,
- ArrayRef<const GlobalValue *> TyInfo) {
- LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
- std::vector<unsigned> IdsInFilter(TyInfo.size());
- for (unsigned I = 0, E = TyInfo.size(); I != E; ++I)
- IdsInFilter[I] = getTypeIDFor(TyInfo[I]);
- LP.TypeIds.push_back(getFilterIDFor(IdsInFilter));
-}
-
-void MachineFunction::tidyLandingPads(DenseMap<MCSymbol *, uintptr_t> *LPMap,
- bool TidyIfNoBeginLabels) {
- for (unsigned i = 0; i != LandingPads.size(); ) {
- LandingPadInfo &LandingPad = LandingPads[i];
- if (LandingPad.LandingPadLabel &&
- !LandingPad.LandingPadLabel->isDefined() &&
- (!LPMap || (*LPMap)[LandingPad.LandingPadLabel] == 0))
- LandingPad.LandingPadLabel = nullptr;
-
- // Special case: we *should* emit LPs with null LP MBB. This indicates
- // "nounwind" case.
- if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) {
- LandingPads.erase(LandingPads.begin() + i);
- continue;
- }
-
- if (TidyIfNoBeginLabels) {
- for (unsigned j = 0, e = LandingPads[i].BeginLabels.size(); j != e; ++j) {
- MCSymbol *BeginLabel = LandingPad.BeginLabels[j];
- MCSymbol *EndLabel = LandingPad.EndLabels[j];
- if ((BeginLabel->isDefined() || (LPMap && (*LPMap)[BeginLabel] != 0)) &&
- (EndLabel->isDefined() || (LPMap && (*LPMap)[EndLabel] != 0)))
- continue;
-
- LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j);
- LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j);
- --j;
- --e;
- }
-
- // Remove landing pads with no try-ranges.
- if (LandingPads[i].BeginLabels.empty()) {
- LandingPads.erase(LandingPads.begin() + i);
- continue;
- }
- }
-
- // If there is no landing pad, ensure that the list of typeids is empty.
- // If the only typeid is a cleanup, this is the same as having no typeids.
- if (!LandingPad.LandingPadBlock ||
- (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0]))
- LandingPad.TypeIds.clear();
- ++i;
- }
-}
-
-void MachineFunction::addCleanup(MachineBasicBlock *LandingPad) {
- LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
- LP.TypeIds.push_back(0);
-}
-
void MachineFunction::setCallSiteLandingPad(MCSymbol *Sym,
ArrayRef<unsigned> Sites) {
LPadToCallSiteMap[Sym].append(Sites.begin(), Sites.end());
@@ -878,7 +815,7 @@ unsigned MachineFunction::getTypeIDFor(const GlobalValue *TI) {
return TypeInfos.size();
}
-int MachineFunction::getFilterIDFor(std::vector<unsigned> &TyIds) {
+int MachineFunction::getFilterIDFor(ArrayRef<unsigned> TyIds) {
// If the new filter coincides with the tail of an existing filter, then
// re-use the existing filter. Folding filters more than this requires
// re-ordering filters and/or their elements - probably not worth it.
More information about the llvm-commits
mailing list