mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
[opaque pointer type] More GEP API migrations
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234108 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
166e26c295
commit
0a63904a98
@ -1088,17 +1088,17 @@ public:
|
||||
|
||||
return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idx), Name);
|
||||
}
|
||||
Value *CreateConstGEP2_32(Value *Ptr, unsigned Idx0, unsigned Idx1,
|
||||
const Twine &Name = "") {
|
||||
Value *CreateConstGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0, unsigned Idx1,
|
||||
const Twine &Name = "") {
|
||||
Value *Idxs[] = {
|
||||
ConstantInt::get(Type::getInt32Ty(Context), Idx0),
|
||||
ConstantInt::get(Type::getInt32Ty(Context), Idx1)
|
||||
};
|
||||
|
||||
if (Constant *PC = dyn_cast<Constant>(Ptr))
|
||||
return Insert(Folder.CreateGetElementPtr(nullptr, PC, Idxs), Name);
|
||||
return Insert(Folder.CreateGetElementPtr(Ty, PC, Idxs), Name);
|
||||
|
||||
return Insert(GetElementPtrInst::Create(nullptr, Ptr, Idxs), Name);
|
||||
return Insert(GetElementPtrInst::Create(Ty, Ptr, Idxs), Name);
|
||||
}
|
||||
Value *CreateConstInBoundsGEP2_32(Value *Ptr, unsigned Idx0, unsigned Idx1,
|
||||
const Twine &Name = "") {
|
||||
|
@ -46,6 +46,8 @@ STATISTIC(NumSpilled, "Number of registers live across unwind edges");
|
||||
namespace {
|
||||
class SjLjEHPrepare : public FunctionPass {
|
||||
const TargetMachine *TM;
|
||||
Type *doubleUnderDataTy;
|
||||
Type *doubleUnderJBufTy;
|
||||
Type *FunctionContextTy;
|
||||
Constant *RegisterFn;
|
||||
Constant *UnregisterFn;
|
||||
@ -93,12 +95,14 @@ bool SjLjEHPrepare::doInitialization(Module &M) {
|
||||
// builtin_setjmp uses a five word jbuf
|
||||
Type *VoidPtrTy = Type::getInt8PtrTy(M.getContext());
|
||||
Type *Int32Ty = Type::getInt32Ty(M.getContext());
|
||||
FunctionContextTy = StructType::get(VoidPtrTy, // __prev
|
||||
Int32Ty, // call_site
|
||||
ArrayType::get(Int32Ty, 4), // __data
|
||||
VoidPtrTy, // __personality
|
||||
VoidPtrTy, // __lsda
|
||||
ArrayType::get(VoidPtrTy, 5), // __jbuf
|
||||
doubleUnderDataTy = ArrayType::get(Int32Ty, 4);
|
||||
doubleUnderJBufTy = ArrayType::get(VoidPtrTy, 5);
|
||||
FunctionContextTy = StructType::get(VoidPtrTy, // __prev
|
||||
Int32Ty, // call_site
|
||||
doubleUnderDataTy, // __data
|
||||
VoidPtrTy, // __personality
|
||||
VoidPtrTy, // __lsda
|
||||
doubleUnderJBufTy, // __jbuf
|
||||
nullptr);
|
||||
RegisterFn = M.getOrInsertFunction(
|
||||
"_Unwind_SjLj_Register", Type::getVoidTy(M.getContext()),
|
||||
@ -204,16 +208,17 @@ Value *SjLjEHPrepare::setupFunctionContext(Function &F,
|
||||
IRBuilder<> Builder(LPI->getParent()->getFirstInsertionPt());
|
||||
|
||||
// Reference the __data field.
|
||||
Value *FCData = Builder.CreateConstGEP2_32(FuncCtx, 0, 2, "__data");
|
||||
Value *FCData =
|
||||
Builder.CreateConstGEP2_32(FunctionContextTy, FuncCtx, 0, 2, "__data");
|
||||
|
||||
// The exception values come back in context->__data[0].
|
||||
Value *ExceptionAddr =
|
||||
Builder.CreateConstGEP2_32(FCData, 0, 0, "exception_gep");
|
||||
Value *ExceptionAddr = Builder.CreateConstGEP2_32(doubleUnderDataTy, FCData,
|
||||
0, 0, "exception_gep");
|
||||
Value *ExnVal = Builder.CreateLoad(ExceptionAddr, true, "exn_val");
|
||||
ExnVal = Builder.CreateIntToPtr(ExnVal, Builder.getInt8PtrTy());
|
||||
|
||||
Value *SelectorAddr =
|
||||
Builder.CreateConstGEP2_32(FCData, 0, 1, "exn_selector_gep");
|
||||
Value *SelectorAddr = Builder.CreateConstGEP2_32(doubleUnderDataTy, FCData,
|
||||
0, 1, "exn_selector_gep");
|
||||
Value *SelVal = Builder.CreateLoad(SelectorAddr, true, "exn_selector_val");
|
||||
|
||||
substituteLPadValues(LPI, ExnVal, SelVal);
|
||||
@ -223,15 +228,16 @@ Value *SjLjEHPrepare::setupFunctionContext(Function &F,
|
||||
IRBuilder<> Builder(EntryBB->getTerminator());
|
||||
if (!PersonalityFn)
|
||||
PersonalityFn = LPads[0]->getPersonalityFn();
|
||||
Value *PersonalityFieldPtr =
|
||||
Builder.CreateConstGEP2_32(FuncCtx, 0, 3, "pers_fn_gep");
|
||||
Value *PersonalityFieldPtr = Builder.CreateConstGEP2_32(
|
||||
FunctionContextTy, FuncCtx, 0, 3, "pers_fn_gep");
|
||||
Builder.CreateStore(
|
||||
Builder.CreateBitCast(PersonalityFn, Builder.getInt8PtrTy()),
|
||||
PersonalityFieldPtr, /*isVolatile=*/true);
|
||||
|
||||
// LSDA address
|
||||
Value *LSDA = Builder.CreateCall(LSDAAddrFn, "lsda_addr");
|
||||
Value *LSDAFieldPtr = Builder.CreateConstGEP2_32(FuncCtx, 0, 4, "lsda_gep");
|
||||
Value *LSDAFieldPtr =
|
||||
Builder.CreateConstGEP2_32(FunctionContextTy, FuncCtx, 0, 4, "lsda_gep");
|
||||
Builder.CreateStore(LSDA, LSDAFieldPtr, /*isVolatile=*/true);
|
||||
|
||||
return FuncCtx;
|
||||
@ -400,16 +406,19 @@ bool SjLjEHPrepare::setupEntryBlockAndCallSites(Function &F) {
|
||||
IRBuilder<> Builder(EntryBB->getTerminator());
|
||||
|
||||
// Get a reference to the jump buffer.
|
||||
Value *JBufPtr = Builder.CreateConstGEP2_32(FuncCtx, 0, 5, "jbuf_gep");
|
||||
Value *JBufPtr =
|
||||
Builder.CreateConstGEP2_32(FunctionContextTy, FuncCtx, 0, 5, "jbuf_gep");
|
||||
|
||||
// Save the frame pointer.
|
||||
Value *FramePtr = Builder.CreateConstGEP2_32(JBufPtr, 0, 0, "jbuf_fp_gep");
|
||||
Value *FramePtr = Builder.CreateConstGEP2_32(doubleUnderJBufTy, JBufPtr, 0, 0,
|
||||
"jbuf_fp_gep");
|
||||
|
||||
Value *Val = Builder.CreateCall(FrameAddrFn, Builder.getInt32(0), "fp");
|
||||
Builder.CreateStore(Val, FramePtr, /*isVolatile=*/true);
|
||||
|
||||
// Save the stack pointer.
|
||||
Value *StackPtr = Builder.CreateConstGEP2_32(JBufPtr, 0, 2, "jbuf_sp_gep");
|
||||
Value *StackPtr = Builder.CreateConstGEP2_32(doubleUnderJBufTy, JBufPtr, 0, 2,
|
||||
"jbuf_sp_gep");
|
||||
|
||||
Val = Builder.CreateCall(StackAddrFn, "sp");
|
||||
Builder.CreateStore(Val, StackPtr, /*isVolatile=*/true);
|
||||
|
@ -1568,10 +1568,11 @@ void DFSanVisitor::visitCallSite(CallSite CS) {
|
||||
ArrayType *VarArgArrayTy = ArrayType::get(DFSF.DFS.ShadowTy, VarArgSize);
|
||||
AllocaInst *VarArgShadow =
|
||||
new AllocaInst(VarArgArrayTy, "", DFSF.F->getEntryBlock().begin());
|
||||
Args.push_back(IRB.CreateConstGEP2_32(VarArgShadow, 0, 0));
|
||||
Args.push_back(IRB.CreateConstGEP2_32(VarArgArrayTy, VarArgShadow, 0, 0));
|
||||
for (unsigned n = 0; i != e; ++i, ++n) {
|
||||
IRB.CreateStore(DFSF.getShadow(*i),
|
||||
IRB.CreateConstGEP2_32(VarArgShadow, 0, n));
|
||||
IRB.CreateStore(
|
||||
DFSF.getShadow(*i),
|
||||
IRB.CreateConstGEP2_32(VarArgArrayTy, VarArgShadow, 0, n));
|
||||
Args.push_back(*i);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user