{ $Id$ Copyright (c) 2002 by Florian Klaempfl Generates the argument location information for i386 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published bymethodpointer the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. **************************************************************************** } { Generates the argument location information for i386. } unit cpupara; {$i fpcdefs.inc} interface uses cpubase, globtype, symtype,symdef,paramgr; type { Returns the location for the nr-st 32 Bit int parameter if every parameter before is an 32 Bit int parameter as well and if the calling conventions for the helper routines of the rtl are used. } ti386paramanager = class(tparamanager) function ret_in_acc(def : tdef;calloption : tproccalloption) : boolean;override; function ret_in_param(def : tdef;calloption : tproccalloption) : boolean;override; function getintparaloc(nr : longint) : tparalocation;override; procedure create_param_loc_info(p : tabstractprocdef);override; function getselflocation(p : tabstractprocdef) : tparalocation;override; end; implementation uses systems, symconst, verbose; function ti386paramanager.ret_in_acc(def : tdef;calloption : tproccalloption) : boolean; begin { Win32 returns small records in the accumulator } if ((target_info.system=system_i386_win32) and (calloption=pocall_stdcall) and (def.deftype=recorddef) and (def.size<=8)) then result:=true else result:=inherited ret_in_acc(def,calloption); end; function ti386paramanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean; begin { Win32 returns small records in the accumulator } if ((target_info.system=system_i386_win32) and (calloption=pocall_stdcall) and (def.deftype=recorddef) and (def.size<=8)) then result:=false else result:=inherited ret_in_param(def,calloption); end; function ti386paramanager.getintparaloc(nr : longint) : tparalocation; begin end; procedure ti386paramanager.create_param_loc_info(p : tabstractprocdef); begin { set default para_alignment to target_info.stackalignment } { if para_alignment=0 then para_alignment:=aktalignment.paraalign; } end; function ti386paramanager.getselflocation(p : tabstractprocdef) : tparalocation; begin getselflocation.loc:=LOC_REFERENCE; getselflocation.reference.index:=R_ESP; getselflocation.reference.offset:=4; end; begin paramanager:=ti386paramanager.create; end. { $Log$ Revision 1.5 2002-11-18 17:32:00 peter * pass proccalloption to ret_in_xxx and push_xxx functions Revision 1.4 2002/11/15 01:58:56 peter * merged changes from 1.0.7 up to 04-11 - -V option for generating bug report tracing - more tracing for option parsing - errors for cdecl and high() - win32 import stabs - win32 records<=8 are returned in eax:edx (turned off by default) - heaptrc update - more info for temp management in .s file with EXTDEBUG Revision 1.3 2002/08/09 07:33:04 florian * a couple of interface related fixes Revision 1.2 2002/07/11 14:41:32 florian * start of the new generic parameter handling Revision 1.1 2002/07/07 09:52:33 florian * powerpc target fixed, very simple units can be compiled * some basic stuff for better callparanode handling, far from being finished }