diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-12-02 23:09:05 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-12-02 23:09:05 +0000 |
commit | 6f4583c51155b2ead6c05c7eb668b2242541dd36 (patch) | |
tree | 03cf96048d62b121cf36bb1fb9a4836ddf372514 /llvm/lib/Analysis | |
parent | 8d8b229de96f356a5d078799a2d92d867c611bcf (diff) | |
download | bcm5719-llvm-6f4583c51155b2ead6c05c7eb668b2242541dd36.tar.gz bcm5719-llvm-6f4583c51155b2ead6c05c7eb668b2242541dd36.zip |
Forgot to add this file with r254562.
llvm-svn: 254565
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/EHPersonalities.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/EHPersonalities.cpp b/llvm/lib/Analysis/EHPersonalities.cpp new file mode 100644 index 00000000000..1d1b5fe11f6 --- /dev/null +++ b/llvm/lib/Analysis/EHPersonalities.cpp @@ -0,0 +1,41 @@ +//===- EHPersonalities.cpp - Compute EH-related information ---------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Analysis/EHPersonalities.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/IR/Function.h" +using namespace llvm; + +/// 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(const Value *Pers) { + const Function *F = + Pers ? dyn_cast<Function>(Pers->stripPointerCasts()) : nullptr; + 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("_except_handler3", EHPersonality::MSVC_X86SEH) + .Case("_except_handler4", EHPersonality::MSVC_X86SEH) + .Case("__C_specific_handler", EHPersonality::MSVC_Win64SEH) + .Case("__CxxFrameHandler3", EHPersonality::MSVC_CXX) + .Case("ProcessCLRException", EHPersonality::CoreCLR) + .Default(EHPersonality::Unknown); +} + +bool llvm::canSimplifyInvokeNoUnwind(const Function *F) { + EHPersonality Personality = classifyEHPersonality(F->getPersonalityFn()); + // We can't simplify any invokes to nounwind functions if the personality + // function wants to catch asynch exceptions. The nounwind attribute only + // implies that the function does not throw synchronous exceptions. + return !isAsynchronousEHPersonality(Personality); +} |