cgbase.pas 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  4. This unit exports some help routines for the code generation
  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. {# Some helpers for the code generator.
  19. }
  20. unit cgbase;
  21. {$i fpcdefs.inc}
  22. interface
  23. uses
  24. { common }
  25. cclasses,
  26. { global }
  27. globtype,globals,verbose,
  28. { symtable }
  29. symconst,symtype,symdef,symsym,
  30. { aasm }
  31. cpubase,cpuinfo,cginfo,aasmbase,aasmtai
  32. ;
  33. type
  34. tprocinfoflag=(
  35. {# procedure uses asm }
  36. pi_uses_asm,
  37. {# procedure does a call }
  38. pi_do_call,
  39. {# procedure has a try statement = no register optimization }
  40. pi_uses_exceptions,
  41. {# procedure is declared as @var(assembler), don't optimize}
  42. pi_is_assembler,
  43. {# procedure contains data which needs to be finalized }
  44. pi_needs_implicit_finally
  45. );
  46. tprocinfoflags=set of tprocinfoflag;
  47. type
  48. {# This object gives information on the current routine being
  49. compiled.
  50. }
  51. tprocinfo = class(tlinkedlistitem)
  52. { pointer to parent in nested procedures }
  53. parent : tprocinfo;
  54. {# the definition of the routine itself }
  55. procdef : tprocdef;
  56. { file location of begin of procedure }
  57. entrypos : tfileposinfo;
  58. { file location of end of procedure }
  59. exitpos : tfileposinfo;
  60. { local switches at begin of procedure }
  61. entryswitches : tlocalswitches;
  62. { local switches at end of procedure }
  63. exitswitches : tlocalswitches;
  64. {# offset from frame pointer to get parent frame pointer reference
  65. (used in nested routines only)
  66. On the PowerPC, this is used to store the offset where the
  67. frame pointer from the outer procedure is stored.
  68. }
  69. parent_framepointer_offset : longint;
  70. {# firsttemp position }
  71. firsttemp_offset : longint;
  72. {# some collected informations about the procedure
  73. see pi_xxxx constants above
  74. }
  75. flags : tprocinfoflags;
  76. {# register used as frame pointer }
  77. framepointer : tregister;
  78. {# Holds the reference used to store the original stackpointer
  79. after all registers are saved
  80. }
  81. save_stackptr_ref :treference;
  82. {# Holds the reference used to store alll saved registers.
  83. This is used on systems which do not have direct stack
  84. operations (such as the PowerPC), it is unused on other
  85. systems
  86. }
  87. save_regs_ref : treference;
  88. { label to leave the sub routine }
  89. aktexitlabel : tasmlabel;
  90. {# The code for the routine itself, excluding entry and
  91. exit code. This is a linked list of tai classes.
  92. }
  93. aktproccode : taasmoutput;
  94. { Data (like jump tables) that belongs to this routine }
  95. aktlocaldata : taasmoutput;
  96. constructor create(aparent:tprocinfo);virtual;
  97. destructor destroy;override;
  98. procedure allocate_parent_framepointer_parameter;virtual;
  99. procedure allocate_interrupt_parameter;virtual;
  100. { Allocate framepointer so it can not be used by the
  101. register allocator }
  102. procedure allocate_framepointer_reg;virtual;
  103. procedure allocate_push_parasize(size:longint);virtual;
  104. function calc_stackframe_size:longint;virtual;
  105. { Does the necessary stuff before a procedure body is compiled }
  106. procedure handle_body_start;virtual;
  107. { This procedure is called after the pass 1 of the subroutine body is done.
  108. Here the address fix ups to generate code for the body must be done.
  109. }
  110. procedure after_pass1;virtual;
  111. end;
  112. pregvarinfo = ^tregvarinfo;
  113. tregvarinfo = record
  114. regvars : array[1..maxvarregs] of tvarsym;
  115. regvars_para : array[1..maxvarregs] of boolean;
  116. regvars_refs : array[1..maxvarregs] of longint;
  117. fpuregvars : array[1..maxfpuvarregs] of tvarsym;
  118. fpuregvars_para : array[1..maxfpuvarregs] of boolean;
  119. fpuregvars_refs : array[1..maxfpuvarregs] of longint;
  120. end;
  121. tcprocinfo = class of tprocinfo;
  122. var
  123. cprocinfo : tcprocinfo;
  124. {# information about the current sub routine being parsed (@var(pprocinfo))}
  125. current_procinfo : tprocinfo;
  126. { labels for BREAK and CONTINUE }
  127. aktbreaklabel,aktcontinuelabel : tasmlabel;
  128. { label when the result is true or false }
  129. truelabel,falselabel : tasmlabel;
  130. {# true, if there was an error while code generation occurs }
  131. codegenerror : boolean;
  132. { save the size of pushed parameter, needed for aligning }
  133. pushedparasize : longint;
  134. { message calls with codegenerror support }
  135. procedure cgmessage(t : longint);
  136. procedure cgmessage1(t : longint;const s : string);
  137. procedure cgmessage2(t : longint;const s1,s2 : string);
  138. procedure cgmessage3(t : longint;const s1,s2,s3 : string);
  139. procedure CGMessagePos(const pos:tfileposinfo;t:longint);
  140. procedure CGMessagePos1(const pos:tfileposinfo;t:longint;const s1:string);
  141. procedure CGMessagePos2(const pos:tfileposinfo;t:longint;const s1,s2:string);
  142. procedure CGMessagePos3(const pos:tfileposinfo;t:longint;const s1,s2,s3:string);
  143. { initialize respectively terminates the code generator }
  144. { for a new module or procedure }
  145. procedure codegen_newmodule;
  146. procedure codegen_donemodule;
  147. {# From a definition return the abstract code generator size enum. It is
  148. to note that the value returned can be @var(OS_NO) }
  149. function def_cgsize(def: tdef): tcgsize;
  150. {# From a constant numeric value, return the abstract code generator
  151. size.
  152. }
  153. function int_cgsize(const a: aword): tcgsize;
  154. {# return the inverse condition of opcmp }
  155. function inverse_opcmp(opcmp: topcmp): topcmp;
  156. {# return whether op is commutative }
  157. function commutativeop(op: topcg): boolean;
  158. implementation
  159. uses
  160. cutils,systems,
  161. cresstr,
  162. tgobj,rgobj,
  163. defutil,
  164. fmodule
  165. ,symbase,paramgr
  166. ;
  167. {*****************************************************************************
  168. override the message calls to set codegenerror
  169. *****************************************************************************}
  170. procedure cgmessage(t : longint);
  171. var
  172. olderrorcount : longint;
  173. begin
  174. if not(codegenerror) then
  175. begin
  176. olderrorcount:=Errorcount;
  177. verbose.Message(t);
  178. codegenerror:=olderrorcount<>Errorcount;
  179. end;
  180. end;
  181. procedure cgmessage1(t : longint;const s : string);
  182. var
  183. olderrorcount : longint;
  184. begin
  185. if not(codegenerror) then
  186. begin
  187. olderrorcount:=Errorcount;
  188. verbose.Message1(t,s);
  189. codegenerror:=olderrorcount<>Errorcount;
  190. end;
  191. end;
  192. procedure cgmessage2(t : longint;const s1,s2 : string);
  193. var
  194. olderrorcount : longint;
  195. begin
  196. if not(codegenerror) then
  197. begin
  198. olderrorcount:=Errorcount;
  199. verbose.Message2(t,s1,s2);
  200. codegenerror:=olderrorcount<>Errorcount;
  201. end;
  202. end;
  203. procedure cgmessage3(t : longint;const s1,s2,s3 : string);
  204. var
  205. olderrorcount : longint;
  206. begin
  207. if not(codegenerror) then
  208. begin
  209. olderrorcount:=Errorcount;
  210. verbose.Message3(t,s1,s2,s3);
  211. codegenerror:=olderrorcount<>Errorcount;
  212. end;
  213. end;
  214. procedure cgmessagepos(const pos:tfileposinfo;t : longint);
  215. var
  216. olderrorcount : longint;
  217. begin
  218. if not(codegenerror) then
  219. begin
  220. olderrorcount:=Errorcount;
  221. verbose.MessagePos(pos,t);
  222. codegenerror:=olderrorcount<>Errorcount;
  223. end;
  224. end;
  225. procedure cgmessagepos1(const pos:tfileposinfo;t : longint;const s1 : string);
  226. var
  227. olderrorcount : longint;
  228. begin
  229. if not(codegenerror) then
  230. begin
  231. olderrorcount:=Errorcount;
  232. verbose.MessagePos1(pos,t,s1);
  233. codegenerror:=olderrorcount<>Errorcount;
  234. end;
  235. end;
  236. procedure cgmessagepos2(const pos:tfileposinfo;t : longint;const s1,s2 : string);
  237. var
  238. olderrorcount : longint;
  239. begin
  240. if not(codegenerror) then
  241. begin
  242. olderrorcount:=Errorcount;
  243. verbose.MessagePos2(pos,t,s1,s2);
  244. codegenerror:=olderrorcount<>Errorcount;
  245. end;
  246. end;
  247. procedure cgmessagepos3(const pos:tfileposinfo;t : longint;const s1,s2,s3 : string);
  248. var
  249. olderrorcount : longint;
  250. begin
  251. if not(codegenerror) then
  252. begin
  253. olderrorcount:=Errorcount;
  254. verbose.MessagePos3(pos,t,s1,s2,s3);
  255. codegenerror:=olderrorcount<>Errorcount;
  256. end;
  257. end;
  258. {****************************************************************************
  259. TProcInfo
  260. ****************************************************************************}
  261. constructor tprocinfo.create(aparent:tprocinfo);
  262. begin
  263. parent:=aparent;
  264. procdef:=nil;
  265. parent_framepointer_offset:=0;
  266. firsttemp_offset:=0;
  267. flags:=[];
  268. framepointer.enum:=R_INTREGISTER;
  269. framepointer.number:=NR_FRAME_POINTER_REG;
  270. { asmlists }
  271. aktproccode:=Taasmoutput.Create;
  272. aktlocaldata:=Taasmoutput.Create;
  273. reference_reset(save_stackptr_ref);
  274. { labels }
  275. objectlibrary.getlabel(aktexitlabel);
  276. end;
  277. destructor tprocinfo.destroy;
  278. begin
  279. aktproccode.free;
  280. aktlocaldata.free;
  281. end;
  282. procedure tprocinfo.allocate_parent_framepointer_parameter;
  283. begin
  284. parent_framepointer_offset:=procdef.parast.address_fixup;
  285. inc(procdef.parast.address_fixup,POINTER_SIZE);
  286. end;
  287. procedure tprocinfo.allocate_interrupt_parameter;
  288. begin
  289. end;
  290. procedure tprocinfo.allocate_framepointer_reg;
  291. begin
  292. end;
  293. procedure tprocinfo.allocate_push_parasize(size:longint);
  294. begin
  295. end;
  296. function tprocinfo.calc_stackframe_size:longint;
  297. var
  298. _align : longint;
  299. begin
  300. { align to 4 bytes at least
  301. otherwise all those subl $2,%esp are meaningless PM }
  302. _align:=target_info.alignment.localalignmin;
  303. if _align<4 then
  304. _align:=4;
  305. result:=Align(tg.direction*tg.lasttemp,_align);
  306. end;
  307. procedure tprocinfo.handle_body_start;
  308. var
  309. paramloc : tparalocation;
  310. begin
  311. { generate callee paraloc register info }
  312. paramanager.create_paraloc_info(current_procinfo.procdef,calleeside);
  313. { temporary space is set, while the BEGIN of the procedure }
  314. if (symtablestack.symtabletype=localsymtable) then
  315. current_procinfo.firsttemp_offset := tg.direction*symtablestack.datasize
  316. else
  317. current_procinfo.firsttemp_offset := 0;
  318. { include return value registers }
  319. if not is_void(procdef.rettype.def) then
  320. begin
  321. paramloc:=procdef.funcret_paraloc[calleeside];
  322. case paramloc.loc of
  323. LOC_FPUREGISTER,
  324. LOC_CFPUREGISTER,
  325. LOC_MMREGISTER,
  326. LOC_CMMREGISTER :
  327. begin
  328. include(rg.used_in_proc_other,paramloc.register.enum);
  329. end;
  330. LOC_REGISTER,LOC_CREGISTER :
  331. begin
  332. if ((paramloc.size in [OS_S64,OS_64]) and
  333. (sizeof(aword) < 8)) then
  334. begin
  335. include(rg.used_in_proc_int,paramloc.registerhigh.number shr 8);
  336. include(rg.used_in_proc_int,paramloc.registerlow.number shr 8);
  337. end
  338. else
  339. include(rg.used_in_proc_int,paramloc.register.number shr 8);
  340. end;
  341. end;
  342. end;
  343. end;
  344. procedure tprocinfo.after_pass1;
  345. begin
  346. end;
  347. {*****************************************************************************
  348. initialize/terminate the codegen for procedure and modules
  349. *****************************************************************************}
  350. procedure codegen_newmodule;
  351. begin
  352. exprasmlist:=taasmoutput.create;
  353. datasegment:=taasmoutput.create;
  354. codesegment:=taasmoutput.create;
  355. bsssegment:=taasmoutput.create;
  356. debuglist:=taasmoutput.create;
  357. withdebuglist:=taasmoutput.create;
  358. consts:=taasmoutput.create;
  359. rttilist:=taasmoutput.create;
  360. ResourceStringList:=Nil;
  361. importssection:=nil;
  362. exportssection:=nil;
  363. resourcesection:=nil;
  364. { resourcestrings }
  365. ResourceStrings:=TResourceStrings.Create;
  366. { use the librarydata from current_module }
  367. objectlibrary:=current_module.librarydata;
  368. end;
  369. procedure codegen_donemodule;
  370. {$ifdef MEMDEBUG}
  371. var
  372. d : tmemdebug;
  373. {$endif}
  374. begin
  375. {$ifdef MEMDEBUG}
  376. d:=tmemdebug.create(current_module.modulename^+' - asmlists');
  377. {$endif}
  378. exprasmlist.free;
  379. codesegment.free;
  380. bsssegment.free;
  381. datasegment.free;
  382. debuglist.free;
  383. withdebuglist.free;
  384. consts.free;
  385. rttilist.free;
  386. if assigned(ResourceStringList) then
  387. ResourceStringList.free;
  388. if assigned(importssection) then
  389. importssection.free;
  390. if assigned(exportssection) then
  391. exportssection.free;
  392. if assigned(resourcesection) then
  393. resourcesection.free;
  394. {$ifdef MEMDEBUG}
  395. d.free;
  396. {$endif}
  397. { resource strings }
  398. ResourceStrings.free;
  399. objectlibrary:=nil;
  400. end;
  401. function def_cgsize(def: tdef): tcgsize;
  402. begin
  403. case def.deftype of
  404. orddef,
  405. enumdef,
  406. setdef:
  407. begin
  408. result := int_cgsize(def.size);
  409. if is_signed(def) then
  410. result := tcgsize(ord(result)+(ord(OS_S8)-ord(OS_8)));
  411. end;
  412. classrefdef,
  413. pointerdef:
  414. result := OS_ADDR;
  415. procvardef:
  416. begin
  417. if tprocvardef(def).is_methodpointer and
  418. (not tprocvardef(def).is_addressonly) then
  419. result := OS_64
  420. else
  421. result := OS_ADDR;
  422. end;
  423. stringdef :
  424. begin
  425. if is_ansistring(def) or is_widestring(def) then
  426. result := OS_ADDR
  427. else
  428. result := OS_NO;
  429. end;
  430. objectdef :
  431. begin
  432. if is_class_or_interface(def) then
  433. result := OS_ADDR
  434. else
  435. result := OS_NO;
  436. end;
  437. floatdef:
  438. result := tfloat2tcgsize[tfloatdef(def).typ];
  439. recorddef :
  440. result:=int_cgsize(def.size);
  441. arraydef :
  442. begin
  443. if not is_special_array(def) then
  444. result := int_cgsize(def.size)
  445. else
  446. begin
  447. if is_dynamic_array(def) then
  448. result := OS_ADDR
  449. else
  450. result := OS_NO;
  451. end;
  452. end;
  453. else
  454. begin
  455. { undefined size }
  456. result:=OS_NO;
  457. end;
  458. end;
  459. end;
  460. function int_cgsize(const a: aword): tcgsize;
  461. begin
  462. if a > 8 then
  463. begin
  464. int_cgsize := OS_NO;
  465. exit;
  466. end;
  467. case byte(a) of
  468. 1 :
  469. result := OS_8;
  470. 2 :
  471. result := OS_16;
  472. 3,4 :
  473. result := OS_32;
  474. 5..8 :
  475. result := OS_64;
  476. end;
  477. end;
  478. function inverse_opcmp(opcmp: topcmp): topcmp;
  479. const
  480. list: array[TOpCmp] of TOpCmp =
  481. (OC_NONE,OC_NE,OC_LTE,OC_GTE,OC_LT,OC_GT,OC_EQ,OC_A,OC_AE,
  482. OC_B,OC_BE);
  483. begin
  484. inverse_opcmp := list[opcmp];
  485. end;
  486. function commutativeop(op: topcg): boolean;
  487. const
  488. list: array[topcg] of boolean =
  489. (true,true,true,false,false,true,true,false,false,
  490. true,false,false,false,false,true);
  491. begin
  492. commutativeop := list[op];
  493. end;
  494. end.
  495. {
  496. $Log$
  497. Revision 1.60 2003-08-26 12:43:02 peter
  498. * methodpointer fixes
  499. Revision 1.59 2003/08/20 17:48:49 peter
  500. * fixed stackalloc to not allocate localst.datasize twice
  501. * order of stackalloc code fixed for implicit init/final
  502. Revision 1.58 2003/08/11 21:18:20 peter
  503. * start of sparc support for newra
  504. Revision 1.57 2003/07/06 17:58:22 peter
  505. * framepointer fixes for sparc
  506. * parent framepointer code more generic
  507. Revision 1.56 2003/06/13 21:19:30 peter
  508. * current_procdef removed, use current_procinfo.procdef instead
  509. Revision 1.55 2003/06/12 16:43:07 peter
  510. * newra compiles for sparc
  511. Revision 1.54 2003/06/09 12:23:29 peter
  512. * init/final of procedure data splitted from genentrycode
  513. * use asmnode getposition to insert final at the correct position
  514. als for the implicit try...finally
  515. Revision 1.53 2003/06/02 21:42:05 jonas
  516. * function results can now also be regvars
  517. - removed tprocinfo.return_offset, never use it again since it's invalid
  518. if the result is a regvar
  519. Revision 1.52 2003/05/26 21:17:17 peter
  520. * procinlinenode removed
  521. * aktexit2label removed, fast exit removed
  522. + tcallnode.inlined_pass_2 added
  523. Revision 1.51 2003/05/23 14:27:35 peter
  524. * remove some unit dependencies
  525. * current_procinfo changes to store more info
  526. Revision 1.50 2003/05/16 20:54:12 jonas
  527. - undid previous commit, it wasn't necessary
  528. Revision 1.49 2003/05/16 20:00:39 jonas
  529. * powerpc nested procedure fixes, should work completely now if all
  530. local variables of the parent procedure are declared before the
  531. nested procedures are declared
  532. Revision 1.48 2003/05/15 18:58:53 peter
  533. * removed selfpointer_offset, vmtpointer_offset
  534. * tvarsym.adjusted_address
  535. * address in localsymtable is now in the real direction
  536. * removed some obsolete globals
  537. Revision 1.47 2003/05/13 19:14:41 peter
  538. * failn removed
  539. * inherited result code check moven to pexpr
  540. Revision 1.46 2003/05/09 17:47:02 peter
  541. * self moved to hidden parameter
  542. * removed hdisposen,hnewn,selfn
  543. Revision 1.45 2003/04/27 11:21:32 peter
  544. * aktprocdef renamed to current_procinfo.procdef
  545. * procinfo renamed to current_procinfo
  546. * procinfo will now be stored in current_module so it can be
  547. cleaned up properly
  548. * gen_main_procsym changed to create_main_proc and release_main_proc
  549. to also generate a tprocinfo structure
  550. * fixed unit implicit initfinal
  551. Revision 1.44 2003/04/27 07:29:50 peter
  552. * current_procinfo.procdef cleanup, current_procdef is now always nil when parsing
  553. a new procdef declaration
  554. * aktprocsym removed
  555. * lexlevel removed, use symtable.symtablelevel instead
  556. * implicit init/final code uses the normal genentry/genexit
  557. * funcret state checking updated for new funcret handling
  558. Revision 1.43 2003/04/26 00:31:42 peter
  559. * set return_offset moved to after_header
  560. Revision 1.42 2003/04/25 20:59:33 peter
  561. * removed funcretn,funcretsym, function result is now in varsym
  562. and aliases for result and function name are added using absolutesym
  563. * vs_hidden parameter for funcret passed in parameter
  564. * vs_hidden fixes
  565. * writenode changed to printnode and released from extdebug
  566. * -vp option added to generate a tree.log with the nodetree
  567. * nicer printnode for statements, callnode
  568. Revision 1.41 2003/04/23 12:35:34 florian
  569. * fixed several issues with powerpc
  570. + applied a patch from Jonas for nested function calls (PowerPC only)
  571. * ...
  572. Revision 1.40 2003/04/22 13:47:08 peter
  573. * fixed C style array of const
  574. * fixed C array passing
  575. * fixed left to right with high parameters
  576. Revision 1.39 2003/04/05 21:09:31 jonas
  577. * several ppc/generic result offset related fixes. The "normal" result
  578. offset seems now to be calculated correctly and a lot of duplicate
  579. calculations have been removed. Nested functions accessing the parent's
  580. function result don't work at all though :(
  581. Revision 1.38 2003/03/28 19:16:56 peter
  582. * generic constructor working for i386
  583. * remove fixed self register
  584. * esi added as address register for i386
  585. Revision 1.37 2003/03/20 17:51:45 peter
  586. * dynamic arrays have size OS_ADDR
  587. Revision 1.36 2003/01/08 18:43:56 daniel
  588. * Tregister changed into a record
  589. Revision 1.35 2003/01/01 21:04:48 peter
  590. * removed unused method
  591. Revision 1.34 2002/11/25 17:43:16 peter
  592. * splitted defbase in defutil,symutil,defcmp
  593. * merged isconvertable and is_equal into compare_defs(_ext)
  594. * made operator search faster by walking the list only once
  595. Revision 1.33 2002/11/18 17:31:54 peter
  596. * pass proccalloption to ret_in_xxx and push_xxx functions
  597. Revision 1.32 2002/10/05 12:43:23 carl
  598. * fixes for Delphi 6 compilation
  599. (warning : Some features do not work under Delphi)
  600. Revision 1.31 2002/10/03 21:20:19 carl
  601. * range check error fix
  602. Revision 1.30 2002/09/30 07:00:44 florian
  603. * fixes to common code to get the alpha compiler compiled applied
  604. Revision 1.29 2002/09/07 19:35:45 florian
  605. + tcg.direction is used now
  606. Revision 1.28 2002/09/07 15:25:01 peter
  607. * old logs removed and tabs fixed
  608. Revision 1.27 2002/09/05 19:29:42 peter
  609. * memdebug enhancements
  610. Revision 1.26 2002/08/18 20:06:23 peter
  611. * inlining is now also allowed in interface
  612. * renamed write/load to ppuwrite/ppuload
  613. * tnode storing in ppu
  614. * nld,ncon,nbas are already updated for storing in ppu
  615. Revision 1.25 2002/08/17 09:23:33 florian
  616. * first part of procinfo rewrite
  617. Revision 1.24 2002/08/11 14:32:26 peter
  618. * renamed current_library to objectlibrary
  619. Revision 1.23 2002/08/11 13:24:11 peter
  620. * saving of asmsymbols in ppu supported
  621. * asmsymbollist global is removed and moved into a new class
  622. tasmlibrarydata that will hold the info of a .a file which
  623. corresponds with a single module. Added librarydata to tmodule
  624. to keep the library info stored for the module. In the future the
  625. objectfiles will also be stored to the tasmlibrarydata class
  626. * all getlabel/newasmsymbol and friends are moved to the new class
  627. Revision 1.22 2002/08/06 20:55:20 florian
  628. * first part of ppc calling conventions fix
  629. Revision 1.21 2002/08/05 18:27:48 carl
  630. + more more more documentation
  631. + first version include/exclude (can't test though, not enough scratch for i386 :()...
  632. Revision 1.20 2002/08/04 19:06:41 carl
  633. + added generic exception support (still does not work!)
  634. + more documentation
  635. Revision 1.19 2002/07/20 11:57:53 florian
  636. * types.pas renamed to defbase.pas because D6 contains a types
  637. unit so this would conflicts if D6 programms are compiled
  638. + Willamette/SSE2 instructions to assembler added
  639. Revision 1.18 2002/07/01 18:46:22 peter
  640. * internal linker
  641. * reorganized aasm layer
  642. Revision 1.17 2002/05/20 13:30:40 carl
  643. * bugfix of hdisponen (base must be set, not index)
  644. * more portability fixes
  645. Revision 1.16 2002/05/18 13:34:05 peter
  646. * readded missing revisions
  647. Revision 1.15 2002/05/16 19:46:35 carl
  648. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  649. + try to fix temp allocation (still in ifdef)
  650. + generic constructor calls
  651. + start of tassembler / tmodulebase class cleanup
  652. Revision 1.13 2002/04/25 20:16:38 peter
  653. * moved more routines from cga/n386util
  654. Revision 1.12 2002/04/21 15:28:06 carl
  655. - remove duplicate constants
  656. - move some constants to cginfo
  657. Revision 1.11 2002/04/20 21:32:23 carl
  658. + generic FPC_CHECKPOINTER
  659. + first parameter offset in stack now portable
  660. * rename some constants
  661. + move some cpu stuff to other units
  662. - remove unused constents
  663. * fix stacksize for some targets
  664. * fix generic size problems which depend now on EXTEND_SIZE constant
  665. Revision 1.10 2002/04/07 09:13:39 carl
  666. + documentation
  667. - remove unused variables
  668. Revision 1.9 2002/04/04 19:05:54 peter
  669. * removed unused units
  670. * use tlocation.size in cg.a_*loc*() routines
  671. Revision 1.8 2002/04/02 17:11:27 peter
  672. * tlocation,treference update
  673. * LOC_CONSTANT added for better constant handling
  674. * secondadd splitted in multiple routines
  675. * location_force_reg added for loading a location to a register
  676. of a specified size
  677. * secondassignment parses now first the right and then the left node
  678. (this is compatible with Kylix). This saves a lot of push/pop especially
  679. with string operations
  680. * adapted some routines to use the new cg methods
  681. Revision 1.7 2002/03/31 20:26:33 jonas
  682. + a_loadfpu_* and a_loadmm_* methods in tcg
  683. * register allocation is now handled by a class and is mostly processor
  684. independent (+rgobj.pas and i386/rgcpu.pas)
  685. * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
  686. * some small improvements and fixes to the optimizer
  687. * some register allocation fixes
  688. * some fpuvaroffset fixes in the unary minus node
  689. * push/popusedregisters is now called rg.save/restoreusedregisters and
  690. (for i386) uses temps instead of push/pop's when using -Op3 (that code is
  691. also better optimizable)
  692. * fixed and optimized register saving/restoring for new/dispose nodes
  693. * LOC_FPU locations now also require their "register" field to be set to
  694. R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
  695. - list field removed of the tnode class because it's not used currently
  696. and can cause hard-to-find bugs
  697. }