forked from OSchip/llvm-project
parent
7c87884ec3
commit
20455f204f
|
@ -713,10 +713,30 @@ Value *ScalarExprEmitter::EmitAdd(const BinOpInfo &Ops) {
|
|||
return Builder.CreateAdd(Ops.LHS, Ops.RHS, "add");
|
||||
|
||||
// FIXME: What about a pointer to a VLA?
|
||||
if (isa<llvm::PointerType>(Ops.LHS->getType())) // pointer + int
|
||||
return Builder.CreateGEP(Ops.LHS, Ops.RHS, "add.ptr");
|
||||
// int + pointer
|
||||
return Builder.CreateGEP(Ops.RHS, Ops.LHS, "add.ptr");
|
||||
Value *Ptr, *Idx;
|
||||
Expr *IdxExp;
|
||||
if (isa<llvm::PointerType>(Ops.LHS->getType())) { // pointer + int
|
||||
Ptr = Ops.LHS;
|
||||
Idx = Ops.RHS;
|
||||
IdxExp = Ops.E->getRHS();
|
||||
} else { // int + pointer
|
||||
Ptr = Ops.RHS;
|
||||
Idx = Ops.LHS;
|
||||
IdxExp = Ops.E->getLHS();
|
||||
}
|
||||
|
||||
unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
|
||||
if (Width < CGF.LLVMPointerWidth) {
|
||||
// Zero or sign extend the pointer value based on whether the index is
|
||||
// signed or not.
|
||||
const llvm::Type *IdxType = llvm::IntegerType::get(CGF.LLVMPointerWidth);
|
||||
if (IdxExp->getType().getCanonicalType()->isSignedIntegerType())
|
||||
Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
|
||||
else
|
||||
Idx = Builder.CreateZExt(Idx, IdxType, "idx.ext");
|
||||
}
|
||||
|
||||
return Builder.CreateGEP(Ptr, Idx, "add.ptr");
|
||||
}
|
||||
|
||||
Value *ScalarExprEmitter::EmitSub(const BinOpInfo &Ops) {
|
||||
|
|
|
@ -67,6 +67,7 @@ public:
|
|||
llvm::Module &getModule() const { return TheModule; }
|
||||
CodeGenTypes &getTypes() { return Types; }
|
||||
Diagnostic &getDiags() const { return Diags; }
|
||||
const llvm::TargetData &getTargetData() const { return TheTargetData; }
|
||||
|
||||
llvm::Constant *GetAddrOfFunctionDecl(const FunctionDecl *D,
|
||||
bool isDefinition);
|
||||
|
|
|
@ -796,6 +796,7 @@
|
|||
08FB7793FE84155DC02AAC07 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */;
|
||||
compatibilityVersion = "Xcode 2.4";
|
||||
hasScannedForEncodings = 1;
|
||||
mainGroup = 08FB7794FE84155DC02AAC07 /* clang */;
|
||||
projectDirPath = "";
|
||||
|
|
|
@ -6,3 +6,11 @@ int zxcv(void);
|
|||
int x=sizeof(zxcv);
|
||||
int y=__alignof__(zxcv);
|
||||
|
||||
|
||||
void *test(int *i) {
|
||||
short a = 1;
|
||||
i += a;
|
||||
i + a;
|
||||
a + i;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue