Skip to content

Commit 3771528

Browse files
committed
Make sure the integer type used to align the vaarg address is the same as the
type of pointers. llvm-svn: 148753
1 parent bfbf700 commit 3771528

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

clang/lib/CodeGen/TargetInfo.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3267,27 +3267,29 @@ llvm::Value* MipsABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
32673267
CGBuilderTy &Builder = CGF.Builder;
32683268
llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap");
32693269
llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
3270-
unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
3270+
int64_t TypeAlign = getContext().getTypeAlign(Ty) / 8;
32713271
llvm::Type *PTy = llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
32723272
llvm::Value *AddrTyped;
3273+
unsigned PtrWidth = getContext().getTargetInfo().getPointerWidth(0);
3274+
llvm::IntegerType *IntTy = (PtrWidth == 32) ? CGF.Int32Ty : CGF.Int64Ty;
32733275

32743276
if (TypeAlign > MinABIStackAlignInBytes) {
3275-
llvm::Value *AddrAsInt32 = CGF.Builder.CreatePtrToInt(Addr, CGF.Int32Ty);
3276-
llvm::Value *Inc = llvm::ConstantInt::get(CGF.Int32Ty, TypeAlign - 1);
3277-
llvm::Value *Mask = llvm::ConstantInt::get(CGF.Int32Ty, -TypeAlign);
3278-
llvm::Value *Add = CGF.Builder.CreateAdd(AddrAsInt32, Inc);
3277+
llvm::Value *AddrAsInt = CGF.Builder.CreatePtrToInt(Addr, IntTy);
3278+
llvm::Value *Inc = llvm::ConstantInt::get(IntTy, TypeAlign - 1);
3279+
llvm::Value *Mask = llvm::ConstantInt::get(IntTy, -TypeAlign);
3280+
llvm::Value *Add = CGF.Builder.CreateAdd(AddrAsInt, Inc);
32793281
llvm::Value *And = CGF.Builder.CreateAnd(Add, Mask);
32803282
AddrTyped = CGF.Builder.CreateIntToPtr(And, PTy);
32813283
}
32823284
else
32833285
AddrTyped = Builder.CreateBitCast(Addr, PTy);
32843286

32853287
llvm::Value *AlignedAddr = Builder.CreateBitCast(AddrTyped, BP);
3286-
TypeAlign = std::max(TypeAlign, MinABIStackAlignInBytes);
3288+
TypeAlign = std::max((unsigned)TypeAlign, MinABIStackAlignInBytes);
32873289
uint64_t Offset =
32883290
llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, TypeAlign);
32893291
llvm::Value *NextAddr =
3290-
Builder.CreateGEP(AlignedAddr, llvm::ConstantInt::get(CGF.Int32Ty, Offset),
3292+
Builder.CreateGEP(AlignedAddr, llvm::ConstantInt::get(IntTy, Offset),
32913293
"ap.next");
32923294
Builder.CreateStore(NextAddr, VAListAddrAsBPP);
32933295

0 commit comments

Comments
 (0)