mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-14 17:34:41 +00:00
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
This commit is contained in:
parent
086c788b39
commit
c66996ab34
@ -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 <typename IndexTy>
|
||||
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<PointerType>(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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user