From: Chris Lattner Date: Mon, 9 Mar 2009 04:46:40 +0000 (+0000) Subject: Fix PR3746 - Crash in isel with GEP of function pointer X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c66996ab3451a29a207e7871b0cbf984beaf941c;p=oota-llvm.git Fix PR3746 - Crash in isel with GEP of function pointer by checking that the top-level type of a gep is sized. This causes us to reject the example with: llvm-as: t2.ll:2:16: invalid getelementptr indices getelementptr i32()* null, i32 1 ^ git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66393 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index 1b5cfb15013..90af9f1ea74 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -1037,26 +1037,30 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx, init(Ptr, Idx, Name); } -// getIndexedType - Returns the type of the element that would be loaded with -// a load instruction with the specified parameters. -// -// The Idxs pointer should point to a continuous piece of memory containing the -// indices, either as Value* or uint64_t. -// -// A null type is returned if the indices are invalid for the specified -// pointer type. -// +/// getIndexedType - Returns the type of the element that would be accessed with +/// a gep instruction with the specified parameters. +/// +/// The Idxs pointer should point to a continuous piece of memory containing the +/// indices, either as Value* or uint64_t. +/// +/// A null type is returned if the indices are invalid for the specified +/// pointer type. +/// template -static const Type* getIndexedTypeInternal(const Type *Ptr, - IndexTy const *Idxs, - unsigned NumIdx) { +static const Type* getIndexedTypeInternal(const Type *Ptr, IndexTy const *Idxs, + unsigned NumIdx) { const PointerType *PTy = dyn_cast(Ptr); if (!PTy) return 0; // Type isn't a pointer type! const Type *Agg = PTy->getElementType(); - // Handle the special case of the empty set index set... + // Handle the special case of the empty set index set, which is always valid. if (NumIdx == 0) return Agg; + + // If there is at least one index, the top level type must be sized, otherwise + // it cannot be 'stepped over'. + if (!Agg->isSized()) + return 0; unsigned CurIdx = 1; for (; CurIdx != NumIdx; ++CurIdx) {