From ca3d3fcabaa0d7255e9a778ef468daa6e052b211 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Tue, 15 Nov 2011 02:46:03 +0000 Subject: [PATCH] Fix crash in calling convention code expanding an struct with a complex member. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144612 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGCall.cpp | 12 +++++++++--- test/CodeGen/x86_32-arguments-darwin.c | 5 +++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 92ac5ae560..7ff16dd951 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -1513,7 +1513,10 @@ void CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV, llvm::Value *EltAddr = Builder.CreateConstGEP2_32(Addr, 0, Elt); LValue LV = MakeAddrLValue(EltAddr, EltTy); RValue EltRV; - if (CodeGenFunction::hasAggregateLLVMType(EltTy)) + if (EltTy->isAnyComplexType()) + // FIXME: Volatile? + EltRV = RValue::getComplex(LoadComplexFromAddr(LV.getAddress(), false)); + else if (CodeGenFunction::hasAggregateLLVMType(EltTy)) EltRV = RValue::getAggregate(LV.getAddress()); else EltRV = EmitLoadOfLValue(LV); @@ -1531,13 +1534,16 @@ void CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV, // FIXME: What are the right qualifiers here? LValue LV = EmitLValueForField(Addr, FD, 0); RValue FldRV; - if (CodeGenFunction::hasAggregateLLVMType(FT)) + if (FT->isAnyComplexType()) + // FIXME: Volatile? + FldRV = RValue::getComplex(LoadComplexFromAddr(LV.getAddress(), false)); + else if (CodeGenFunction::hasAggregateLLVMType(FT)) FldRV = RValue::getAggregate(LV.getAddress()); else FldRV = EmitLoadOfLValue(LV); ExpandTypeToArgs(FT, FldRV, Args, IRFuncTy); } - } else if (isa(Ty)) { + } else if (Ty->isAnyComplexType()) { ComplexPairTy CV = RV.getComplexVal(); Args.push_back(CV.first); Args.push_back(CV.second); diff --git a/test/CodeGen/x86_32-arguments-darwin.c b/test/CodeGen/x86_32-arguments-darwin.c index 7727c43f6e..c3af7fbc04 100644 --- a/test/CodeGen/x86_32-arguments-darwin.c +++ b/test/CodeGen/x86_32-arguments-darwin.c @@ -275,3 +275,8 @@ void f56(char a0, struct s56_0 a1, f56_0(1, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } + +// CHECK: define void @f57(i32 %x.0, i32 %x.1) +// CHECK: call void @f57( +struct s57 { _Complex int x; }; +void f57(struct s57 x) {} void f57a(void) { f57((struct s57){1}); } -- 2.40.0