mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-29 10:25:12 +00:00
Move the personality function from LandingPadInst to Function
The personality routine currently lives in the LandingPadInst. This isn't desirable because: - All LandingPadInsts in the same function must have the same personality routine. This means that each LandingPadInst beyond the first has an operand which produces no additional information. - There is ongoing work to introduce EH IR constructs other than LandingPadInst. Moving the personality routine off of any one particular Instruction and onto the parent function seems a lot better than have N different places a personality function can sneak onto an exceptional function. Differential Revision: http://reviews.llvm.org/D10429 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239940 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/IR/CallingConv.h"
|
||||
#include "llvm/IR/GlobalObject.h"
|
||||
#include "llvm/IR/OperandTraits.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
|
||||
namespace llvm {
|
||||
@@ -119,11 +120,22 @@ private:
|
||||
public:
|
||||
static Function *Create(FunctionType *Ty, LinkageTypes Linkage,
|
||||
const Twine &N = "", Module *M = nullptr) {
|
||||
return new(0) Function(Ty, Linkage, N, M);
|
||||
return new(1) Function(Ty, Linkage, N, M);
|
||||
}
|
||||
|
||||
~Function() override;
|
||||
|
||||
/// \brief Provide fast operand accessors
|
||||
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
|
||||
|
||||
/// \brief Get the personality function associated with this function.
|
||||
bool hasPersonalityFn() const { return getNumOperands() != 0; }
|
||||
Constant *getPersonalityFn() const {
|
||||
assert(hasPersonalityFn());
|
||||
return cast<Constant>(Op<0>());
|
||||
}
|
||||
void setPersonalityFn(Constant *C);
|
||||
|
||||
Type *getReturnType() const; // Return the type of the ret val
|
||||
FunctionType *getFunctionType() const; // Return the FunctionType for me
|
||||
|
||||
@@ -601,6 +613,11 @@ ilist_traits<Argument>::getSymTab(Function *F) {
|
||||
return F ? &F->getValueSymbolTable() : nullptr;
|
||||
}
|
||||
|
||||
template <>
|
||||
struct OperandTraits<Function> : public OptionalOperandTraits<Function> {};
|
||||
|
||||
DEFINE_TRANSPARENT_OPERAND_ACCESSORS(Function, Value)
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
@@ -1556,9 +1556,9 @@ public:
|
||||
return Insert(InsertValueInst::Create(Agg, Val, Idxs), Name);
|
||||
}
|
||||
|
||||
LandingPadInst *CreateLandingPad(Type *Ty, Value *PersFn, unsigned NumClauses,
|
||||
LandingPadInst *CreateLandingPad(Type *Ty, unsigned NumClauses,
|
||||
const Twine &Name = "") {
|
||||
return Insert(LandingPadInst::Create(Ty, PersFn, NumClauses), Name);
|
||||
return Insert(LandingPadInst::Create(Ty, NumClauses), Name);
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
@@ -2437,34 +2437,27 @@ private:
|
||||
return User::operator new(s);
|
||||
}
|
||||
void growOperands(unsigned Size);
|
||||
void init(Value *PersFn, unsigned NumReservedValues, const Twine &NameStr);
|
||||
void init(unsigned NumReservedValues, const Twine &NameStr);
|
||||
|
||||
explicit LandingPadInst(Type *RetTy, unsigned NumReservedValues,
|
||||
const Twine &NameStr, Instruction *InsertBefore);
|
||||
explicit LandingPadInst(Type *RetTy, unsigned NumReservedValues,
|
||||
const Twine &NameStr, BasicBlock *InsertAtEnd);
|
||||
|
||||
explicit LandingPadInst(Type *RetTy, Value *PersonalityFn,
|
||||
unsigned NumReservedValues, const Twine &NameStr,
|
||||
Instruction *InsertBefore);
|
||||
explicit LandingPadInst(Type *RetTy, Value *PersonalityFn,
|
||||
unsigned NumReservedValues, const Twine &NameStr,
|
||||
BasicBlock *InsertAtEnd);
|
||||
protected:
|
||||
LandingPadInst *clone_impl() const override;
|
||||
public:
|
||||
/// Constructors - NumReservedClauses is a hint for the number of incoming
|
||||
/// clauses that this landingpad will have (use 0 if you really have no idea).
|
||||
static LandingPadInst *Create(Type *RetTy, Value *PersonalityFn,
|
||||
unsigned NumReservedClauses,
|
||||
static LandingPadInst *Create(Type *RetTy, unsigned NumReservedClauses,
|
||||
const Twine &NameStr = "",
|
||||
Instruction *InsertBefore = nullptr);
|
||||
static LandingPadInst *Create(Type *RetTy, Value *PersonalityFn,
|
||||
unsigned NumReservedClauses,
|
||||
static LandingPadInst *Create(Type *RetTy, unsigned NumReservedClauses,
|
||||
const Twine &NameStr, BasicBlock *InsertAtEnd);
|
||||
|
||||
/// Provide fast operand accessors
|
||||
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
|
||||
|
||||
/// getPersonalityFn - Get the personality function associated with this
|
||||
/// landing pad.
|
||||
Value *getPersonalityFn() const { return getOperand(0); }
|
||||
|
||||
/// isCleanup - Return 'true' if this landingpad instruction is a
|
||||
/// cleanup. I.e., it should be run when unwinding even if its landing pad
|
||||
/// doesn't catch the exception.
|
||||
@@ -2482,21 +2475,21 @@ public:
|
||||
/// Get the value of the clause at index Idx. Use isCatch/isFilter to
|
||||
/// determine what type of clause this is.
|
||||
Constant *getClause(unsigned Idx) const {
|
||||
return cast<Constant>(getOperandList()[Idx + 1]);
|
||||
return cast<Constant>(getOperandList()[Idx]);
|
||||
}
|
||||
|
||||
/// isCatch - Return 'true' if the clause and index Idx is a catch clause.
|
||||
bool isCatch(unsigned Idx) const {
|
||||
return !isa<ArrayType>(getOperandList()[Idx + 1]->getType());
|
||||
return !isa<ArrayType>(getOperandList()[Idx]->getType());
|
||||
}
|
||||
|
||||
/// isFilter - Return 'true' if the clause and index Idx is a filter clause.
|
||||
bool isFilter(unsigned Idx) const {
|
||||
return isa<ArrayType>(getOperandList()[Idx + 1]->getType());
|
||||
return isa<ArrayType>(getOperandList()[Idx]->getType());
|
||||
}
|
||||
|
||||
/// getNumClauses - Get the number of clauses for this landing pad.
|
||||
unsigned getNumClauses() const { return getNumOperands() - 1; }
|
||||
unsigned getNumClauses() const { return getNumOperands(); }
|
||||
|
||||
/// reserveClauses - Grow the size of the operand list to accommodate the new
|
||||
/// number of clauses.
|
||||
@@ -2512,7 +2505,7 @@ public:
|
||||
};
|
||||
|
||||
template <>
|
||||
struct OperandTraits<LandingPadInst> : public HungoffOperandTraits<2> {
|
||||
struct OperandTraits<LandingPadInst> : public HungoffOperandTraits<1> {
|
||||
};
|
||||
|
||||
DEFINE_TRANSPARENT_OPERAND_ACCESSORS(LandingPadInst, Value)
|
||||
|
@@ -150,6 +150,19 @@ public:
|
||||
NumUserOperands = NumOps;
|
||||
}
|
||||
|
||||
/// Set the number of operands on a Function.
|
||||
///
|
||||
/// Function always allocates space for a single operands, but
|
||||
/// doesn't always use it.
|
||||
///
|
||||
/// FIXME: As that the number of operands is used to find the start of
|
||||
/// the allocated memory in operator delete, we need to always think we have
|
||||
/// 1 operand before delete.
|
||||
void setFunctionNumOperands(unsigned NumOps) {
|
||||
assert(NumOps <= 1 && "Function can only have 0 or 1 operands");
|
||||
NumUserOperands = NumOps;
|
||||
}
|
||||
|
||||
/// \brief Subclasses with hung off uses need to manage the operand count
|
||||
/// themselves. In these instances, the operand count isn't used to find the
|
||||
/// OperandList, so there's no issue in having the operand count change.
|
||||
|
Reference in New Issue
Block a user