@@ -196,6 +196,9 @@ llvm::FunctionType* DtoFunctionType(Type* type, IrFuncTy &irFty, Type* thistype,
196196 if (irFty.arg_nest ) argtypes.push_back (irFty.arg_nest ->ltype );
197197 if (irFty.arg_arguments ) argtypes.push_back (irFty.arg_arguments ->ltype );
198198
199+ if (irFty.arg_sret && irFty.arg_this && abi->passThisBeforeSret (f))
200+ std::swap (argtypes[0 ], argtypes[1 ]);
201+
199202 const size_t firstExplicitArg = argtypes.size ();
200203 const size_t numExplicitLLArgs = irFty.args .size ();
201204 for (size_t i = 0 ; i < numExplicitLLArgs; i++)
@@ -405,8 +408,18 @@ static void set_param_attrs(TypeFunction* f, llvm::Function* func, FuncDeclarati
405408 }
406409
407410 ADD_PA (ret)
408- ADD_PA (arg_sret)
409- ADD_PA (arg_this)
411+
412+ if (irFty.arg_sret && irFty.arg_this && gABI ->passThisBeforeSret (f))
413+ {
414+ ADD_PA (arg_this)
415+ ADD_PA (arg_sret)
416+ }
417+ else
418+ {
419+ ADD_PA (arg_sret)
420+ ADD_PA (arg_this)
421+ }
422+
410423 ADD_PA (arg_nest)
411424 ADD_PA (arg_arguments)
412425
@@ -537,7 +550,9 @@ void DtoDeclareFunction(FuncDeclaration* fdecl)
537550 // name parameters
538551 llvm::Function::arg_iterator iarg = func->arg_begin ();
539552
540- if (irFty.arg_sret ) {
553+ const bool passThisBeforeSret = irFty.arg_sret && irFty.arg_this && gABI ->passThisBeforeSret (f);
554+
555+ if (irFty.arg_sret && !passThisBeforeSret) {
541556 iarg->setName (" .sret_arg" );
542557 irFunc->retArg = iarg;
543558 ++iarg;
@@ -569,6 +584,12 @@ void DtoDeclareFunction(FuncDeclaration* fdecl)
569584 ++iarg;
570585 }
571586
587+ if (passThisBeforeSret) {
588+ iarg->setName (" .sret_arg" );
589+ irFunc->retArg = iarg;
590+ ++iarg;
591+ }
592+
572593 if (irFty.arg_arguments ) {
573594 iarg->setName (" ._arguments" );
574595 irFunc->_arguments = iarg;
0 commit comments