forked from OSchip/llvm-project
[NFC] Refactor how CFI section types are represented in AsmPrinter
In terms of readability, the `enum CFIMoveType` didn't better document what it intends to convey i.e. the type of CFI section that gets emitted. Reviewed By: dblaikie, MaskRay Differential Revision: https://reviews.llvm.org/D76519
This commit is contained in:
parent
ef2dc7ed9f
commit
0ce723cb22
|
@ -157,6 +157,13 @@ public:
|
|||
TimerGroupDescription(TimerGroupDescription) {}
|
||||
};
|
||||
|
||||
// Flags representing which CFI section is required for a function/module.
|
||||
enum class CFISection : unsigned {
|
||||
None = 0, ///< Do not emit either .eh_frame or .debug_frame
|
||||
EH = 1, ///< Emit .eh_frame
|
||||
Debug = 2 ///< Emit .debug_frame
|
||||
};
|
||||
|
||||
private:
|
||||
MCSymbol *CurrentFnEnd = nullptr;
|
||||
|
||||
|
@ -199,8 +206,8 @@ private:
|
|||
/// context.
|
||||
PseudoProbeHandler *PP = nullptr;
|
||||
|
||||
/// If the current module uses dwarf CFI annotations strictly for debugging.
|
||||
bool isCFIMoveForDebugging = false;
|
||||
/// CFISection type the module needs i.e. either .eh_frame or .debug_frame.
|
||||
CFISection ModuleCFISection = CFISection::None;
|
||||
|
||||
protected:
|
||||
explicit AsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer);
|
||||
|
@ -357,12 +364,14 @@ public:
|
|||
|
||||
void emitRemarksSection(remarks::RemarkStreamer &RS);
|
||||
|
||||
enum CFIMoveType { CFI_M_None, CFI_M_EH, CFI_M_Debug };
|
||||
CFIMoveType needsCFIMoves() const;
|
||||
/// Get the CFISection type for a function.
|
||||
CFISection getFunctionCFISectionType(const Function &F) const;
|
||||
|
||||
/// Returns false if needsCFIMoves() == CFI_M_EH for any function
|
||||
/// in the module.
|
||||
bool needsOnlyDebugCFIMoves() const { return isCFIMoveForDebugging; }
|
||||
/// Get the CFISection type for a function.
|
||||
CFISection getFunctionCFISectionType(const MachineFunction &MF) const;
|
||||
|
||||
/// Get the CFISection type for the module.
|
||||
CFISection getModuleCFISectionType() const { return ModuleCFISection; }
|
||||
|
||||
bool needsSEHMoves();
|
||||
|
||||
|
|
|
@ -39,13 +39,13 @@ void ARMException::beginFunction(const MachineFunction *MF) {
|
|||
if (Asm->MAI->getExceptionHandlingType() == ExceptionHandling::ARM)
|
||||
getTargetStreamer().emitFnStart();
|
||||
// See if we need call frame info.
|
||||
AsmPrinter::CFIMoveType MoveType = Asm->needsCFIMoves();
|
||||
assert(MoveType != AsmPrinter::CFI_M_EH &&
|
||||
AsmPrinter::CFISection CFISecType = Asm->getFunctionCFISectionType(*MF);
|
||||
assert(CFISecType != AsmPrinter::CFISection::EH &&
|
||||
"non-EH CFI not yet supported in prologue with EHABI lowering");
|
||||
|
||||
if (MoveType == AsmPrinter::CFI_M_Debug) {
|
||||
if (CFISecType == AsmPrinter::CFISection::Debug) {
|
||||
if (!hasEmittedCFISections) {
|
||||
if (Asm->needsOnlyDebugCFIMoves())
|
||||
if (Asm->getModuleCFISectionType() == AsmPrinter::CFISection::Debug)
|
||||
Asm->OutStreamer->emitCFISections(false, true);
|
||||
hasEmittedCFISections = true;
|
||||
}
|
||||
|
|
|
@ -351,21 +351,18 @@ bool AsmPrinter::doInitialization(Module &M) {
|
|||
case ExceptionHandling::SjLj:
|
||||
case ExceptionHandling::DwarfCFI:
|
||||
case ExceptionHandling::ARM:
|
||||
isCFIMoveForDebugging = true;
|
||||
if (MAI->getExceptionHandlingType() != ExceptionHandling::DwarfCFI)
|
||||
break;
|
||||
for (auto &F: M.getFunctionList()) {
|
||||
// If the module contains any function with unwind data,
|
||||
// .eh_frame has to be emitted.
|
||||
// Ignore functions that won't get emitted.
|
||||
if (!F.isDeclarationForLinker() && F.needsUnwindTableEntry()) {
|
||||
isCFIMoveForDebugging = false;
|
||||
for (auto &F : M.getFunctionList()) {
|
||||
// If any function needsUnwindTableEntry(), it needs .eh_frame and hence
|
||||
// the module needs .eh_frame. If we have found that case, we are done.
|
||||
if (ModuleCFISection == AsmPrinter::CFISection::EH)
|
||||
break;
|
||||
}
|
||||
if (ModuleCFISection == AsmPrinter::CFISection::None)
|
||||
ModuleCFISection = getFunctionCFISectionType(F);
|
||||
}
|
||||
assert(MAI->getExceptionHandlingType() == ExceptionHandling::DwarfCFI ||
|
||||
ModuleCFISection != AsmPrinter::CFISection::EH);
|
||||
break;
|
||||
default:
|
||||
isCFIMoveForDebugging = false;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1037,15 +1034,25 @@ static bool emitDebugLabelComment(const MachineInstr *MI, AsmPrinter &AP) {
|
|||
return true;
|
||||
}
|
||||
|
||||
AsmPrinter::CFIMoveType AsmPrinter::needsCFIMoves() const {
|
||||
AsmPrinter::CFISection
|
||||
AsmPrinter::getFunctionCFISectionType(const Function &F) const {
|
||||
// Ignore functions that won't get emitted.
|
||||
if (F.isDeclarationForLinker())
|
||||
return CFISection::None;
|
||||
|
||||
if (MAI->getExceptionHandlingType() == ExceptionHandling::DwarfCFI &&
|
||||
MF->getFunction().needsUnwindTableEntry())
|
||||
return CFI_M_EH;
|
||||
F.needsUnwindTableEntry())
|
||||
return CFISection::EH;
|
||||
|
||||
if (MMI->hasDebugInfo() || MF->getTarget().Options.ForceDwarfFrameSection)
|
||||
return CFI_M_Debug;
|
||||
if (MMI->hasDebugInfo() || TM.Options.ForceDwarfFrameSection)
|
||||
return CFISection::Debug;
|
||||
|
||||
return CFI_M_None;
|
||||
return CFISection::None;
|
||||
}
|
||||
|
||||
AsmPrinter::CFISection
|
||||
AsmPrinter::getFunctionCFISectionType(const MachineFunction &MF) const {
|
||||
return getFunctionCFISectionType(MF.getFunction());
|
||||
}
|
||||
|
||||
bool AsmPrinter::needsSEHMoves() {
|
||||
|
@ -1058,7 +1065,7 @@ void AsmPrinter::emitCFIInstruction(const MachineInstr &MI) {
|
|||
ExceptionHandlingType != ExceptionHandling::ARM)
|
||||
return;
|
||||
|
||||
if (needsCFIMoves() == CFI_M_None)
|
||||
if (getFunctionCFISectionType(*MF) == AsmPrinter::CFISection::None)
|
||||
return;
|
||||
|
||||
// If there is no "real" instruction following this CFI instruction, skip
|
||||
|
|
|
@ -93,9 +93,8 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) {
|
|||
bool hasLandingPads = !MF->getLandingPads().empty();
|
||||
|
||||
// See if we need frame move info.
|
||||
AsmPrinter::CFIMoveType MoveType = Asm->needsCFIMoves();
|
||||
|
||||
bool shouldEmitMoves = MoveType != AsmPrinter::CFI_M_None;
|
||||
bool shouldEmitMoves =
|
||||
Asm->getFunctionCFISectionType(*MF) != AsmPrinter::CFISection::None;
|
||||
|
||||
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
|
||||
unsigned PerEncoding = TLOF.getPersonalityEncoding();
|
||||
|
@ -132,10 +131,14 @@ void DwarfCFIException::beginFragment(const MachineBasicBlock *MBB,
|
|||
return;
|
||||
|
||||
if (!hasEmittedCFISections) {
|
||||
if (Asm->needsOnlyDebugCFIMoves())
|
||||
Asm->OutStreamer->emitCFISections(false, true);
|
||||
else if (Asm->TM.Options.ForceDwarfFrameSection)
|
||||
Asm->OutStreamer->emitCFISections(true, true);
|
||||
AsmPrinter::CFISection CFISecType = Asm->getModuleCFISectionType();
|
||||
// If we don't say anything it implies `.cfi_sections .eh_frame`, so we
|
||||
// chose not to be verbose in that case. And with `ForceDwarfFrameSection`,
|
||||
// we should always emit .debug_frame.
|
||||
if (CFISecType == AsmPrinter::CFISection::Debug ||
|
||||
Asm->TM.Options.ForceDwarfFrameSection)
|
||||
Asm->OutStreamer->emitCFISections(
|
||||
CFISecType == AsmPrinter::CFISection::EH, true);
|
||||
hasEmittedCFISections = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1229,7 +1229,7 @@ void AArch64AsmPrinter::emitInstruction(const MachineInstr *MI) {
|
|||
ExceptionHandlingType != ExceptionHandling::ARM)
|
||||
return;
|
||||
|
||||
if (needsCFIMoves() == CFI_M_None)
|
||||
if (getFunctionCFISectionType(*MF) == CFISection::None)
|
||||
return;
|
||||
|
||||
OutStreamer->emitCFIBKeyFrame();
|
||||
|
|
Loading…
Reference in New Issue