paramgr.pas 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. {
  2. $Id$
  3. Copyright (c) 2002 by Florian Klaempfl
  4. Generic calling convention handling
  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 by
  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. {# Parameter passing manager. Used to manage how
  19. parameters are passed to routines.
  20. }
  21. unit paramgr;
  22. {$i fpcdefs.inc}
  23. interface
  24. uses
  25. cclasses,globtype,
  26. cpubase,cgbase,
  27. aasmtai,
  28. symconst,symtype,symdef;
  29. type
  30. tvarargsinfo = (
  31. va_uses_float_reg
  32. );
  33. tvarargspara = class(tlinkedlist)
  34. varargsinfo : set of tvarargsinfo;
  35. end;
  36. {# This class defines some methods to take care of routine
  37. parameters. It should be overriden for each new processor
  38. }
  39. tparamanager = class
  40. {# Returns true if the return value is actually a parameter
  41. pointer.
  42. }
  43. function ret_in_param(def : tdef;calloption : tproccalloption) : boolean;virtual;
  44. function push_high_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;virtual;
  45. { Returns true if a parameter is too large to copy and only
  46. the address is pushed
  47. }
  48. function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;virtual;
  49. { return the size of a push }
  50. function push_size(varspez:tvarspez;def : tdef;calloption : tproccalloption) : longint;
  51. { Returns true if a parameter needs to be copied on the stack, this
  52. is required for cdecl procedures
  53. }
  54. function copy_value_on_stack(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;virtual;
  55. {# Returns a structure giving the information on
  56. the storage of the parameter (which must be
  57. an integer parameter). This is only used when calling
  58. internal routines directly, where all parameters must
  59. be 4-byte values.
  60. In case the location is a register, this register is allocated.
  61. Call freeintparaloc() after the call to free the locations again.
  62. Default implementation: don't do anything at all (in case you don't
  63. use register parameter passing)
  64. @param(list Current assembler list)
  65. @param(nr Parameter number of routine, starting from 1)
  66. }
  67. function get_para_align(calloption : tproccalloption):byte;virtual;
  68. function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;virtual;
  69. function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;virtual;
  70. function get_volatile_registers_flags(calloption : tproccalloption):tcpuregisterset;virtual;
  71. function get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;virtual;
  72. function getintparaloc(calloption : tproccalloption; nr : longint) : tparalocation;virtual;abstract;
  73. {# allocate a parameter location created with create_paraloc_info
  74. @param(list Current assembler list)
  75. @param(loc Parameter location)
  76. }
  77. procedure allocparaloc(list: taasmoutput; const loc: tparalocation); virtual;
  78. {# free a parameter location allocated with allocparaloc
  79. @param(list Current assembler list)
  80. @param(loc Parameter location)
  81. }
  82. procedure freeparaloc(list: taasmoutput; const loc: tparalocation); virtual;
  83. { This is used to populate the location information on all parameters
  84. for the routine as seen in either the caller or the callee. It returns
  85. the size allocated on the stack
  86. }
  87. function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;virtual;abstract;
  88. { This is used to populate the location information on all parameters
  89. for the routine when it is being inlined. It returns
  90. the size allocated on the stack
  91. }
  92. function create_inline_paraloc_info(p : tabstractprocdef):longint;virtual;
  93. { This is used to populate the location information on all parameters
  94. for the routine that are passed as varargs. It returns
  95. the size allocated on the stack (including the normal parameters)
  96. }
  97. function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargspara):longint;virtual;abstract;
  98. { Return the location of the low and high part of a 64bit parameter }
  99. procedure splitparaloc64(const locpara:tparalocation;var loclopara,lochipara:tparalocation);virtual;
  100. procedure alloctempregs(list: taasmoutput;var locpara:tparalocation);virtual;
  101. end;
  102. var
  103. paramanager : tparamanager;
  104. implementation
  105. uses
  106. cpuinfo,systems,
  107. cgobj,
  108. defutil,verbose;
  109. { true if uses a parameter as return value }
  110. function tparamanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean;
  111. begin
  112. ret_in_param:=(def.deftype in [arraydef,recorddef]) or
  113. ((def.deftype=stringdef) and (tstringdef(def).string_typ in [st_shortstring,st_longstring])) or
  114. ((def.deftype=procvardef) and (po_methodpointer in tprocvardef(def).procoptions)) or
  115. ((def.deftype=objectdef) and is_object(def)) or
  116. (def.deftype=variantdef) or
  117. ((def.deftype=setdef) and (tsetdef(def).settype<>smallset));
  118. end;
  119. function tparamanager.push_high_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  120. begin
  121. push_high_param:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and
  122. (
  123. is_open_array(def) or
  124. is_open_string(def) or
  125. is_array_of_const(def)
  126. );
  127. end;
  128. { true if a parameter is too large to copy and only the address is pushed }
  129. function tparamanager.push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  130. begin
  131. result:=false;
  132. { var,out always require address }
  133. if varspez in [vs_var,vs_out] then
  134. begin
  135. result:=true;
  136. exit;
  137. end;
  138. { Only vs_const, vs_value here }
  139. case def.deftype of
  140. variantdef,
  141. formaldef :
  142. result:=true;
  143. recorddef :
  144. result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (def.size>pointer_size);
  145. arraydef :
  146. begin
  147. if (calloption in [pocall_cdecl,pocall_cppdecl]) then
  148. begin
  149. { array of const values are pushed on the stack }
  150. result:=not is_array_of_const(def);
  151. end
  152. else
  153. begin
  154. result:=(
  155. (tarraydef(def).highrange>=tarraydef(def).lowrange) and
  156. (def.size>pointer_size)
  157. ) or
  158. is_open_array(def) or
  159. is_array_of_const(def) or
  160. is_array_constructor(def);
  161. end;
  162. end;
  163. objectdef :
  164. result:=is_object(def);
  165. stringdef :
  166. result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (tstringdef(def).string_typ in [st_shortstring,st_longstring]);
  167. procvardef :
  168. result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (po_methodpointer in tprocvardef(def).procoptions);
  169. setdef :
  170. result:=not(calloption in [pocall_cdecl,pocall_cppdecl]) and (tsetdef(def).settype<>smallset);
  171. end;
  172. end;
  173. { true if a parameter is too large to push and needs a concatcopy to get the value on the stack }
  174. function tparamanager.copy_value_on_stack(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;
  175. begin
  176. copy_value_on_stack:=false;
  177. { this is only for cdecl procedures with vs_const,vs_value }
  178. if not(
  179. (calloption in [pocall_cdecl,pocall_cppdecl]) and
  180. (varspez in [vs_value,vs_const])
  181. ) then
  182. exit;
  183. case def.deftype of
  184. variantdef,
  185. formaldef :
  186. copy_value_on_stack:=true;
  187. recorddef :
  188. copy_value_on_stack:=(def.size>pointer_size);
  189. arraydef :
  190. copy_value_on_stack:=(tarraydef(def).highrange>=tarraydef(def).lowrange) and
  191. (def.size>pointer_size);
  192. objectdef :
  193. copy_value_on_stack:=is_object(def);
  194. stringdef :
  195. copy_value_on_stack:=tstringdef(def).string_typ in [st_shortstring,st_longstring];
  196. procvardef :
  197. copy_value_on_stack:=(po_methodpointer in tprocvardef(def).procoptions);
  198. setdef :
  199. copy_value_on_stack:=(tsetdef(def).settype<>smallset);
  200. end;
  201. end;
  202. { return the size of a push }
  203. function tparamanager.push_size(varspez:tvarspez;def : tdef;calloption : tproccalloption) : longint;
  204. begin
  205. push_size:=-1;
  206. case varspez of
  207. vs_out,
  208. vs_var :
  209. push_size:=pointer_size;
  210. vs_value,
  211. vs_const :
  212. begin
  213. if push_addr_param(varspez,def,calloption) then
  214. push_size:=pointer_size
  215. else
  216. begin
  217. { special array are normally pushed by addr, only for
  218. cdecl array of const it comes here and the pushsize
  219. is unknown }
  220. if is_array_of_const(def) then
  221. push_size:=0
  222. else
  223. push_size:=def.size;
  224. end;
  225. end;
  226. end;
  227. end;
  228. function tparamanager.get_para_align(calloption : tproccalloption):byte;
  229. begin
  230. result:=std_param_align;
  231. end;
  232. function tparamanager.get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;
  233. begin
  234. result:=[];
  235. end;
  236. function tparamanager.get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;
  237. begin
  238. result:=[];
  239. end;
  240. function tparamanager.get_volatile_registers_flags(calloption : tproccalloption):tcpuregisterset;
  241. begin
  242. result:=[];
  243. end;
  244. function tparamanager.get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;
  245. begin
  246. result:=[];
  247. end;
  248. procedure tparamanager.allocparaloc(list: taasmoutput; const loc: tparalocation);
  249. begin
  250. case loc.loc of
  251. LOC_REGISTER,
  252. LOC_CREGISTER,
  253. LOC_FPUREGISTER,
  254. LOC_CFPUREGISTER,
  255. LOC_MMREGISTER,
  256. LOC_CMMREGISTER :
  257. begin
  258. { NR_NO means we don't need to allocate the parameter.
  259. This is used for inlining parameters which allocates
  260. the parameters in gen_alloc_parast (PFV) }
  261. if loc.register<>NR_NO then
  262. cg.getexplicitregister(list,loc.register);
  263. end;
  264. LOC_REFERENCE,
  265. LOC_CREFERENCE :
  266. { do nothing by default, most of the time it's the framepointer }
  267. else
  268. internalerror(200306091);
  269. end;
  270. case loc.lochigh of
  271. LOC_INVALID :
  272. ;
  273. LOC_REGISTER,
  274. LOC_CREGISTER,
  275. LOC_FPUREGISTER,
  276. LOC_CFPUREGISTER,
  277. LOC_MMREGISTER,
  278. LOC_CMMREGISTER :
  279. begin
  280. { NR_NO means we don't need to allocate the parameter.
  281. This is used for inlining parameters which allocates
  282. the parameters in gen_alloc_parast (PFV) }
  283. if loc.registerhigh<>NR_NO then
  284. cg.getexplicitregister(list,loc.registerhigh);
  285. end;
  286. else
  287. internalerror(200306091);
  288. end;
  289. end;
  290. procedure tparamanager.freeparaloc(list: taasmoutput; const loc: tparalocation);
  291. begin
  292. case loc.loc of
  293. LOC_REGISTER,
  294. LOC_CREGISTER,
  295. LOC_FPUREGISTER,
  296. LOC_CFPUREGISTER,
  297. LOC_MMREGISTER,
  298. LOC_CMMREGISTER :
  299. cg.ungetregister(list,loc.register);
  300. LOC_REFERENCE,LOC_CREFERENCE:
  301. { do nothing by default, most of the time it's the framepointer }
  302. else
  303. internalerror(200306091);
  304. end;
  305. case loc.lochigh of
  306. LOC_INVALID :
  307. ;
  308. LOC_REGISTER,
  309. LOC_CREGISTER,
  310. LOC_FPUREGISTER,
  311. LOC_CFPUREGISTER,
  312. LOC_MMREGISTER,
  313. LOC_CMMREGISTER :
  314. cg.ungetregister(list,loc.register);
  315. else
  316. internalerror(200306091);
  317. end;
  318. end;
  319. procedure tparamanager.splitparaloc64(const locpara:tparalocation;var loclopara,lochipara:tparalocation);
  320. begin
  321. lochipara:=locpara;
  322. loclopara:=locpara;
  323. case locpara.size of
  324. OS_S128 :
  325. begin
  326. lochipara.size:=OS_S64;
  327. loclopara.size:=OS_64;
  328. end;
  329. OS_128 :
  330. begin
  331. lochipara.size:=OS_64;
  332. loclopara.size:=OS_64;
  333. end;
  334. OS_S64 :
  335. begin
  336. lochipara.size:=OS_S32;
  337. loclopara.size:=OS_32;
  338. end;
  339. OS_64 :
  340. begin
  341. lochipara.size:=OS_32;
  342. loclopara.size:=OS_32;
  343. end;
  344. else
  345. internalerror(200307023);
  346. end;
  347. loclopara.lochigh:=LOC_INVALID;
  348. lochipara.lochigh:=LOC_INVALID;
  349. case locpara.loc of
  350. LOC_REGISTER,
  351. LOC_CREGISTER,
  352. LOC_FPUREGISTER,
  353. LOC_CFPUREGISTER,
  354. LOC_MMREGISTER,
  355. LOC_CMMREGISTER :
  356. begin
  357. if locpara.lochigh=LOC_INVALID then
  358. internalerror(200402061);
  359. loclopara.register:=locpara.registerlow;
  360. lochipara.register:=locpara.registerhigh;
  361. end;
  362. LOC_REFERENCE:
  363. begin
  364. if target_info.endian=endian_big then
  365. inc(loclopara.reference.offset,tcgsize2size[loclopara.size])
  366. else
  367. inc(lochipara.reference.offset,tcgsize2size[loclopara.size]);
  368. end;
  369. else
  370. internalerror(200307024);
  371. end;
  372. end;
  373. procedure tparamanager.alloctempregs(list: taasmoutput;var locpara:tparalocation);
  374. var
  375. cgsize : tcgsize;
  376. begin
  377. if locpara.lochigh<>LOC_INVALID then
  378. cgsize:=OS_INT
  379. else
  380. cgsize:=locpara.size;
  381. case locpara.loc of
  382. LOC_REGISTER:
  383. locpara.register:=cg.getintregister(list,cgsize);
  384. LOC_FPUREGISTER:
  385. locpara.register:=cg.getfpuregister(list,cgsize);
  386. LOC_MMREGISTER:
  387. locpara.register:=cg.getmmregister(list,cgsize);
  388. else
  389. internalerror(200308123);
  390. end;
  391. case locpara.lochigh of
  392. LOC_INVALID:
  393. ;
  394. LOC_REGISTER:
  395. locpara.registerhigh:=cg.getintregister(list,cgsize);
  396. LOC_FPUREGISTER:
  397. locpara.registerhigh:=cg.getfpuregister(list,cgsize);
  398. LOC_MMREGISTER:
  399. locpara.registerhigh:=cg.getmmregister(list,cgsize);
  400. else
  401. internalerror(200308123);
  402. end;
  403. end;
  404. function tparamanager.create_inline_paraloc_info(p : tabstractprocdef):longint;
  405. var
  406. hp : tparaitem;
  407. paraloc : tparalocation;
  408. parasize : longint;
  409. begin
  410. parasize:=0;
  411. hp:=tparaitem(p.para.first);
  412. while assigned(hp) do
  413. begin
  414. if push_addr_param(hp.paratyp,hp.paratype.def,p.proccalloption) then
  415. paraloc.size:=OS_ADDR
  416. else
  417. paraloc.size:=def_cgsize(hp.paratype.def);
  418. if paraloc.size=OS_NO then
  419. internalerror(200309301);
  420. { Indicate parameter is loaded in register, the register
  421. will be allocated when the allocpara is called }
  422. paraloc.loc:=LOC_REGISTER;
  423. paraloc.register:=NR_NO;
  424. (*
  425. paraloc.loc:=LOC_REFERENCE;
  426. paraloc.reference.index:=NR_FRAME_POINTER_REG;
  427. l:=push_size(hp.paratyp,hp.paratype.def,p.proccalloption);
  428. varalign:=size_2_align(l);
  429. paraloc.reference.offset:=parasize+target_info.first_parm_offset;
  430. varalign:=used_align(varalign,p.paraalign,p.paraalign);
  431. parasize:=align(parasize+l,varalign);
  432. *)
  433. hp.paraloc[callerside]:=paraloc;
  434. hp.paraloc[calleeside]:=paraloc;
  435. hp:=tparaitem(hp.next);
  436. end;
  437. { We need to return the size allocated }
  438. result:=parasize;
  439. end;
  440. initialization
  441. ;
  442. finalization
  443. paramanager.free;
  444. end.
  445. {
  446. $Log$
  447. Revision 1.69 2004-02-09 22:14:17 peter
  448. * more x86_64 parameter fixes
  449. * tparalocation.lochigh is now used to indicate if registerhigh
  450. is used and what the type is
  451. Revision 1.68 2003/12/28 22:09:12 florian
  452. + setting of bit 6 of cr for c var args on ppc implemented
  453. Revision 1.67 2003/12/06 01:15:22 florian
  454. * reverted Peter's alloctemp patch; hopefully properly
  455. Revision 1.66 2003/12/03 23:13:20 peter
  456. * delayed paraloc allocation, a_param_*() gets extra parameter
  457. if it needs to allocate temp or real paralocation
  458. * optimized/simplified int-real loading
  459. Revision 1.65 2003/10/29 21:24:14 jonas
  460. + support for fpu temp parameters
  461. + saving/restoring of fpu register before/after a procedure call
  462. Revision 1.64 2003/10/17 14:38:32 peter
  463. * 64k registers supported
  464. * fixed some memory leaks
  465. Revision 1.63 2003/10/11 16:06:42 florian
  466. * fixed some MMX<->SSE
  467. * started to fix ppc, needs an overhaul
  468. + stabs info improve for spilling, not sure if it works correctly/completly
  469. - MMX_SUPPORT removed from Makefile.fpc
  470. Revision 1.62 2003/10/10 17:48:13 peter
  471. * old trgobj moved to x86/rgcpu and renamed to trgx86fpu
  472. * tregisteralloctor renamed to trgobj
  473. * removed rgobj from a lot of units
  474. * moved location_* and reference_* to cgobj
  475. * first things for mmx register allocation
  476. Revision 1.61 2003/10/09 21:31:37 daniel
  477. * Register allocator splitted, ans abstract now
  478. Revision 1.60 2003/10/05 21:21:52 peter
  479. * c style array of const generates callparanodes
  480. * varargs paraloc fixes
  481. Revision 1.59 2003/10/03 22:00:33 peter
  482. * parameter alignment fixes
  483. Revision 1.58 2003/10/01 20:34:49 peter
  484. * procinfo unit contains tprocinfo
  485. * cginfo renamed to cgbase
  486. * moved cgmessage to verbose
  487. * fixed ppc and sparc compiles
  488. Revision 1.57 2003/09/30 21:02:37 peter
  489. * updates for inlining
  490. Revision 1.56 2003/09/23 17:56:05 peter
  491. * locals and paras are allocated in the code generation
  492. * tvarsym.localloc contains the location of para/local when
  493. generating code for the current procedure
  494. Revision 1.55 2003/09/16 16:17:01 peter
  495. * varspez in calls to push_addr_param
  496. Revision 1.54 2003/09/10 08:31:47 marco
  497. * Patch from Peter for paraloc
  498. Revision 1.53 2003/09/07 22:09:35 peter
  499. * preparations for different default calling conventions
  500. * various RA fixes
  501. Revision 1.52 2003/09/04 15:39:58 peter
  502. * released useparatemp
  503. Revision 1.51 2003/09/03 15:55:01 peter
  504. * NEWRA branch merged
  505. Revision 1.50.2.1 2003/08/29 17:28:59 peter
  506. * next batch of updates
  507. Revision 1.50 2003/08/11 21:18:20 peter
  508. * start of sparc support for newra
  509. Revision 1.49 2003/07/08 21:24:59 peter
  510. * sparc fixes
  511. Revision 1.48 2003/07/05 20:11:41 jonas
  512. * create_paraloc_info() is now called separately for the caller and
  513. callee info
  514. * fixed ppc cycle
  515. Revision 1.47 2003/07/02 22:18:04 peter
  516. * paraloc splitted in callerparaloc,calleeparaloc
  517. * sparc calling convention updates
  518. Revision 1.46 2003/06/17 16:32:03 peter
  519. * allocpara/freepara 64bit support
  520. Revision 1.45 2003/06/13 21:19:30 peter
  521. * current_procdef removed, use current_procinfo.procdef instead
  522. Revision 1.44 2003/06/12 21:11:10 peter
  523. * ungetregisterfpu gets size parameter
  524. Revision 1.43 2003/06/09 14:54:26 jonas
  525. * (de)allocation of registers for parameters is now performed properly
  526. (and checked on the ppc)
  527. - removed obsolete allocation of all parameter registers at the start
  528. of a procedure (and deallocation at the end)
  529. Revision 1.42 2003/06/08 10:54:41 jonas
  530. - disabled changing of LOC_*REGISTER to LOC_C*REGISTER in setparalocs,
  531. this is not necessary anymore (doesn't do anything anymore actually,
  532. except making sure the interface crc changes)
  533. Revision 1.41 2003/06/07 18:57:04 jonas
  534. + added freeintparaloc
  535. * ppc get/freeintparaloc now check whether the parameter regs are
  536. properly allocated/deallocated (and get an extra list para)
  537. * ppc a_call_* now internalerrors if pi_do_call is not yet set
  538. * fixed lot of missing pi_do_call's
  539. Revision 1.40 2003/05/31 15:05:28 peter
  540. * FUNCTION_RESULT64_LOW/HIGH_REG added for int64 results
  541. Revision 1.39 2003/05/30 23:57:08 peter
  542. * more sparc cleanup
  543. * accumulator removed, splitted in function_return_reg (called) and
  544. function_result_reg (caller)
  545. Revision 1.38 2003/05/13 15:16:13 peter
  546. * removed ret_in_acc, it's the reverse of ret_in_param
  547. * fixed ret_in_param for win32 cdecl array
  548. Revision 1.37 2003/04/30 22:15:59 florian
  549. * some 64 bit adaptions in ncgadd
  550. * x86-64 now uses ncgadd
  551. * tparamanager.ret_in_acc doesn't return true anymore for a void-def
  552. Revision 1.36 2003/04/27 11:21:33 peter
  553. * aktprocdef renamed to current_procinfo.procdef
  554. * procinfo renamed to current_procinfo
  555. * procinfo will now be stored in current_module so it can be
  556. cleaned up properly
  557. * gen_main_procsym changed to create_main_proc and release_main_proc
  558. to also generate a tprocinfo structure
  559. * fixed unit implicit initfinal
  560. Revision 1.35 2003/04/27 07:29:50 peter
  561. * current_procinfo.procdef cleanup, current_procdef is now always nil when parsing
  562. a new procdef declaration
  563. * aktprocsym removed
  564. * lexlevel removed, use symtable.symtablelevel instead
  565. * implicit init/final code uses the normal genentry/genexit
  566. * funcret state checking updated for new funcret handling
  567. Revision 1.34 2003/04/23 13:15:04 peter
  568. * fix push_high_param for cdecl
  569. Revision 1.33 2003/04/23 10:14:30 peter
  570. * cdecl array of const has no addr push
  571. Revision 1.32 2003/04/22 13:47:08 peter
  572. * fixed C style array of const
  573. * fixed C array passing
  574. * fixed left to right with high parameters
  575. Revision 1.31 2003/02/02 19:25:54 carl
  576. * Several bugfixes for m68k target (register alloc., opcode emission)
  577. + VIS target
  578. + Generic add more complete (still not verified)
  579. Revision 1.30 2003/01/08 18:43:56 daniel
  580. * Tregister changed into a record
  581. Revision 1.29 2002/12/23 20:58:03 peter
  582. * remove unused global var
  583. Revision 1.28 2002/12/17 22:19:33 peter
  584. * fixed pushing of records>8 bytes with stdcall
  585. * simplified hightree loading
  586. Revision 1.27 2002/12/06 16:56:58 peter
  587. * only compile cs_fp_emulation support when cpufpuemu is defined
  588. * define cpufpuemu for m68k only
  589. Revision 1.26 2002/11/27 20:04:09 peter
  590. * tvarsym.get_push_size replaced by paramanager.push_size
  591. Revision 1.25 2002/11/27 02:33:19 peter
  592. * copy_value_on_stack method added for cdecl record passing
  593. Revision 1.24 2002/11/25 17:43:21 peter
  594. * splitted defbase in defutil,symutil,defcmp
  595. * merged isconvertable and is_equal into compare_defs(_ext)
  596. * made operator search faster by walking the list only once
  597. Revision 1.23 2002/11/18 17:31:58 peter
  598. * pass proccalloption to ret_in_xxx and push_xxx functions
  599. Revision 1.22 2002/11/16 18:00:04 peter
  600. * only push small arrays on the stack for win32
  601. Revision 1.21 2002/10/05 12:43:25 carl
  602. * fixes for Delphi 6 compilation
  603. (warning : Some features do not work under Delphi)
  604. Revision 1.20 2002/09/30 07:07:25 florian
  605. * fixes to common code to get the alpha compiler compiled applied
  606. Revision 1.19 2002/09/30 07:00:47 florian
  607. * fixes to common code to get the alpha compiler compiled applied
  608. Revision 1.18 2002/09/09 09:10:51 florian
  609. + added generic tparamanager.getframepointerloc
  610. Revision 1.17 2002/09/07 19:40:39 florian
  611. * tvarsym.paraitem is set now
  612. Revision 1.16 2002/09/01 21:04:48 florian
  613. * several powerpc related stuff fixed
  614. Revision 1.15 2002/08/25 19:25:19 peter
  615. * sym.insert_in_data removed
  616. * symtable.insertvardata/insertconstdata added
  617. * removed insert_in_data call from symtable.insert, it needs to be
  618. called separatly. This allows to deref the address calculation
  619. * procedures now calculate the parast addresses after the procedure
  620. directives are parsed. This fixes the cdecl parast problem
  621. * push_addr_param has an extra argument that specifies if cdecl is used
  622. or not
  623. Revision 1.14 2002/08/17 22:09:47 florian
  624. * result type handling in tcgcal.pass_2 overhauled
  625. * better tnode.dowrite
  626. * some ppc stuff fixed
  627. Revision 1.13 2002/08/17 09:23:38 florian
  628. * first part of procinfo rewrite
  629. Revision 1.12 2002/08/16 14:24:58 carl
  630. * issameref() to test if two references are the same (then emit no opcodes)
  631. + ret_in_reg to replace ret_in_acc
  632. (fix some register allocation bugs at the same time)
  633. + save_std_register now has an extra parameter which is the
  634. usedinproc registers
  635. Revision 1.11 2002/08/12 15:08:40 carl
  636. + stab register indexes for powerpc (moved from gdb to cpubase)
  637. + tprocessor enumeration moved to cpuinfo
  638. + linker in target_info is now a class
  639. * many many updates for m68k (will soon start to compile)
  640. - removed some ifdef or correct them for correct cpu
  641. Revision 1.10 2002/08/10 17:15:20 jonas
  642. * register parameters are now LOC_CREGISTER instead of LOC_REGISTER
  643. Revision 1.9 2002/08/09 07:33:02 florian
  644. * a couple of interface related fixes
  645. Revision 1.8 2002/08/06 20:55:21 florian
  646. * first part of ppc calling conventions fix
  647. Revision 1.7 2002/08/05 18:27:48 carl
  648. + more more more documentation
  649. + first version include/exclude (can't test though, not enough scratch for i386 :()...
  650. Revision 1.6 2002/07/30 20:50:43 florian
  651. * the code generator knows now if parameters are in registers
  652. Revision 1.5 2002/07/26 21:15:39 florian
  653. * rewrote the system handling
  654. Revision 1.4 2002/07/20 11:57:55 florian
  655. * types.pas renamed to defbase.pas because D6 contains a types
  656. unit so this would conflicts if D6 programms are compiled
  657. + Willamette/SSE2 instructions to assembler added
  658. Revision 1.3 2002/07/13 19:38:43 florian
  659. * some more generic calling stuff fixed
  660. Revision 1.2 2002/07/13 07:17:15 jonas
  661. * fixed memory leak reported by Sergey Korshunoff
  662. Revision 1.1 2002/07/11 14:41:28 florian
  663. * start of the new generic parameter handling
  664. }