cgbase.pas 25 KB

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