[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:
David Blaikie
2015-04-04 21:07:10 +00:00
parent 166e26c295
commit 0a63904a98
3 changed files with 34 additions and 24 deletions

View File

@ -1088,17 +1088,17 @@ public:
return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idx), Name); return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idx), Name);
} }
Value *CreateConstGEP2_32(Value *Ptr, unsigned Idx0, unsigned Idx1, Value *CreateConstGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0, unsigned Idx1,
const Twine &Name = "") { const Twine &Name = "") {
Value *Idxs[] = { Value *Idxs[] = {
ConstantInt::get(Type::getInt32Ty(Context), Idx0), ConstantInt::get(Type::getInt32Ty(Context), Idx0),
ConstantInt::get(Type::getInt32Ty(Context), Idx1) ConstantInt::get(Type::getInt32Ty(Context), Idx1)
}; };
if (Constant *PC = dyn_cast<Constant>(Ptr)) 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, Value *CreateConstInBoundsGEP2_32(Value *Ptr, unsigned Idx0, unsigned Idx1,
const Twine &Name = "") { const Twine &Name = "") {

View File

@ -46,6 +46,8 @@ STATISTIC(NumSpilled, "Number of registers live across unwind edges");
namespace { namespace {
class SjLjEHPrepare : public FunctionPass { class SjLjEHPrepare : public FunctionPass {
const TargetMachine *TM; const TargetMachine *TM;
Type *doubleUnderDataTy;
Type *doubleUnderJBufTy;
Type *FunctionContextTy; Type *FunctionContextTy;
Constant *RegisterFn; Constant *RegisterFn;
Constant *UnregisterFn; Constant *UnregisterFn;
@ -93,12 +95,14 @@ bool SjLjEHPrepare::doInitialization(Module &M) {
// builtin_setjmp uses a five word jbuf // builtin_setjmp uses a five word jbuf
Type *VoidPtrTy = Type::getInt8PtrTy(M.getContext()); Type *VoidPtrTy = Type::getInt8PtrTy(M.getContext());
Type *Int32Ty = Type::getInt32Ty(M.getContext()); Type *Int32Ty = Type::getInt32Ty(M.getContext());
FunctionContextTy = StructType::get(VoidPtrTy, // __prev doubleUnderDataTy = ArrayType::get(Int32Ty, 4);
Int32Ty, // call_site doubleUnderJBufTy = ArrayType::get(VoidPtrTy, 5);
ArrayType::get(Int32Ty, 4), // __data FunctionContextTy = StructType::get(VoidPtrTy, // __prev
VoidPtrTy, // __personality Int32Ty, // call_site
VoidPtrTy, // __lsda doubleUnderDataTy, // __data
ArrayType::get(VoidPtrTy, 5), // __jbuf VoidPtrTy, // __personality
VoidPtrTy, // __lsda
doubleUnderJBufTy, // __jbuf
nullptr); nullptr);
RegisterFn = M.getOrInsertFunction( RegisterFn = M.getOrInsertFunction(
"_Unwind_SjLj_Register", Type::getVoidTy(M.getContext()), "_Unwind_SjLj_Register", Type::getVoidTy(M.getContext()),
@ -204,16 +208,17 @@ Value *SjLjEHPrepare::setupFunctionContext(Function &F,
IRBuilder<> Builder(LPI->getParent()->getFirstInsertionPt()); IRBuilder<> Builder(LPI->getParent()->getFirstInsertionPt());
// Reference the __data field. // 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]. // The exception values come back in context->__data[0].
Value *ExceptionAddr = Value *ExceptionAddr = Builder.CreateConstGEP2_32(doubleUnderDataTy, FCData,
Builder.CreateConstGEP2_32(FCData, 0, 0, "exception_gep"); 0, 0, "exception_gep");
Value *ExnVal = Builder.CreateLoad(ExceptionAddr, true, "exn_val"); Value *ExnVal = Builder.CreateLoad(ExceptionAddr, true, "exn_val");
ExnVal = Builder.CreateIntToPtr(ExnVal, Builder.getInt8PtrTy()); ExnVal = Builder.CreateIntToPtr(ExnVal, Builder.getInt8PtrTy());
Value *SelectorAddr = Value *SelectorAddr = Builder.CreateConstGEP2_32(doubleUnderDataTy, FCData,
Builder.CreateConstGEP2_32(FCData, 0, 1, "exn_selector_gep"); 0, 1, "exn_selector_gep");
Value *SelVal = Builder.CreateLoad(SelectorAddr, true, "exn_selector_val"); Value *SelVal = Builder.CreateLoad(SelectorAddr, true, "exn_selector_val");
substituteLPadValues(LPI, ExnVal, SelVal); substituteLPadValues(LPI, ExnVal, SelVal);
@ -223,15 +228,16 @@ Value *SjLjEHPrepare::setupFunctionContext(Function &F,
IRBuilder<> Builder(EntryBB->getTerminator()); IRBuilder<> Builder(EntryBB->getTerminator());
if (!PersonalityFn) if (!PersonalityFn)
PersonalityFn = LPads[0]->getPersonalityFn(); PersonalityFn = LPads[0]->getPersonalityFn();
Value *PersonalityFieldPtr = Value *PersonalityFieldPtr = Builder.CreateConstGEP2_32(
Builder.CreateConstGEP2_32(FuncCtx, 0, 3, "pers_fn_gep"); FunctionContextTy, FuncCtx, 0, 3, "pers_fn_gep");
Builder.CreateStore( Builder.CreateStore(
Builder.CreateBitCast(PersonalityFn, Builder.getInt8PtrTy()), Builder.CreateBitCast(PersonalityFn, Builder.getInt8PtrTy()),
PersonalityFieldPtr, /*isVolatile=*/true); PersonalityFieldPtr, /*isVolatile=*/true);
// LSDA address // LSDA address
Value *LSDA = Builder.CreateCall(LSDAAddrFn, "lsda_addr"); 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); Builder.CreateStore(LSDA, LSDAFieldPtr, /*isVolatile=*/true);
return FuncCtx; return FuncCtx;
@ -400,16 +406,19 @@ bool SjLjEHPrepare::setupEntryBlockAndCallSites(Function &F) {
IRBuilder<> Builder(EntryBB->getTerminator()); IRBuilder<> Builder(EntryBB->getTerminator());
// Get a reference to the jump buffer. // 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. // 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"); Value *Val = Builder.CreateCall(FrameAddrFn, Builder.getInt32(0), "fp");
Builder.CreateStore(Val, FramePtr, /*isVolatile=*/true); Builder.CreateStore(Val, FramePtr, /*isVolatile=*/true);
// Save the stack pointer. // 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"); Val = Builder.CreateCall(StackAddrFn, "sp");
Builder.CreateStore(Val, StackPtr, /*isVolatile=*/true); Builder.CreateStore(Val, StackPtr, /*isVolatile=*/true);

View File

@ -1568,10 +1568,11 @@ void DFSanVisitor::visitCallSite(CallSite CS) {
ArrayType *VarArgArrayTy = ArrayType::get(DFSF.DFS.ShadowTy, VarArgSize); ArrayType *VarArgArrayTy = ArrayType::get(DFSF.DFS.ShadowTy, VarArgSize);
AllocaInst *VarArgShadow = AllocaInst *VarArgShadow =
new AllocaInst(VarArgArrayTy, "", DFSF.F->getEntryBlock().begin()); 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) { for (unsigned n = 0; i != e; ++i, ++n) {
IRB.CreateStore(DFSF.getShadow(*i), IRB.CreateStore(
IRB.CreateConstGEP2_32(VarArgShadow, 0, n)); DFSF.getShadow(*i),
IRB.CreateConstGEP2_32(VarArgArrayTy, VarArgShadow, 0, n));
Args.push_back(*i); Args.push_back(*i);
} }
} }