ir-gen for --/++ operators of objc object pointers

in 32bit abi.

llvm-svn: 76109
This commit is contained in:
Fariborz Jahanian 2009-07-16 22:04:59 +00:00
parent 0418a5f11e
commit c3443a3bf3
2 changed files with 38 additions and 1 deletions

View File

@ -690,7 +690,25 @@ Value *ScalarExprEmitter::VisitPrePostIncDec(const UnaryOperator *E,
llvm::Constant *Inc =
VMContext.getConstantInt(llvm::Type::Int32Ty, AmountVal);
if (!isa<llvm::FunctionType>(PT->getElementType())) {
NextVal = Builder.CreateGEP(InVal, Inc, "ptrincdec");
QualType PTEE = ValTy->getPointeeType();
if (const ObjCInterfaceType *OIT =
dyn_cast<ObjCInterfaceType>(PTEE)) {
// Handle interface types, which are not represented with a concrete type.
int size = CGF.getContext().getTypeSize(OIT) / 8;
if (!isInc)
size = -size;
Inc = VMContext.getConstantInt(Inc->getType(), size);
const llvm::Type *i8Ty =
VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
InVal = Builder.CreateBitCast(InVal, i8Ty);
NextVal = Builder.CreateGEP(InVal, Inc, "add.ptr");
llvm::Value *lhs = LV.getAddress();
lhs = Builder.CreateBitCast(lhs, VMContext.getPointerTypeUnqual(i8Ty));
LV = LValue::MakeAddr(lhs, ValTy.getCVRQualifiers(),
CGF.getContext().getObjCGCAttrKind(ValTy));
}
else
NextVal = Builder.CreateGEP(InVal, Inc, "ptrincdec");
} else {
const llvm::Type *i8Ty =
VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);

View File

@ -0,0 +1,19 @@
// RUN: clang-cc -triple i386-apple-darwin9 -fnext-runtime -emit-llvm %s
@interface Foo
{
double d1,d3,d4;
}
@end
Foo* foo()
{
Foo *f;
// Both of these crash clang nicely
++f;
--f;
f--;
f++;
return f;
}