cpupara.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  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. cclasses,globtype,
  25. aasmtai,
  26. cpubase,
  27. cgbase,
  28. symconst,symtype,symdef,paramgr;
  29. type
  30. ti386paramanager = class(tparamanager)
  31. function ret_in_param(def : tdef;calloption : tproccalloption) : boolean;override;
  32. function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
  33. function get_para_align(calloption : tproccalloption):byte;override;
  34. function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override;
  35. function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
  36. function get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;override;
  37. { Returns the location for the nr-st 32 Bit int parameter
  38. if every parameter before is an 32 Bit int parameter as well
  39. and if the calling conventions for the helper routines of the
  40. rtl are used.
  41. }
  42. function getintparaloc(calloption : tproccalloption; nr : longint) : tparalocation;override;
  43. function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
  44. function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tlinkedlist):longint;override;
  45. private
  46. procedure create_funcret_paraloc_info(p : tabstractprocdef; side: tcallercallee);
  47. function create_stdcall_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  48. function create_register_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  49. end;
  50. implementation
  51. uses
  52. cutils,
  53. systems,verbose,
  54. defutil,
  55. cpuinfo;
  56. const
  57. parasupregs : array[0..2] of tsuperregister = (RS_EAX,RS_EDX,RS_ECX);
  58. {****************************************************************************
  59. TI386PARAMANAGER
  60. ****************************************************************************}
  61. function ti386paramanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean;
  62. begin
  63. case target_info.system of
  64. system_i386_win32 :
  65. begin
  66. case def.deftype of
  67. recorddef :
  68. begin
  69. { Win32 GCC returns small records in the FUNCTION_RETURN_REG.
  70. For stdcall we follow delphi instead of GCC }
  71. if (calloption in [pocall_cdecl,pocall_cppdecl]) and
  72. (def.size<=8) then
  73. begin
  74. result:=false;
  75. exit;
  76. end;
  77. end;
  78. end;
  79. end;
  80. end;
  81. result:=inherited ret_in_param(def,calloption);
  82. end;
  83. function ti386paramanager.push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  84. begin
  85. case target_info.system of
  86. system_i386_win32 :
  87. begin
  88. case def.deftype of
  89. recorddef :
  90. begin
  91. { Win32 passes small records on the stack for call by
  92. value }
  93. if (calloption in [pocall_stdcall,pocall_cdecl,pocall_cppdecl]) and
  94. (varspez=vs_value) and
  95. (def.size<=8) then
  96. begin
  97. result:=false;
  98. exit;
  99. end;
  100. end;
  101. arraydef :
  102. begin
  103. { Win32 passes arrays on the stack for call by
  104. value }
  105. if (calloption in [pocall_stdcall,pocall_cdecl,pocall_cppdecl]) and
  106. (varspez=vs_value) and
  107. (tarraydef(def).highrange>=tarraydef(def).lowrange) then
  108. begin
  109. result:=true;
  110. exit;
  111. end;
  112. end;
  113. end;
  114. end;
  115. end;
  116. if calloption=pocall_register then
  117. begin
  118. case def.deftype of
  119. floatdef :
  120. begin
  121. result:=true;
  122. exit;
  123. end;
  124. end;
  125. end;
  126. result:=inherited push_addr_param(varspez,def,calloption);
  127. end;
  128. function ti386paramanager.get_para_align(calloption : tproccalloption):byte;
  129. begin
  130. if calloption=pocall_oldfpccall then
  131. begin
  132. if target_info.system in [system_i386_go32v2,system_i386_watcom] then
  133. result:=2
  134. else
  135. result:=4;
  136. end
  137. else
  138. result:=std_param_align;
  139. end;
  140. function ti386paramanager.get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;
  141. begin
  142. case calloption of
  143. pocall_internproc :
  144. result:=[];
  145. pocall_compilerproc :
  146. begin
  147. if pocall_default=pocall_oldfpccall then
  148. result:=[RS_EAX,RS_EDX,RS_ECX,RS_ESI,RS_EDI,RS_EBX]
  149. else
  150. result:=[RS_EAX,RS_EDX,RS_ECX];
  151. end;
  152. pocall_inline,
  153. pocall_register,
  154. pocall_safecall,
  155. pocall_stdcall,
  156. pocall_cdecl,
  157. pocall_cppdecl :
  158. result:=[RS_EAX,RS_EDX,RS_ECX];
  159. pocall_far16,
  160. pocall_pascal,
  161. pocall_oldfpccall :
  162. result:=[RS_EAX,RS_EDX,RS_ECX,RS_ESI,RS_EDI,RS_EBX];
  163. else
  164. internalerror(200309071);
  165. end;
  166. end;
  167. function ti386paramanager.get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;
  168. begin
  169. result:=[0..first_fpu_imreg-1];
  170. end;
  171. function ti386paramanager.get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;
  172. begin
  173. result:=[0..first_sse_imreg-1];
  174. end;
  175. function ti386paramanager.getintparaloc(calloption : tproccalloption; nr : longint) : tparalocation;
  176. begin
  177. fillchar(result,sizeof(tparalocation),0);
  178. result.size:=OS_INT;
  179. if calloption=pocall_register then
  180. begin
  181. if (nr<=high(parasupregs)+1) then
  182. begin
  183. if nr=0 then
  184. internalerror(200309271);
  185. result.loc:=LOC_REGISTER;
  186. result.register:=newreg(R_INTREGISTER,parasupregs[nr-1],R_SUBWHOLE);
  187. end
  188. else
  189. begin
  190. result.loc:=LOC_REFERENCE;
  191. result.reference.index:=NR_STACK_POINTER_REG;
  192. result.reference.offset:=POINTER_SIZE*nr;
  193. end;
  194. end
  195. else
  196. begin
  197. result.loc:=LOC_REFERENCE;
  198. result.reference.index:=NR_STACK_POINTER_REG;
  199. result.reference.offset:=POINTER_SIZE*nr;
  200. end;
  201. end;
  202. procedure ti386paramanager.create_funcret_paraloc_info(p : tabstractprocdef; side: tcallercallee);
  203. var
  204. paraloc : tparalocation;
  205. begin
  206. { Function return }
  207. fillchar(paraloc,sizeof(tparalocation),0);
  208. paraloc.size:=def_cgsize(p.rettype.def);
  209. { Return in FPU register? }
  210. if p.rettype.def.deftype=floatdef then
  211. begin
  212. paraloc.loc:=LOC_FPUREGISTER;
  213. paraloc.register:=NR_FPU_RESULT_REG;
  214. end
  215. else
  216. { Return in register? }
  217. if not ret_in_param(p.rettype.def,p.proccalloption) then
  218. begin
  219. paraloc.loc:=LOC_REGISTER;
  220. {$ifndef cpu64bit}
  221. if paraloc.size in [OS_64,OS_S64] then
  222. begin
  223. paraloc.register64.reglo:=NR_FUNCTION_RETURN64_LOW_REG;
  224. paraloc.register64.reghi:=NR_FUNCTION_RETURN64_HIGH_REG;
  225. end
  226. else
  227. {$endif cpu64bit}
  228. begin
  229. paraloc.register:=NR_FUNCTION_RETURN_REG;
  230. end;
  231. end
  232. else
  233. begin
  234. paraloc.loc:=LOC_REFERENCE;
  235. end;
  236. p.funcret_paraloc[side]:=paraloc;
  237. end;
  238. function ti386paramanager.create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tlinkedlist):longint;
  239. var
  240. hp : tparaitem;
  241. paraloc : tparalocation;
  242. l,
  243. varalign,
  244. paraalign,
  245. parasize : longint;
  246. begin
  247. parasize:=0;
  248. paraalign:=get_para_align(p.proccalloption);
  249. { Retrieve last know info from normal parameters }
  250. hp:=tparaitem(p.para.last);
  251. if assigned(hp) then
  252. parasize:=hp.paraloc[callerside].reference.offset;
  253. { Assign varargs }
  254. hp:=tparaitem(varargspara.first);
  255. while assigned(hp) do
  256. begin
  257. paraloc.size:=def_cgsize(hp.paratype.def);
  258. paraloc.loc:=LOC_REFERENCE;
  259. paraloc.alignment:=paraalign;
  260. paraloc.reference.index:=NR_STACK_POINTER_REG;
  261. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  262. varalign:=size_2_align(l);
  263. paraloc.reference.offset:=parasize;
  264. varalign:=used_align(varalign,paraalign,paraalign);
  265. parasize:=align(parasize+l,varalign);
  266. hp.paraloc[callerside]:=paraloc;
  267. hp:=tparaitem(hp.next);
  268. end;
  269. { We need to return the size allocated }
  270. result:=parasize;
  271. end;
  272. function ti386paramanager.create_stdcall_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  273. var
  274. hp : tparaitem;
  275. paraloc : tparalocation;
  276. l,
  277. varalign,
  278. paraalign,
  279. parasize : longint;
  280. begin
  281. parasize:=0;
  282. paraalign:=get_para_align(p.proccalloption);
  283. { we push Flags and CS as long
  284. to cope with the IRETD
  285. and we save 6 register + 4 selectors }
  286. if po_interrupt in p.procoptions then
  287. inc(parasize,8+6*4+4*2);
  288. { Offset is calculated like:
  289. sub esp,12
  290. mov [esp+8],para3
  291. mov [esp+4],para2
  292. mov [esp],para1
  293. call function
  294. That means the for pushes the para with the
  295. highest offset (see para3) needs to be pushed first
  296. }
  297. hp:=tparaitem(p.para.first);
  298. while assigned(hp) do
  299. begin
  300. if hp.paratyp in [vs_var,vs_out] then
  301. paraloc.size:=OS_ADDR
  302. else
  303. paraloc.size:=def_cgsize(hp.paratype.def);
  304. paraloc.loc:=LOC_REFERENCE;
  305. paraloc.alignment:=paraalign;
  306. if side=callerside then
  307. paraloc.reference.index:=NR_STACK_POINTER_REG
  308. else
  309. paraloc.reference.index:=NR_FRAME_POINTER_REG;
  310. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  311. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  312. paraloc.reference.offset:=parasize;
  313. parasize:=align(parasize+l,varalign);
  314. hp.paraloc[side]:=paraloc;
  315. hp:=tparaitem(hp.next);
  316. end;
  317. { Adapt offsets for left-to-right calling }
  318. if p.proccalloption in pushleftright_pocalls then
  319. begin
  320. hp:=tparaitem(p.para.first);
  321. while assigned(hp) do
  322. begin
  323. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  324. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  325. l:=align(l,varalign);
  326. hp.paraloc[side].reference.offset:=parasize-hp.paraloc[side].reference.offset-l;
  327. if side=calleeside then
  328. inc(hp.paraloc[side].reference.offset,target_info.first_parm_offset);
  329. hp:=tparaitem(hp.next);
  330. end;
  331. end
  332. else
  333. begin
  334. { Only need to adapt the callee side to include the
  335. standard stackframe size }
  336. if side=calleeside then
  337. begin
  338. hp:=tparaitem(p.para.first);
  339. while assigned(hp) do
  340. begin
  341. inc(hp.paraloc[side].reference.offset,target_info.first_parm_offset);
  342. hp:=tparaitem(hp.next);
  343. end;
  344. end;
  345. end;
  346. { We need to return the size allocated }
  347. result:=parasize;
  348. end;
  349. function ti386paramanager.create_register_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  350. var
  351. hp : tparaitem;
  352. paraloc : tparalocation;
  353. subreg : tsubregister;
  354. pushaddr,
  355. is_64bit : boolean;
  356. l,parareg,
  357. varalign,
  358. paraalign,
  359. parasize : longint;
  360. begin
  361. parareg:=0;
  362. parasize:=0;
  363. paraalign:=get_para_align(p.proccalloption);
  364. { Register parameters are assigned from left to right }
  365. hp:=tparaitem(p.para.first);
  366. while assigned(hp) do
  367. begin
  368. pushaddr:=push_addr_param(hp.paratyp,hp.paratype.def,p.proccalloption);
  369. if pushaddr then
  370. paraloc.size:=OS_ADDR
  371. else
  372. paraloc.size:=def_cgsize(hp.paratype.def);
  373. paraloc.alignment:=paraalign;
  374. is_64bit:=(paraloc.size in [OS_64,OS_S64,OS_F64]);
  375. {
  376. EAX
  377. EDX
  378. ECX
  379. Stack
  380. Stack
  381. 64bit values,floats,arrays and records are always
  382. on the stack.
  383. }
  384. if (parareg<=high(parasupregs)) and
  385. not(
  386. is_64bit or
  387. (hp.paratype.def.deftype=floatdef) or
  388. ((hp.paratype.def.deftype in [floatdef,recorddef,arraydef]) and
  389. (not pushaddr))
  390. ) then
  391. begin
  392. paraloc.loc:=LOC_REGISTER;
  393. if (paraloc.size=OS_NO) or is_64bit then
  394. subreg:=R_SUBWHOLE
  395. else
  396. subreg:=cgsize2subreg(paraloc.size);
  397. paraloc.alignment:=paraalign;
  398. paraloc.register:=newreg(R_INTREGISTER,parasupregs[parareg],subreg);
  399. inc(parareg);
  400. end
  401. else
  402. begin
  403. paraloc.loc:=LOC_REFERENCE;
  404. if side=callerside then
  405. paraloc.reference.index:=NR_STACK_POINTER_REG
  406. else
  407. paraloc.reference.index:=NR_FRAME_POINTER_REG;
  408. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  409. varalign:=size_2_align(l);
  410. paraloc.reference.offset:=parasize;
  411. varalign:=used_align(varalign,paraalign,paraalign);
  412. parasize:=align(parasize+l,varalign);
  413. end;
  414. hp.paraloc[side]:=paraloc;
  415. hp:=tparaitem(hp.next);
  416. end;
  417. { Register parameters are assigned from left-to-right, adapt offset
  418. for calleeside to be reversed }
  419. hp:=tparaitem(p.para.first);
  420. while assigned(hp) do
  421. begin
  422. if (hp.paraloc[side].loc=LOC_REFERENCE) then
  423. begin
  424. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  425. varalign:=used_align(size_2_align(l),paraalign,paraalign);
  426. l:=align(l,varalign);
  427. hp.paraloc[side].reference.offset:=parasize-hp.paraloc[side].reference.offset-l;
  428. if side=calleeside then
  429. inc(hp.paraloc[side].reference.offset,target_info.first_parm_offset);
  430. end;
  431. hp:=tparaitem(hp.next);
  432. end;
  433. { We need to return the size allocated }
  434. result:=parasize;
  435. end;
  436. function ti386paramanager.create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;
  437. begin
  438. result:=0;
  439. case p.proccalloption of
  440. pocall_register :
  441. result:=create_register_paraloc_info(p,side);
  442. pocall_inline,
  443. pocall_compilerproc,
  444. pocall_internproc :
  445. begin
  446. { Use default calling }
  447. if (pocall_default=pocall_register) then
  448. result:=create_register_paraloc_info(p,side)
  449. else
  450. result:=create_stdcall_paraloc_info(p,side);
  451. end;
  452. else
  453. result:=create_stdcall_paraloc_info(p,side);
  454. end;
  455. create_funcret_paraloc_info(p,side);
  456. end;
  457. begin
  458. paramanager:=ti386paramanager.create;
  459. end.
  460. {
  461. $Log$
  462. Revision 1.46 2003-12-01 18:44:15 peter
  463. * fixed some crashes
  464. * fixed varargs and register calling probs
  465. Revision 1.45 2003/11/28 17:24:22 peter
  466. * reversed offset calculation for caller side so it works
  467. correctly for interfaces
  468. Revision 1.44 2003/11/23 17:05:16 peter
  469. * register calling is left-right
  470. * parameter ordering
  471. * left-right calling inserts result parameter last
  472. Revision 1.43 2003/11/11 21:11:23 peter
  473. * check for push_addr
  474. Revision 1.42 2003/10/19 01:34:30 florian
  475. * some ppc stuff fixed
  476. * memory leak fixed
  477. Revision 1.41 2003/10/17 14:38:32 peter
  478. * 64k registers supported
  479. * fixed some memory leaks
  480. Revision 1.40 2003/10/11 16:06:42 florian
  481. * fixed some MMX<->SSE
  482. * started to fix ppc, needs an overhaul
  483. + stabs info improve for spilling, not sure if it works correctly/completly
  484. - MMX_SUPPORT removed from Makefile.fpc
  485. Revision 1.39 2003/10/10 17:48:14 peter
  486. * old trgobj moved to x86/rgcpu and renamed to trgx86fpu
  487. * tregisteralloctor renamed to trgobj
  488. * removed rgobj from a lot of units
  489. * moved location_* and reference_* to cgobj
  490. * first things for mmx register allocation
  491. Revision 1.38 2003/10/07 15:17:07 peter
  492. * inline supported again, LOC_REFERENCEs are used to pass the
  493. parameters
  494. * inlineparasymtable,inlinelocalsymtable removed
  495. * exitlabel inserting fixed
  496. Revision 1.37 2003/10/05 21:21:52 peter
  497. * c style array of const generates callparanodes
  498. * varargs paraloc fixes
  499. Revision 1.36 2003/10/03 22:00:33 peter
  500. * parameter alignment fixes
  501. Revision 1.35 2003/10/01 20:34:49 peter
  502. * procinfo unit contains tprocinfo
  503. * cginfo renamed to cgbase
  504. * moved cgmessage to verbose
  505. * fixed ppc and sparc compiles
  506. Revision 1.34 2003/09/30 21:02:37 peter
  507. * updates for inlining
  508. Revision 1.33 2003/09/28 17:55:04 peter
  509. * parent framepointer changed to hidden parameter
  510. * tloadparentfpnode added
  511. Revision 1.32 2003/09/28 13:35:24 peter
  512. * register calling updates
  513. Revision 1.31 2003/09/25 21:30:11 peter
  514. * parameter fixes
  515. Revision 1.30 2003/09/23 17:56:06 peter
  516. * locals and paras are allocated in the code generation
  517. * tvarsym.localloc contains the location of para/local when
  518. generating code for the current procedure
  519. Revision 1.29 2003/09/16 16:17:01 peter
  520. * varspez in calls to push_addr_param
  521. Revision 1.28 2003/09/10 08:31:47 marco
  522. * Patch from Peter for paraloc
  523. Revision 1.27 2003/09/09 21:03:17 peter
  524. * basics for x86 register calling
  525. Revision 1.26 2003/09/09 15:55:05 peter
  526. * winapi doesn't like pushing 8 byte record
  527. Revision 1.25 2003/09/08 18:28:51 peter
  528. * fix compilerproc for default=oldfpccall
  529. Revision 1.24 2003/09/07 22:09:35 peter
  530. * preparations for different default calling conventions
  531. * various RA fixes
  532. Revision 1.23 2003/09/03 15:55:01 peter
  533. * NEWRA branch merged
  534. Revision 1.22.2.2 2003/08/28 18:35:08 peter
  535. * tregister changed to cardinal
  536. Revision 1.22.2.1 2003/08/27 19:55:54 peter
  537. * first tregister patch
  538. Revision 1.22 2003/08/11 21:18:20 peter
  539. * start of sparc support for newra
  540. Revision 1.21 2003/07/05 20:11:41 jonas
  541. * create_paraloc_info() is now called separately for the caller and
  542. callee info
  543. * fixed ppc cycle
  544. Revision 1.20 2003/07/02 22:18:04 peter
  545. * paraloc splitted in callerparaloc,calleeparaloc
  546. * sparc calling convention updates
  547. Revision 1.19 2003/06/17 16:34:19 peter
  548. * freeintparaloc added
  549. Revision 1.18 2003/06/07 18:57:04 jonas
  550. + added freeintparaloc
  551. * ppc get/freeintparaloc now check whether the parameter regs are
  552. properly allocated/deallocated (and get an extra list para)
  553. * ppc a_call_* now internalerrors if pi_do_call is not yet set
  554. * fixed lot of missing pi_do_call's
  555. Revision 1.17 2003/06/06 14:41:22 peter
  556. * needs cpuinfo
  557. Revision 1.16 2003/06/06 07:36:06 michael
  558. + Forgot a line in patch from peter
  559. Revision 1.15 2003/06/06 07:35:14 michael
  560. + Patch to Patch from peter
  561. Revision 1.14 2003/06/06 07:34:11 michael
  562. + Patch from peter
  563. Revision 1.13 2003/06/05 20:58:05 peter
  564. * updated
  565. Revision 1.12 2003/05/30 23:57:08 peter
  566. * more sparc cleanup
  567. * accumulator removed, splitted in function_return_reg (called) and
  568. function_result_reg (caller)
  569. Revision 1.11 2003/05/13 15:16:13 peter
  570. * removed ret_in_acc, it's the reverse of ret_in_param
  571. * fixed ret_in_param for win32 cdecl array
  572. Revision 1.10 2003/04/22 23:50:23 peter
  573. * firstpass uses expectloc
  574. * checks if there are differences between the expectloc and
  575. location.loc from secondpass in EXTDEBUG
  576. Revision 1.9 2003/04/22 14:33:38 peter
  577. * removed some notes/hints
  578. Revision 1.8 2003/01/08 18:43:57 daniel
  579. * Tregister changed into a record
  580. Revision 1.7 2002/12/24 15:56:50 peter
  581. * stackpointer_alloc added for adjusting ESP. Win32 needs
  582. this for the pageprotection
  583. Revision 1.6 2002/12/17 22:19:33 peter
  584. * fixed pushing of records>8 bytes with stdcall
  585. * simplified hightree loading
  586. Revision 1.5 2002/11/18 17:32:00 peter
  587. * pass proccalloption to ret_in_xxx and push_xxx functions
  588. Revision 1.4 2002/11/15 01:58:56 peter
  589. * merged changes from 1.0.7 up to 04-11
  590. - -V option for generating bug report tracing
  591. - more tracing for option parsing
  592. - errors for cdecl and high()
  593. - win32 import stabs
  594. - win32 records<=8 are returned in eax:edx (turned off by default)
  595. - heaptrc update
  596. - more info for temp management in .s file with EXTDEBUG
  597. Revision 1.3 2002/08/09 07:33:04 florian
  598. * a couple of interface related fixes
  599. Revision 1.2 2002/07/11 14:41:32 florian
  600. * start of the new generic parameter handling
  601. Revision 1.1 2002/07/07 09:52:33 florian
  602. * powerpc target fixed, very simple units can be compiled
  603. * some basic stuff for better callparanode handling, far from being finished
  604. }