summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/LibCallSemantics.cpp
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2015-01-28 01:17:38 +0000
committerReid Kleckner <reid@kleckner.net>2015-01-28 01:17:38 +0000
commit4af6415237afc23d8c35979cff25fa1ae84dddd3 (patch)
tree39e0e7dd1fdc760afc5e13bb9237902635691326 /llvm/lib/Analysis/LibCallSemantics.cpp
parentd1f2536829d6db4faaaffb57a0fd4329a818d652 (diff)
downloadbcm5719-llvm-4af6415237afc23d8c35979cff25fa1ae84dddd3.tar.gz
bcm5719-llvm-4af6415237afc23d8c35979cff25fa1ae84dddd3.zip
Move EH personality type classification to Analysis/LibCallSemantics.h
Summary: Also add enum types for __C_specific_handler and _CxxFrameHandler3 for which we know a few things. Reviewers: majnemer Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D7214 llvm-svn: 227284
Diffstat (limited to 'llvm/lib/Analysis/LibCallSemantics.cpp')
-rw-r--r--llvm/lib/Analysis/LibCallSemantics.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/LibCallSemantics.cpp b/llvm/lib/Analysis/LibCallSemantics.cpp
index 23639e71232..3a345c45d07 100644
--- a/llvm/lib/Analysis/LibCallSemantics.cpp
+++ b/llvm/lib/Analysis/LibCallSemantics.cpp
@@ -15,6 +15,7 @@
#include "llvm/Analysis/LibCallSemantics.h"
#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/StringSwitch.h"
#include "llvm/IR/Function.h"
using namespace llvm;
@@ -61,3 +62,18 @@ LibCallInfo::getFunctionInfo(const Function *F) const {
return Map->lookup(F->getName());
}
+/// 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());
+ if (!F)
+ return EHPersonality::Unknown;
+ return StringSwitch<EHPersonality>(F->getName())
+ .Case("__gnat_eh_personality", EHPersonality::GNU_Ada)
+ .Case("__gxx_personality_v0", EHPersonality::GNU_CXX)
+ .Case("__gcc_personality_v0", EHPersonality::GNU_C)
+ .Case("__objc_personality_v0", EHPersonality::GNU_ObjC)
+ .Case("__C_specific_handler", EHPersonality::MSVC_Win64SEH)
+ .Case("__CxxFrameHandler3", EHPersonality::MSVC_CXX)
+ .Default(EHPersonality::Unknown);
+}
OpenPOWER on IntegriCloud