cgbase.pas 26 KB

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