forked from OSchip/llvm-project
ir-gen for --/++ operators of objc object pointers
in 32bit abi. llvm-svn: 76109
This commit is contained in:
parent
0418a5f11e
commit
c3443a3bf3
|
@ -690,7 +690,25 @@ Value *ScalarExprEmitter::VisitPrePostIncDec(const UnaryOperator *E,
|
||||||
llvm::Constant *Inc =
|
llvm::Constant *Inc =
|
||||||
VMContext.getConstantInt(llvm::Type::Int32Ty, AmountVal);
|
VMContext.getConstantInt(llvm::Type::Int32Ty, AmountVal);
|
||||||
if (!isa<llvm::FunctionType>(PT->getElementType())) {
|
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 {
|
} else {
|
||||||
const llvm::Type *i8Ty =
|
const llvm::Type *i8Ty =
|
||||||
VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
|
VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue