mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Unify the two EH personality classification routines I wrote
We only need one. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229193 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
efd49ea0d2
commit
f7f5309424
@ -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.
|
||||
|
@ -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"
|
||||
@ -46,13 +47,6 @@
|
||||
|
||||
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.
|
||||
|
@ -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())
|
||||
|
@ -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();
|
||||
|
@ -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 {
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user