From 067536f8dadacb078043592c11b2f5dc5157bc53 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Thu, 23 Dec 2010 16:11:06 +0000 Subject: [PATCH] * pass large "const" record parameters by reference for non-cdecl/cppdecl (mantis #17442) git-svn-id: trunk@16620 - --- compiler/x86_64/cpupara.pas | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/compiler/x86_64/cpupara.pas b/compiler/x86_64/cpupara.pas index a529ccbc88..e753a04bb0 100644 --- a/compiler/x86_64/cpupara.pas +++ b/compiler/x86_64/cpupara.pas @@ -664,6 +664,16 @@ unit cpupara; { Win ABI depends on size to pass it in a register or not } else if (target_info.system=system_x86_64_win64) then result:=not aggregate_in_registers_win64(varspez,def.size) + { pass constant parameters that would be passed via memory by + reference for non-cdecl/cppdecl, and make sure that the tmethod + record (size=16) is passed the same way as a complex procvar } + else if ((varspez=vs_const) and + not(calloption in [pocall_cdecl,pocall_cppdecl])) or + (def.size=16) then + begin + numclasses:=classify_argument(def,vs_value,def.size,classes,0); + result:=numclasses=0; + end else { SysV ABI always passes it as value parameter } result:=false;