fix a fixme: non-proto struct returning function definitions should be compiled

to something like:
define void @bar(%struct.foo* noalias sret %agg.result) nounwind {
instead of:
define void @bar(%struct.foo* noalias sret %agg.result, ...) nounwind {

llvm-svn: 67475
This commit is contained in:
Chris Lattner 2009-03-22 19:35:37 +00:00
parent 377b9c84d0
commit 75acb0c356
2 changed files with 12 additions and 5 deletions

View File

@ -859,10 +859,13 @@ void CodeGenModule::EmitGlobalFunctionDefinition(const FunctionDecl *D) {
// As a special case, make sure that definitions of K&R function
// "type foo()" aren't declared as varargs (which forces the backend
// to do unnecessary work).
// FIXME: what about stret() functions, this doesn't handle them!?
if (Ty->isVarArg() && Ty->getNumParams() == 0)
Ty = llvm::FunctionType::get(Ty->getReturnType(),
std::vector<const llvm::Type*>(), false);
if (D->getType()->isFunctionNoProtoType()) {
assert(Ty->isVarArg() && "Didn't lower type as expected");
// Due to stret, the lowered function could have arguments. Just create the
// same type as was lowered by ConvertType but strip off the varargs bit.
std::vector<const llvm::Type*> Args(Ty->param_begin(), Ty->param_end());
Ty = llvm::FunctionType::get(Ty->getReturnType(), Args, false);
}
// Get or create the prototype for teh function.
llvm::Constant *Entry = GetAddrOfFunction(D, Ty);

View File

@ -27,5 +27,9 @@ void f1();
void f2(void) {
f1(1, 2, 3);
}
// RUN: grep 'define void @f1()' %t
// RUN: grep 'define void @f1()' %t &&
void f1() {}
// RUN: grep 'define .* @f3' %t | not grep -F '...'
struct foo { int X, Y, Z; } f3() {
}