From 2d5fb68ee0149129c29ac6a0bfe93814de5e317e Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Sat, 14 Feb 2015 00:21:02 +0000 Subject: [PATCH] Unify the two EH personality classification routines I wrote We only need one. llvm-svn: 229193 --- llvm/include/llvm/Analysis/LibCallSemantics.h | 2 +- llvm/include/llvm/CodeGen/MachineModuleInfo.h | 16 ++-------------- llvm/lib/Analysis/LibCallSemantics.cpp | 4 ++-- llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp | 2 +- llvm/lib/CodeGen/MachineModuleInfo.cpp | 15 +++++---------- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 2 +- 6 files changed, 12 insertions(+), 29 deletions(-) diff --git a/llvm/include/llvm/Analysis/LibCallSemantics.h b/llvm/include/llvm/Analysis/LibCallSemantics.h index df26024..e6427a4 100644 --- a/llvm/include/llvm/Analysis/LibCallSemantics.h +++ b/llvm/include/llvm/Analysis/LibCallSemantics.h @@ -177,7 +177,7 @@ class InvokeInst; /// \brief See if the given exception handling personality function is one /// that we understand. If so, return a description of it; otherwise return /// Unknown. - EHPersonality classifyEHPersonality(Value *Pers); + EHPersonality classifyEHPersonality(const Value *Pers); /// \brief Returns true if this personality function catches asynchronous /// exceptions. diff --git a/llvm/include/llvm/CodeGen/MachineModuleInfo.h b/llvm/include/llvm/CodeGen/MachineModuleInfo.h index a6fe01b..f171df2 100644 --- a/llvm/include/llvm/CodeGen/MachineModuleInfo.h +++ b/llvm/include/llvm/CodeGen/MachineModuleInfo.h @@ -35,6 +35,7 @@ #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/Analysis/LibCallSemantics.h" #include "llvm/IR/DebugLoc.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/ValueHandle.h" @@ -46,13 +47,6 @@ namespace llvm { -/// Different personality functions used by a function. -enum class EHPersonality { - None, /// No exception handling - Itanium, /// An Itanium C++ EH personality like __gxx_personality_seh0 - Win64SEH, /// x86_64 SEH, uses __C_specific_handler -}; - //===----------------------------------------------------------------------===// // Forward declarations. class Constant; @@ -178,8 +172,6 @@ class MachineModuleInfo : public ImmutablePass { EHPersonality PersonalityTypeCache; - EHPersonality getPersonalityTypeSlow(); - public: static char ID; // Pass identification, replacement for typeid @@ -425,11 +417,7 @@ public: const Function *getPersonality() const; /// Classify the personality function amongst known EH styles. - EHPersonality getPersonalityType() { - if (PersonalityTypeCache != EHPersonality::None) - return PersonalityTypeCache; - return getPersonalityTypeSlow(); - } + EHPersonality getPersonalityType(); /// setVariableDbgInfo - Collect information used to emit debugging /// information of a variable. diff --git a/llvm/lib/Analysis/LibCallSemantics.cpp b/llvm/lib/Analysis/LibCallSemantics.cpp index 6c2ebdb..cf752dd 100644 --- a/llvm/lib/Analysis/LibCallSemantics.cpp +++ b/llvm/lib/Analysis/LibCallSemantics.cpp @@ -64,8 +64,8 @@ LibCallInfo::getFunctionInfo(const Function *F) const { /// See if the given exception handling personality function is one that we /// understand. If so, return a description of it; otherwise return Unknown. -EHPersonality llvm::classifyEHPersonality(Value *Pers) { - Function *F = dyn_cast(Pers->stripPointerCasts()); +EHPersonality llvm::classifyEHPersonality(const Value *Pers) { + const Function *F = dyn_cast(Pers->stripPointerCasts()); if (!F) return EHPersonality::Unknown; return StringSwitch(F->getName()) diff --git a/llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp b/llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp index ff12d5d..2b03877 100644 --- a/llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp @@ -106,7 +106,7 @@ void Win64Exception::endFunction(const MachineFunction *) { // Emit the tables appropriate to the personality function in use. If we // don't recognize the personality, assume it uses an Itanium-style LSDA. EHPersonality Per = MMI->getPersonalityType(); - if (Per == EHPersonality::Win64SEH) + if (Per == EHPersonality::MSVC_Win64SEH) emitCSpecificHandlerTable(); else emitExceptionTable(); diff --git a/llvm/lib/CodeGen/MachineModuleInfo.cpp b/llvm/lib/CodeGen/MachineModuleInfo.cpp index b4ce673..fca7df0 100644 --- a/llvm/lib/CodeGen/MachineModuleInfo.cpp +++ b/llvm/lib/CodeGen/MachineModuleInfo.cpp @@ -9,6 +9,7 @@ #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/ADT/PointerUnion.h" +#include "llvm/Analysis/LibCallSemantics.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" @@ -276,7 +277,7 @@ bool MachineModuleInfo::doInitialization(Module &M) { DbgInfoAvailable = UsesVAFloatArgument = UsesMorestackAddr = false; // Always emit some info, by default "no personality" info. Personalities.push_back(nullptr); - PersonalityTypeCache = EHPersonality::None; + PersonalityTypeCache = EHPersonality::Unknown; AddrLabelSymbols = nullptr; TheModule = nullptr; @@ -561,17 +562,11 @@ const Function *MachineModuleInfo::getPersonality() const { return nullptr; } -EHPersonality MachineModuleInfo::getPersonalityTypeSlow() { - const Function *Per = getPersonality(); - if (!Per) - PersonalityTypeCache = EHPersonality::None; - else if (Per->getName() == "__C_specific_handler") - PersonalityTypeCache = EHPersonality::Win64SEH; - else // Assume everything else is Itanium. - PersonalityTypeCache = EHPersonality::Itanium; +EHPersonality MachineModuleInfo::getPersonalityType() { + if (PersonalityTypeCache == EHPersonality::Unknown) + PersonalityTypeCache = classifyEHPersonality(getPersonality()); return PersonalityTypeCache; } - /// getPersonalityIndex - Return unique index for current personality /// function. NULL/first personality function should always get zero index. unsigned MachineModuleInfo::getPersonalityIndex() const { diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 1855ab3..5e867cf 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -930,7 +930,7 @@ void SelectionDAGISel::PrepareEHLandingPad() { const LandingPadInst *LPadInst = LLVMBB->getLandingPadInst(); MF->getMMI().addPersonality( MBB, cast(LPadInst->getPersonalityFn()->stripPointerCasts())); - if (MF->getMMI().getPersonalityType() == EHPersonality::Win64SEH) { + if (MF->getMMI().getPersonalityType() == EHPersonality::MSVC_Win64SEH) { // Make virtual registers and a series of labels that fill in values for the // clauses. auto &RI = MF->getRegInfo(); -- 2.7.4