Unify the two EH personality classification routines I wrote
authorReid Kleckner <reid@kleckner.net>
Sat, 14 Feb 2015 00:21:02 +0000 (00:21 +0000)
committerReid Kleckner <reid@kleckner.net>
Sat, 14 Feb 2015 00:21:02 +0000 (00:21 +0000)
We only need one.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229193 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/LibCallSemantics.h
include/llvm/CodeGen/MachineModuleInfo.h
lib/Analysis/LibCallSemantics.cpp
lib/CodeGen/AsmPrinter/Win64Exception.cpp
lib/CodeGen/MachineModuleInfo.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index df26024f45e2cf5a5f33f3cc78c7fe5a753e615d..e6427a4b2ec4bc6767cfc8d92ba3baf0d375fbda 100644 (file)
@@ -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.
index a6fe01b8ce8689b9b08492c005ea7ead867c9325..f171df20e764b1160f1fcbc81f7027944e1567ca 100644 (file)
@@ -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"
 
 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.
index 6c2ebdb4594fbb7a939185b122c843f2a1983ec5..cf752dd8e0e49c1ac98d0b4398eb644e8bbbcd5b 100644 (file)
@@ -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<Function>(Pers->stripPointerCasts());
+EHPersonality llvm::classifyEHPersonality(const Value *Pers) {
+  const Function *F = dyn_cast<Function>(Pers->stripPointerCasts());
   if (!F)
     return EHPersonality::Unknown;
   return StringSwitch<EHPersonality>(F->getName())
index ff12d5d3247de33d39dc3a99964e2ee23c62cb04..2b03877faecc89298e925a7bafde0140fd9d2ab5 100644 (file)
@@ -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();
index b4ce673659f79cb2541406e777392642d7ed6de4..fca7df097b6493e4e54e02d2134bc5087864239e 100644 (file)
@@ -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 {
index 1855ab340be8ef069975dd590b157e5c2a7dffa2..5e867cf6aec1b003e87bc895403f250e306a0521 100644 (file)
@@ -930,7 +930,7 @@ void SelectionDAGISel::PrepareEHLandingPad() {
   const LandingPadInst *LPadInst = LLVMBB->getLandingPadInst();
   MF->getMMI().addPersonality(
       MBB, cast<Function>(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();