diff options
author | Reid Kleckner <reid@kleckner.net> | 2015-01-28 01:17:38 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2015-01-28 01:17:38 +0000 |
commit | 4af6415237afc23d8c35979cff25fa1ae84dddd3 (patch) | |
tree | 39e0e7dd1fdc760afc5e13bb9237902635691326 /llvm/lib/Analysis/LibCallSemantics.cpp | |
parent | d1f2536829d6db4faaaffb57a0fd4329a818d652 (diff) | |
download | bcm5719-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.cpp | 16 |
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); +} |