cpupara.pas 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. {
  2. $Id$
  3. Copyright (c) 2002 by Florian Klaempfl
  4. Generates the argument location information for i386
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published bymethodpointer
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. { Generates the argument location information for i386.
  19. }
  20. unit cpupara;
  21. {$i fpcdefs.inc}
  22. interface
  23. uses
  24. cpubase,
  25. globtype,
  26. symtype,symdef,paramgr;
  27. type
  28. { Returns the location for the nr-st 32 Bit int parameter
  29. if every parameter before is an 32 Bit int parameter as well
  30. and if the calling conventions for the helper routines of the
  31. rtl are used.
  32. }
  33. ti386paramanager = class(tparamanager)
  34. function ret_in_acc(def : tdef;calloption : tproccalloption) : boolean;override;
  35. function ret_in_param(def : tdef;calloption : tproccalloption) : boolean;override;
  36. function push_addr_param(def : tdef;calloption : tproccalloption) : boolean;override;
  37. function getintparaloc(nr : longint) : tparalocation;override;
  38. procedure create_param_loc_info(p : tabstractprocdef);override;
  39. function getselflocation(p : tabstractprocdef) : tparalocation;override;
  40. end;
  41. implementation
  42. uses
  43. systems,
  44. symconst,
  45. verbose;
  46. function ti386paramanager.ret_in_acc(def : tdef;calloption : tproccalloption) : boolean;
  47. begin
  48. { Win32 returns small records in the accumulator }
  49. if ((target_info.system=system_i386_win32) and
  50. (calloption=pocall_stdcall) and
  51. (def.deftype=recorddef) and (def.size<=8)) then
  52. result:=true
  53. else
  54. result:=inherited ret_in_acc(def,calloption);
  55. end;
  56. function ti386paramanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean;
  57. begin
  58. { Win32 returns small records in the accumulator }
  59. if ((target_info.system=system_i386_win32) and
  60. (calloption=pocall_stdcall) and
  61. (def.deftype=recorddef) and (def.size<=8)) then
  62. result:=false
  63. else
  64. result:=inherited ret_in_param(def,calloption);
  65. end;
  66. function ti386paramanager.push_addr_param(def : tdef;calloption : tproccalloption) : boolean;
  67. begin
  68. case target_info.system of
  69. system_i386_win32 :
  70. begin
  71. case def.deftype of
  72. recorddef :
  73. begin
  74. if (calloption=pocall_stdcall) and (def.size<=8) then
  75. begin
  76. result:=false;
  77. exit;
  78. end;
  79. end;
  80. arraydef :
  81. begin
  82. if (tarraydef(def).highrange>=tarraydef(def).lowrange) and
  83. (calloption in [pocall_cdecl,pocall_cppdecl]) then
  84. begin
  85. result:=false;
  86. exit;
  87. end;
  88. end;
  89. end;
  90. end;
  91. end;
  92. result:=inherited push_addr_param(def,calloption);
  93. end;
  94. function ti386paramanager.getintparaloc(nr : longint) : tparalocation;
  95. begin
  96. end;
  97. procedure ti386paramanager.create_param_loc_info(p : tabstractprocdef);
  98. begin
  99. { set default para_alignment to target_info.stackalignment }
  100. { if para_alignment=0 then
  101. para_alignment:=aktalignment.paraalign;
  102. }
  103. end;
  104. function ti386paramanager.getselflocation(p : tabstractprocdef) : tparalocation;
  105. begin
  106. getselflocation.loc:=LOC_REFERENCE;
  107. getselflocation.reference.index:=R_ESP;
  108. getselflocation.reference.offset:=4;
  109. end;
  110. begin
  111. paramanager:=ti386paramanager.create;
  112. end.
  113. {
  114. $Log$
  115. Revision 1.7 2002-12-24 15:56:50 peter
  116. * stackpointer_alloc added for adjusting ESP. Win32 needs
  117. this for the pageprotection
  118. Revision 1.6 2002/12/17 22:19:33 peter
  119. * fixed pushing of records>8 bytes with stdcall
  120. * simplified hightree loading
  121. Revision 1.5 2002/11/18 17:32:00 peter
  122. * pass proccalloption to ret_in_xxx and push_xxx functions
  123. Revision 1.4 2002/11/15 01:58:56 peter
  124. * merged changes from 1.0.7 up to 04-11
  125. - -V option for generating bug report tracing
  126. - more tracing for option parsing
  127. - errors for cdecl and high()
  128. - win32 import stabs
  129. - win32 records<=8 are returned in eax:edx (turned off by default)
  130. - heaptrc update
  131. - more info for temp management in .s file with EXTDEBUG
  132. Revision 1.3 2002/08/09 07:33:04 florian
  133. * a couple of interface related fixes
  134. Revision 1.2 2002/07/11 14:41:32 florian
  135. * start of the new generic parameter handling
  136. Revision 1.1 2002/07/07 09:52:33 florian
  137. * powerpc target fixed, very simple units can be compiled
  138. * some basic stuff for better callparanode handling, far from being finished
  139. }