mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-17 12:40:40 +00:00
AsmParser: Check ConstantExpr GEP operands for validity
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230188 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1f229009ed
commit
15cf92437a
@ -2776,11 +2776,33 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
|
||||
if (Opc == Instruction::GetElementPtr) {
|
||||
if (Elts.size() == 0 ||
|
||||
!Elts[0]->getType()->getScalarType()->isPointerTy())
|
||||
return Error(ID.Loc, "getelementptr requires pointer operand");
|
||||
return Error(ID.Loc, "base of getelementptr must be a pointer");
|
||||
|
||||
Type *BaseType = Elts[0]->getType();
|
||||
auto *BasePointerType = cast<PointerType>(BaseType->getScalarType());
|
||||
|
||||
ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end());
|
||||
for (Constant *Val : Indices) {
|
||||
Type *ValTy = Val->getType();
|
||||
if (!ValTy->getScalarType()->isIntegerTy())
|
||||
return Error(ID.Loc, "getelementptr index must be an integer");
|
||||
if (ValTy->isVectorTy() != BaseType->isVectorTy())
|
||||
return Error(ID.Loc, "getelementptr index type missmatch");
|
||||
if (ValTy->isVectorTy()) {
|
||||
unsigned ValNumEl = cast<VectorType>(ValTy)->getNumElements();
|
||||
unsigned PtrNumEl = cast<VectorType>(BaseType)->getNumElements();
|
||||
if (ValNumEl != PtrNumEl)
|
||||
return Error(
|
||||
ID.Loc,
|
||||
"getelementptr vector index has a wrong number of elements");
|
||||
}
|
||||
}
|
||||
|
||||
if (!Indices.empty() && !BasePointerType->getElementType()->isSized())
|
||||
return Error(ID.Loc, "base element of getelementptr must be sized");
|
||||
|
||||
if (!GetElementPtrInst::getIndexedType(Elts[0]->getType(), Indices))
|
||||
return Error(ID.Loc, "invalid indices for getelementptr");
|
||||
return Error(ID.Loc, "invalid getelementptr indices");
|
||||
ID.ConstantVal = ConstantExpr::getGetElementPtr(Elts[0], Indices,
|
||||
InBounds);
|
||||
} else if (Opc == Instruction::Select) {
|
||||
|
5
test/Assembler/getelementptr_vec_idx4.ll
Normal file
5
test/Assembler/getelementptr_vec_idx4.ll
Normal file
@ -0,0 +1,5 @@
|
||||
; RUN: not llvm-as < %s 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: getelementptr vector index has a wrong number of elements
|
||||
|
||||
global <2 x i32*> getelementptr (<4 x [3 x {i32, i32}]*> zeroinitializer, <2 x i32> <i32 1, i32 2>, <2 x i32> <i32 2, i32 3>, <2 x i32> <i32 1, i32 1>)
|
Loading…
x
Reference in New Issue
Block a user