mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-23 11:49:50 +00:00
Move EH-specific helper functions to a more appropriate place
No functionality change is intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254562 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
66c86b0417
commit
1114aa2fc6
83
include/llvm/Analysis/EHPersonalities.h
Normal file
83
include/llvm/Analysis/EHPersonalities.h
Normal file
@ -0,0 +1,83 @@
|
||||
//===- EHPersonalities.h - 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.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_ANALYSIS_LIBCALLSEMANTICS_H
|
||||
#define LLVM_ANALYSIS_LIBCALLSEMANTICS_H
|
||||
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
|
||||
namespace llvm {
|
||||
class Function;
|
||||
class Value;
|
||||
|
||||
enum class EHPersonality {
|
||||
Unknown,
|
||||
GNU_Ada,
|
||||
GNU_C,
|
||||
GNU_CXX,
|
||||
GNU_ObjC,
|
||||
MSVC_X86SEH,
|
||||
MSVC_Win64SEH,
|
||||
MSVC_CXX,
|
||||
CoreCLR
|
||||
};
|
||||
|
||||
/// \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(const Value *Pers);
|
||||
|
||||
/// \brief Returns true if this personality function catches asynchronous
|
||||
/// exceptions.
|
||||
inline bool isAsynchronousEHPersonality(EHPersonality Pers) {
|
||||
// The two SEH personality functions can catch asynch exceptions. We assume
|
||||
// unknown personalities don't catch asynch exceptions.
|
||||
switch (Pers) {
|
||||
case EHPersonality::MSVC_X86SEH:
|
||||
case EHPersonality::MSVC_Win64SEH:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
llvm_unreachable("invalid enum");
|
||||
}
|
||||
|
||||
/// \brief Returns true if this is a personality function that invokes
|
||||
/// handler funclets (which must return to it).
|
||||
inline bool isFuncletEHPersonality(EHPersonality Pers) {
|
||||
switch (Pers) {
|
||||
case EHPersonality::MSVC_CXX:
|
||||
case EHPersonality::MSVC_X86SEH:
|
||||
case EHPersonality::MSVC_Win64SEH:
|
||||
case EHPersonality::CoreCLR:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
llvm_unreachable("invalid enum");
|
||||
}
|
||||
|
||||
/// \brief Return true if this personality may be safely removed if there
|
||||
/// are no invoke instructions remaining in the current function.
|
||||
inline bool isNoOpWithoutInvoke(EHPersonality Pers) {
|
||||
switch (Pers) {
|
||||
case EHPersonality::Unknown:
|
||||
return false;
|
||||
// All known personalities currently have this behavior
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
llvm_unreachable("invalid enum");
|
||||
}
|
||||
|
||||
bool canSimplifyInvokeNoUnwind(const Function *F);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
@ -1,84 +0,0 @@
|
||||
//===- LibCallSemantics.h - Describe library semantics --------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines interfaces that can be used to describe language specific
|
||||
// runtime library interfaces (e.g. libc, libm, etc) to LLVM optimizers.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_ANALYSIS_LIBCALLSEMANTICS_H
|
||||
#define LLVM_ANALYSIS_LIBCALLSEMANTICS_H
|
||||
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
|
||||
namespace llvm {
|
||||
class InvokeInst;
|
||||
|
||||
enum class EHPersonality {
|
||||
Unknown,
|
||||
GNU_Ada,
|
||||
GNU_C,
|
||||
GNU_CXX,
|
||||
GNU_ObjC,
|
||||
MSVC_X86SEH,
|
||||
MSVC_Win64SEH,
|
||||
MSVC_CXX,
|
||||
CoreCLR
|
||||
};
|
||||
|
||||
/// \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(const Value *Pers);
|
||||
|
||||
/// \brief Returns true if this personality function catches asynchronous
|
||||
/// exceptions.
|
||||
inline bool isAsynchronousEHPersonality(EHPersonality Pers) {
|
||||
// The two SEH personality functions can catch asynch exceptions. We assume
|
||||
// unknown personalities don't catch asynch exceptions.
|
||||
switch (Pers) {
|
||||
case EHPersonality::MSVC_X86SEH:
|
||||
case EHPersonality::MSVC_Win64SEH:
|
||||
return true;
|
||||
default: return false;
|
||||
}
|
||||
llvm_unreachable("invalid enum");
|
||||
}
|
||||
|
||||
/// \brief Returns true if this is a personality function that invokes
|
||||
/// handler funclets (which must return to it).
|
||||
inline bool isFuncletEHPersonality(EHPersonality Pers) {
|
||||
switch (Pers) {
|
||||
case EHPersonality::MSVC_CXX:
|
||||
case EHPersonality::MSVC_X86SEH:
|
||||
case EHPersonality::MSVC_Win64SEH:
|
||||
case EHPersonality::CoreCLR:
|
||||
return true;
|
||||
default: return false;
|
||||
}
|
||||
llvm_unreachable("invalid enum");
|
||||
}
|
||||
|
||||
/// \brief Return true if this personality may be safely removed if there
|
||||
/// are no invoke instructions remaining in the current function.
|
||||
inline bool isNoOpWithoutInvoke(EHPersonality Pers) {
|
||||
switch (Pers) {
|
||||
case EHPersonality::Unknown:
|
||||
return false;
|
||||
// All known personalities currently have this behavior
|
||||
default: return true;
|
||||
}
|
||||
llvm_unreachable("invalid enum");
|
||||
}
|
||||
|
||||
bool canSimplifyInvokeNoUnwind(const Function *F);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
@ -35,7 +35,7 @@
|
||||
#include "llvm/ADT/PointerIntPair.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
|
@ -22,6 +22,7 @@
|
||||
namespace llvm {
|
||||
class AllocaInst;
|
||||
class BasicBlock;
|
||||
class CatchReturnInst;
|
||||
class Constant;
|
||||
class Function;
|
||||
class GlobalVariable;
|
||||
|
@ -25,6 +25,7 @@ add_llvm_library(LLVMAnalysis
|
||||
DivergenceAnalysis.cpp
|
||||
DomPrinter.cpp
|
||||
DominanceFrontier.cpp
|
||||
EHPersonalities.cpp
|
||||
GlobalsModRef.cpp
|
||||
IVUsers.cpp
|
||||
InlineCost.cpp
|
||||
@ -35,7 +36,6 @@ add_llvm_library(LLVMAnalysis
|
||||
IteratedDominanceFrontier.cpp
|
||||
LazyCallGraph.cpp
|
||||
LazyValueInfo.cpp
|
||||
LibCallSemantics.cpp
|
||||
Lint.cpp
|
||||
Loads.cpp
|
||||
LoopAccessAnalysis.cpp
|
||||
|
@ -1,47 +0,0 @@
|
||||
//===- LibCallSemantics.cpp - Describe library semantics ------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements interfaces that can be used to describe language
|
||||
// specific runtime library interfaces (e.g. libc, libm, etc) to LLVM
|
||||
// optimizers.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Analysis/LibCallSemantics.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);
|
||||
}
|
@ -16,7 +16,7 @@
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/Analysis/CFG.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||
#include "llvm/IR/Dominators.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/CodeGen/MachineConstantPool.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunctionInitializer.h"
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/ADT/PointerUnion.h"
|
||||
#include "llvm/ADT/TinyPtrVector.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include "llvm/ADT/DepthFirstIterator.h"
|
||||
#include "llvm/ADT/SetOperations.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
|
||||
#include "llvm/CodeGen/LiveStackAnalysis.h"
|
||||
#include "llvm/CodeGen/LiveVariables.h"
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/Analysis/BranchProbabilityInfo.h"
|
||||
#include "llvm/Analysis/CFG.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||
#include "llvm/CodeGen/Analysis.h"
|
||||
#include "llvm/CodeGen/FastISel.h"
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
#include "llvm/Analysis/CFG.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/CodeGen/WinEHFuncInfo.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include "X86InstrInfo.h"
|
||||
#include "X86MachineFunctionInfo.h"
|
||||
#include "X86Subtarget.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/CodeGen/Passes.h" // For IDs of passes that are preserved.
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include "X86Subtarget.h"
|
||||
#include "X86TargetMachine.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
|
@ -25,7 +25,7 @@
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/CodeGen/IntrinsicLowering.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
|
@ -15,7 +15,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "X86.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/CodeGen/WinEHFuncInfo.h"
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Analysis/CallGraph.h"
|
||||
#include "llvm/Analysis/CallGraphSCCPass.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/IR/CFG.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
|
@ -42,9 +42,9 @@
|
||||
#include "llvm/Analysis/AssumptionCache.h"
|
||||
#include "llvm/Analysis/CFG.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/Analysis/GlobalsModRef.h"
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/Analysis/MemoryBuiltins.h"
|
||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||
|
@ -31,7 +31,7 @@
|
||||
#include "llvm/Transforms/Instrumentation.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DebugInfo.h"
|
||||
|
@ -20,8 +20,8 @@
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/MemoryBuiltins.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/IR/CFG.h"
|
||||
|
Loading…
Reference in New Issue
Block a user