paramgr.pas 24 KB

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