XCore : Fix bug in XCoreABIInfo::EmitVAArg()

Incorrect handling of 'double' and 'long long int'

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192436 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp
index 9ad17a4..8b8c90b 100644
--- a/lib/CodeGen/TargetInfo.cpp
+++ b/lib/CodeGen/TargetInfo.cpp
@@ -5426,40 +5426,54 @@
   XcoreTargetCodeGenInfo(CodeGenTypes &CGT)
     :TargetCodeGenInfo(new XCoreABIInfo(CGT)) {}
 };
-} // end anonymous namespace
+} // End anonymous namespace.
 
 llvm::Value *XCoreABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
                                      CodeGenFunction &CGF) const {
-  ABIArgInfo AI = classifyArgumentType(Ty);
   CGBuilderTy &Builder = CGF.Builder;
-  llvm::Type *ArgTy = CGT.ConvertType(Ty);
-  if (AI.canHaveCoerceToType() && !AI.getCoerceToType())
-    AI.setCoerceToType(ArgTy);
 
-  // handle the VAList
+  // Get the VAList.
   llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr,
                                                        CGF.Int8PtrPtrTy);
   llvm::Value *AP = Builder.CreateLoad(VAListAddrAsBPP);
-  llvm::Value *APN = Builder.CreateConstGEP1_32(AP, 4);
-  Builder.CreateStore(APN, VAListAddrAsBPP);
 
-  // handle the argument
+  // Handle the argument.
+  ABIArgInfo AI = classifyArgumentType(Ty);
+  llvm::Type *ArgTy = CGT.ConvertType(Ty);
+  if (AI.canHaveCoerceToType() && !AI.getCoerceToType())
+    AI.setCoerceToType(ArgTy);
   llvm::Type *ArgPtrTy = llvm::PointerType::getUnqual(ArgTy);
+  llvm::Value *Val;
+  uint64_t ArgSize;
   switch (AI.getKind()) {
   case ABIArgInfo::Expand:
     llvm_unreachable("Unsupported ABI kind for va_arg");
   case ABIArgInfo::Ignore:
-    return llvm::UndefValue::get(ArgPtrTy);
+    Val = llvm::UndefValue::get(ArgPtrTy);
+    ArgSize = 0;
+    break;
   case ABIArgInfo::Extend:
   case ABIArgInfo::Direct:
-    return Builder.CreatePointerCast(AP, ArgPtrTy);
+    Val = Builder.CreatePointerCast(AP, ArgPtrTy);
+    ArgSize = getDataLayout().getTypeAllocSize(AI.getCoerceToType());
+    if (ArgSize < 4)
+      ArgSize = 4;
+    break;
   case ABIArgInfo::Indirect:
     llvm::Value *ArgAddr;
     ArgAddr = Builder.CreateBitCast(AP, llvm::PointerType::getUnqual(ArgPtrTy));
     ArgAddr = Builder.CreateLoad(ArgAddr);
-    return Builder.CreatePointerCast(ArgAddr, ArgPtrTy);
+    Val = Builder.CreatePointerCast(ArgAddr, ArgPtrTy);
+    ArgSize = 4;
+    break;
   }
-  llvm_unreachable("Unknown ABI kind");
+
+  // Increment the VAList.
+  if (ArgSize) {
+    llvm::Value *APN = Builder.CreateConstGEP1_32(AP, ArgSize);
+    Builder.CreateStore(APN, VAListAddrAsBPP);
+  }
+  return Val;
 }
 
 //===----------------------------------------------------------------------===//