From e9a1dff46a687e25f0dc46110aa3fb3fbdd590da Mon Sep 17 00:00:00 2001 From: florian Date: Mon, 30 Oct 2006 10:45:26 +0000 Subject: [PATCH] * fixed most calling convention trouble on arm-linux git-svn-id: trunk@5091 - --- compiler/arm/cpupara.pas | 25 +++++++++++++++++++++++-- compiler/arm/narmadd.pas | 1 - 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/compiler/arm/cpupara.pas b/compiler/arm/cpupara.pas index 0acf6d0a4b..2c07b1792c 100644 --- a/compiler/arm/cpupara.pas +++ b/compiler/arm/cpupara.pas @@ -37,6 +37,7 @@ unit cpupara; function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override; function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override; function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override; + function ret_in_param(def : tdef;calloption : tproccalloption) : boolean;override; procedure getintparaloc(calloption : tproccalloption; nr : longint;var cgpara:TCGPara);override; function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override; function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint;override; @@ -177,6 +178,26 @@ unit cpupara; end; + function tarmparamanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean; + begin + case def.deftype of + recorddef: + { this is how gcc 4.0.4 on linux seems to do it, it doesn't look like being + ARM ABI standard compliant + } + result:=not((trecorddef(def).symtable.symindex.count=1) and + not(ret_in_param(tabstractvarsym(trecorddef(def).symtable.symindex.search(1)).vardef,calloption))); + { + objectdef + arraydef: + result:=not(def.size in [1,2,4]); + } + else + result:=inherited ret_in_param(def,calloption); + end; + end; + + procedure tarmparamanager.init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword); begin curintreg:=RS_R0; @@ -413,7 +434,7 @@ unit cpupara; retcgsize:=OS_ADDR else retcgsize:=def_cgsize(p.returndef); - + location_reset(p.funcretloc[side],LOC_INVALID,OS_NO); p.funcretloc[side].size:=retcgsize; @@ -427,7 +448,7 @@ unit cpupara; { Return in FPU register? } if p.returndef.deftype=floatdef then begin - if (p.proccalloption in [pocall_cdecl,pocall_cppdecl,pocall_softfloat]) or (cs_fp_emulation in aktmoduleswitches) then + if (p.proccalloption in [pocall_softfloat]) or (cs_fp_emulation in aktmoduleswitches) then begin case retcgsize of OS_64, diff --git a/compiler/arm/narmadd.pas b/compiler/arm/narmadd.pas index 79a8c92a09..aaa187342a 100644 --- a/compiler/arm/narmadd.pas +++ b/compiler/arm/narmadd.pas @@ -243,7 +243,6 @@ interface procedure tarmaddnode.second_cmp64bit; var unsigned : boolean; - tmpreg : tregister; oldnodetype : tnodetype; begin pass_left_right;