tgobj.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  4. This unit implements the base object for temp. generator
  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. {#@abstract(Temporary reference allocator unit)
  19. Temporary reference allocator unit. This unit contains
  20. all which is related to allocating temporary memory
  21. space on the stack, as required, by the code generator.
  22. }
  23. unit tgobj;
  24. {$i fpcdefs.inc}
  25. interface
  26. uses
  27. globals,
  28. cpubase,
  29. cpuinfo,
  30. cclasses,globtype,cgbase,aasmbase,aasmtai,aasmcpu;
  31. type
  32. ttemptype = (tt_none,
  33. tt_free,tt_normal,tt_persistant,
  34. tt_noreuse,tt_freenoreuse,
  35. tt_ansistring,tt_freeansistring,
  36. tt_widestring,tt_freewidestring,
  37. tt_interfacecom,tt_freeinterfacecom);
  38. ttemptypeset = set of ttemptype;
  39. ptemprecord = ^ttemprecord;
  40. ttemprecord = record
  41. temptype : ttemptype;
  42. pos : longint;
  43. size : longint;
  44. next : ptemprecord;
  45. nextfree : ptemprecord; { for faster freeblock checking }
  46. {$ifdef EXTDEBUG}
  47. posinfo,
  48. releaseposinfo : tfileposinfo;
  49. {$endif}
  50. end;
  51. {# Generates temporary variables }
  52. ttgobj = class
  53. private
  54. { contains all free temps using nextfree links }
  55. tempfreelist : ptemprecord;
  56. function AllocTemp(list: taasmoutput; size : longint; temptype : ttemptype) : longint;
  57. procedure FreeTemp(list: taasmoutput; pos:longint;temptypes:ttemptypeset);
  58. public
  59. { contains all temps }
  60. templist : ptemprecord;
  61. { Offsets of the first/last temp }
  62. firsttemp,
  63. lasttemp : longint;
  64. direction : shortint;
  65. constructor create;
  66. {# Clear and free the complete linked list of temporary memory
  67. locations. The list is set to nil.}
  68. procedure resettempgen;
  69. {# Sets the first offset from the frame pointer or stack pointer where
  70. the temporary references will be allocated. It is to note that this
  71. value should always be negative.
  72. @param(l start offset where temps will start in stack)
  73. }
  74. procedure setfirsttemp(l : longint);
  75. function gettempsize : longint;
  76. procedure GetTemp(list: taasmoutput; size : longint;temptype:ttemptype;var ref : treference);
  77. procedure UnGetTemp(list: taasmoutput; const ref : treference);
  78. function SizeOfTemp(list: taasmoutput; const ref: treference): longint;
  79. function ChangeTempType(list: taasmoutput; const ref:treference;temptype:ttemptype):boolean;
  80. {# Returns TRUE if the reference ref is allocated in temporary volatile memory space,
  81. otherwise returns FALSE.
  82. @param(ref reference to verify)
  83. }
  84. function istemp(const ref : treference) : boolean;
  85. {# Frees a reference @var(ref) which was allocated in the volatile temporary memory space.
  86. The freed space can later be reallocated and reused. If this reference
  87. is not in the temporary memory, it is simply not freed.
  88. }
  89. procedure ungetiftemp(list: taasmoutput; const ref : treference);
  90. end;
  91. var
  92. tg: ttgobj;
  93. implementation
  94. uses
  95. systems,
  96. verbose,cutils,rgobj;
  97. const
  98. FreeTempTypes = [tt_free,tt_freenoreuse,tt_freeansistring,
  99. tt_freewidestring,tt_freeinterfacecom];
  100. {$ifdef EXTDEBUG}
  101. TempTypeStr : array[ttemptype] of string[18] = (
  102. '<none>',
  103. 'free','normal','persistant',
  104. 'noreuse','freenoreuse',
  105. 'ansistring','freeansistring',
  106. 'widestring','freewidestring',
  107. 'interfacecom','freeinterfacecom'
  108. );
  109. {$endif EXTDEBUG}
  110. Used2Free : array[ttemptype] of ttemptype = (
  111. tt_none,
  112. tt_none,tt_free,tt_free,
  113. tt_freenoreuse,tt_none,
  114. tt_freeansistring,tt_none,
  115. tt_freewidestring,tt_none,
  116. tt_freeinterfacecom,tt_none);
  117. {*****************************************************************************
  118. TTGOBJ
  119. *****************************************************************************}
  120. constructor ttgobj.create;
  121. begin
  122. tempfreelist:=nil;
  123. templist:=nil;
  124. { we could create a new child class for this but I don't if it is worth the effort (FK) }
  125. {$ifdef powerpc}
  126. direction:=1;
  127. {$else powerpc}
  128. direction:=-1;
  129. {$endif powerpc}
  130. {$IFDEF SPARC}
  131. Direction:=1;
  132. {$ENDIF SPARC}
  133. end;
  134. procedure ttgobj.resettempgen;
  135. var
  136. hp : ptemprecord;
  137. begin
  138. { Clear the old templist }
  139. while assigned(templist) do
  140. begin
  141. {$ifdef EXTDEBUG}
  142. if not(templist^.temptype in FreeTempTypes) then
  143. begin
  144. Comment(V_Warning,'tgobj: (ResetTempgen) temp at pos '+tostr(templist^.pos)+
  145. ' with size '+tostr(templist^.size)+' and type '+TempTypeStr[templist^.temptype]+
  146. ' from pos '+tostr(templist^.posinfo.line)+':'+tostr(templist^.posinfo.column)+
  147. ' not freed at the end of the procedure');
  148. end;
  149. {$endif}
  150. hp:=templist;
  151. templist:=hp^.next;
  152. dispose(hp);
  153. end;
  154. templist:=nil;
  155. tempfreelist:=nil;
  156. firsttemp:=0;
  157. lasttemp:=0;
  158. end;
  159. procedure ttgobj.setfirsttemp(l : longint);
  160. begin
  161. { this is a negative value normally }
  162. if l*direction>=0 then
  163. begin
  164. if odd(l) then
  165. inc(l,direction);
  166. end
  167. else
  168. internalerror(200204221);
  169. firsttemp:=l;
  170. lasttemp:=l;
  171. end;
  172. function ttgobj.gettempsize : longint;
  173. var
  174. _align : longint;
  175. begin
  176. { align to 4 bytes at least
  177. otherwise all those subl $2,%esp are meaningless PM }
  178. _align:=target_info.alignment.localalignmin;
  179. if _align<4 then
  180. _align:=4;
  181. gettempsize:=Align(direction*lasttemp,_align);
  182. end;
  183. function ttgobj.AllocTemp(list: taasmoutput; size : longint; temptype : ttemptype) : longint;
  184. var
  185. tl,
  186. bestslot,bestprev,
  187. hprev,hp : ptemprecord;
  188. bestsize : longint;
  189. freetype : ttemptype;
  190. begin
  191. AllocTemp:=0;
  192. bestprev:=nil;
  193. bestslot:=nil;
  194. tl:=nil;
  195. bestsize:=0;
  196. if size=0 then
  197. begin
  198. {$ifdef EXTDEBUG}
  199. Comment(V_Warning,'tgobj: (AllocTemp) temp of size 0 requested, allocating 4 bytes');
  200. {$endif}
  201. size:=4;
  202. end;
  203. freetype:=Used2Free[temptype];
  204. if freetype=tt_none then
  205. internalerror(200208201);
  206. { Align needed size on 4 bytes }
  207. size:=Align(size,4);
  208. { First check the tmpfreelist, but not when
  209. we don't want to reuse an already allocated block }
  210. if assigned(tempfreelist) and
  211. (temptype<>tt_noreuse) then
  212. begin
  213. { Check for a slot with the same size first }
  214. hprev:=nil;
  215. hp:=tempfreelist;
  216. while assigned(hp) do
  217. begin
  218. {$ifdef EXTDEBUG}
  219. if not(hp^.temptype in FreeTempTypes) then
  220. Comment(V_Warning,'tgobj: (AllocTemp) temp at pos '+tostr(hp^.pos)+ ' in freelist is not set to tt_free !');
  221. {$endif}
  222. if (hp^.temptype=freetype) and
  223. (hp^.size>=size) then
  224. begin
  225. { Slot is the same size, then leave immediatly }
  226. if hp^.size=size then
  227. begin
  228. bestprev:=hprev;
  229. bestslot:=hp;
  230. bestsize:=size;
  231. break;
  232. end
  233. else
  234. begin
  235. if (bestsize=0) or (hp^.size<bestsize) then
  236. begin
  237. bestprev:=hprev;
  238. bestslot:=hp;
  239. bestsize:=hp^.size;
  240. end;
  241. end;
  242. end;
  243. hprev:=hp;
  244. hp:=hp^.nextfree;
  245. end;
  246. end;
  247. { Reuse an old temp ? }
  248. if assigned(bestslot) then
  249. begin
  250. if bestsize=size then
  251. begin
  252. tl:=bestslot;
  253. tl^.temptype:=temptype;
  254. { Remove from the tempfreelist }
  255. if assigned(bestprev) then
  256. bestprev^.nextfree:=tl^.nextfree
  257. else
  258. tempfreelist:=tl^.nextfree;
  259. tl^.nextfree:=nil;
  260. end
  261. else
  262. begin
  263. { Resize the old block }
  264. dec(bestslot^.size,size);
  265. { Create new block and link after bestslot }
  266. new(tl);
  267. tl^.temptype:=temptype;
  268. if direction=1 then
  269. begin
  270. tl^.pos:=bestslot^.pos;
  271. inc(bestslot^.pos,size);
  272. end
  273. else
  274. tl^.pos:=bestslot^.pos+bestslot^.size;
  275. tl^.size:=size;
  276. tl^.nextfree:=nil;
  277. { link the new block }
  278. tl^.next:=bestslot^.next;
  279. bestslot^.next:=tl;
  280. end;
  281. end
  282. else
  283. begin
  284. { create a new temp, we need to allocate at least a minimum of
  285. 4 bytes, else we get two temps at the same position resulting
  286. in problems when finding the corresponding temprecord }
  287. if size<4 then
  288. size:=4;
  289. { now we can create the templist entry }
  290. new(tl);
  291. tl^.temptype:=temptype;
  292. if direction=-1 then
  293. begin
  294. { Extend the temp }
  295. dec(lasttemp,size);
  296. tl^.pos:=lasttemp;
  297. end
  298. else
  299. begin
  300. tl^.pos:=lasttemp;
  301. { Extend the temp }
  302. inc(lasttemp,size);
  303. end;
  304. tl^.size:=size;
  305. tl^.next:=templist;
  306. tl^.nextfree:=nil;
  307. templist:=tl;
  308. end;
  309. {$ifdef EXTDEBUG}
  310. tl^.posinfo:=aktfilepos;
  311. list.concat(tai_tempalloc.allocinfo(tl^.pos,tl^.size,'allocated with type '+TempTypeStr[tl^.temptype]));
  312. {$else}
  313. list.concat(tai_tempalloc.alloc(tl^.pos,tl^.size));
  314. {$endif}
  315. AllocTemp:=tl^.pos;
  316. end;
  317. procedure ttgobj.FreeTemp(list: taasmoutput; pos:longint;temptypes:ttemptypeset);
  318. var
  319. hp,hnext,hprev,hprevfree : ptemprecord;
  320. begin
  321. hp:=templist;
  322. hprev:=nil;
  323. hprevfree:=nil;
  324. while assigned(hp) do
  325. begin
  326. if (hp^.pos=pos) then
  327. begin
  328. { check if already freed }
  329. if hp^.temptype in FreeTempTypes then
  330. begin
  331. {$ifdef EXTDEBUG}
  332. Comment(V_Warning,'tgobj: (FreeTemp) temp at pos '+tostr(pos)+ ' is already free !');
  333. list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'temp is already freed'));
  334. {$endif}
  335. exit;
  336. end;
  337. { check type that are allowed to be released }
  338. if not(hp^.temptype in temptypes) then
  339. begin
  340. {$ifdef EXTDEBUG}
  341. Comment(V_Debug,'tgobj: (Freetemp) temp at pos '+tostr(pos)+ ' has different type ('+TempTypeStr[hp^.temptype]+'), not releasing');
  342. list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'temp has wrong type ('+TempTypeStr[hp^.temptype]+') not releasing'));
  343. {$endif}
  344. exit;
  345. end;
  346. list.concat(tai_tempalloc.dealloc(hp^.pos,hp^.size));
  347. { set this block to free }
  348. hp^.temptype:=Used2Free[hp^.temptype];
  349. { Update tempfreelist }
  350. if assigned(hprevfree) then
  351. begin
  352. { Connect With previous tt_free block? }
  353. if assigned(hprev) and
  354. (hp^.temptype=tt_free) and
  355. (hprev^.temptype=tt_free) then
  356. begin
  357. inc(hprev^.size,hp^.size);
  358. if direction=1 then
  359. hprev^.pos:=hp^.pos;
  360. hprev^.next:=hp^.next;
  361. dispose(hp);
  362. hp:=hprev;
  363. end
  364. else
  365. hprevfree^.nextfree:=hp;
  366. end
  367. else
  368. begin
  369. hp^.nextfree:=tempfreelist;
  370. tempfreelist:=hp;
  371. end;
  372. { Next block tt_free ? Yes, then concat }
  373. hnext:=hp^.next;
  374. if assigned(hnext) and
  375. (hp^.temptype=tt_free) and
  376. (hnext^.temptype=tt_free) then
  377. begin
  378. inc(hp^.size,hnext^.size);
  379. if direction=1 then
  380. hp^.pos:=hnext^.pos;
  381. hp^.nextfree:=hnext^.nextfree;
  382. hp^.next:=hnext^.next;
  383. dispose(hnext);
  384. end;
  385. { Stop }
  386. exit;
  387. end;
  388. if (hp^.temptype=tt_free) then
  389. hprevfree:=hp;
  390. hprev:=hp;
  391. hp:=hp^.next;
  392. end;
  393. end;
  394. procedure ttgobj.GetTemp(list: taasmoutput; size : longint;temptype:ttemptype;var ref : treference);
  395. begin
  396. reference_reset_base(ref,current_procinfo.framepointer,alloctemp(list,size,temptype));
  397. end;
  398. function ttgobj.istemp(const ref : treference) : boolean;
  399. begin
  400. { ref.index = R_NO was missing
  401. led to problems with local arrays
  402. with lower bound > 0 (PM) }
  403. if (ref.base.enum<>R_NO) and (ref.base.enum<>R_INTREGISTER) then
  404. internalerror(200301225);
  405. if (ref.index.enum<>R_NO) and (ref.index.enum<>R_INTREGISTER) then
  406. internalerror(200301225);
  407. if current_procinfo.framepointer.enum<>R_INTREGISTER then
  408. internalerror(200301225);
  409. if direction = 1 then
  410. begin
  411. istemp:=((ref.base.number=current_procinfo.framepointer.number) and
  412. (ref.index.number=NR_NO) and
  413. (ref.offset>=firsttemp));
  414. end
  415. else
  416. begin
  417. istemp:=((ref.base.number=current_procinfo.framepointer.number) and
  418. (ref.index.number=NR_NO) and
  419. (ref.offset<firsttemp));
  420. end;
  421. end;
  422. function ttgobj.SizeOfTemp(list: taasmoutput; const ref: treference): longint;
  423. var
  424. hp : ptemprecord;
  425. begin
  426. SizeOfTemp := -1;
  427. hp:=templist;
  428. while assigned(hp) do
  429. begin
  430. if (hp^.pos=ref.offset) then
  431. begin
  432. SizeOfTemp := hp^.size;
  433. exit;
  434. end;
  435. hp := hp^.next;
  436. end;
  437. {$ifdef EXTDEBUG}
  438. Comment(V_Debug,'tgobj: (SizeOfTemp) temp at pos '+tostr(ref.offset)+' not found !');
  439. list.concat(tai_tempalloc.allocinfo(ref.offset,0,'temp not found'));
  440. {$endif}
  441. end;
  442. function ttgobj.ChangeTempType(list: taasmoutput; const ref:treference;temptype:ttemptype):boolean;
  443. var
  444. hp : ptemprecord;
  445. begin
  446. ChangeTempType:=false;
  447. hp:=templist;
  448. while assigned(hp) do
  449. begin
  450. if (hp^.pos=ref.offset) then
  451. begin
  452. if not(hp^.temptype in [tt_free,tt_freeansistring,tt_freewidestring,tt_freeinterfacecom]) then
  453. begin
  454. {$ifdef EXTDEBUG}
  455. if hp^.temptype=temptype then
  456. Comment(V_Warning,'tgobj: (ChangeTempType) temp'+
  457. ' at pos '+tostr(ref.offset)+ ' is already of the correct type !');
  458. list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'type changed to '+TempTypeStr[temptype]));
  459. {$endif}
  460. ChangeTempType:=true;
  461. hp^.temptype:=temptype;
  462. end
  463. else
  464. begin
  465. {$ifdef EXTDEBUG}
  466. Comment(V_Warning,'tgobj: (ChangeTempType) temp'+
  467. ' at pos '+tostr(ref.offset)+ ' is already freed !');
  468. list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'temp is already freed'));
  469. {$endif}
  470. end;
  471. exit;
  472. end;
  473. hp:=hp^.next;
  474. end;
  475. {$ifdef EXTDEBUG}
  476. Comment(V_Warning,'tgobj: (ChangeTempType) temp'+
  477. ' at pos '+tostr(ref.offset)+ ' not found !');
  478. list.concat(tai_tempalloc.allocinfo(ref.offset,0,'temp not found'));
  479. {$endif}
  480. end;
  481. procedure ttgobj.UnGetTemp(list: taasmoutput; const ref : treference);
  482. begin
  483. FreeTemp(list,ref.offset,[tt_normal,tt_noreuse,tt_persistant,tt_ansistring,tt_widestring,tt_interfacecom]);
  484. end;
  485. procedure ttgobj.UnGetIfTemp(list: taasmoutput; const ref : treference);
  486. begin
  487. if istemp(ref) then
  488. FreeTemp(list,ref.offset,[tt_normal,tt_ansistring,tt_widestring,tt_interfacecom]);
  489. end;
  490. initialization
  491. tg := ttgobj.create;
  492. finalization
  493. tg.free;
  494. end.
  495. {
  496. $Log$
  497. Revision 1.33 2003-05-13 20:13:41 florian
  498. * fixed temp. management for CPUs were the temp. space grows upwards
  499. Revision 1.32 2003/05/12 21:29:59 peter
  500. * extdebug info temp alloc type was wrong
  501. Revision 1.31 2003/04/27 11:21:35 peter
  502. * aktprocdef renamed to current_procdef
  503. * procinfo renamed to current_procinfo
  504. * procinfo will now be stored in current_module so it can be
  505. cleaned up properly
  506. * gen_main_procsym changed to create_main_proc and release_main_proc
  507. to also generate a tprocinfo structure
  508. * fixed unit implicit initfinal
  509. Revision 1.30 2003/04/25 20:59:35 peter
  510. * removed funcretn,funcretsym, function result is now in varsym
  511. and aliases for result and function name are added using absolutesym
  512. * vs_hidden parameter for funcret passed in parameter
  513. * vs_hidden fixes
  514. * writenode changed to printnode and released from extdebug
  515. * -vp option added to generate a tree.log with the nodetree
  516. * nicer printnode for statements, callnode
  517. Revision 1.29 2003/04/23 08:40:39 jonas
  518. * fixed istemp() when tg.direction = 1
  519. Revision 1.28 2003/04/22 09:46:17 peter
  520. * always allocate 4 bytes when 0 bytes are asked
  521. Revision 1.27 2003/03/11 21:46:24 jonas
  522. * lots of new regallocator fixes, both in generic and ppc-specific code
  523. (ppc compiler still can't compile the linux system unit though)
  524. Revision 1.26 2003/02/19 22:00:15 daniel
  525. * Code generator converted to new register notation
  526. - Horribily outdated todo.txt removed
  527. Revision 1.25 2003/02/03 23:10:39 daniel
  528. * Fixed last commit
  529. Revision 1.24 2003/02/03 23:07:39 daniel
  530. * Made gettemp use intended procedure for setting reference
  531. Revision 1.23 2003/01/08 18:43:57 daniel
  532. * Tregister changed into a record
  533. Revision 1.22 2002/12/01 18:58:26 carl
  534. * fix bugs with istemp() was wrong, and every reference was a temp
  535. Revision 1.21 2002/11/24 18:18:04 carl
  536. - remove some unused defines
  537. Revision 1.20 2002/11/17 17:49:08 mazen
  538. + return_result_reg and function_result_reg are now used, in all plateforms, to pass functions result between called function and its caller. See the explanation of each one
  539. Revision 1.19 2002/11/15 01:58:54 peter
  540. * merged changes from 1.0.7 up to 04-11
  541. - -V option for generating bug report tracing
  542. - more tracing for option parsing
  543. - errors for cdecl and high()
  544. - win32 import stabs
  545. - win32 records<=8 are returned in eax:edx (turned off by default)
  546. - heaptrc update
  547. - more info for temp management in .s file with EXTDEBUG
  548. Revision 1.18 2002/10/11 11:57:43 florian
  549. *** empty log message ***
  550. Revision 1.16 2002/09/07 18:25:00 florian
  551. + added tcg.direction to allow upwards growing temp areas
  552. i.e. temps with positive index
  553. Revision 1.15 2002/09/01 18:42:50 peter
  554. * reduced level of comment that type is wrong for release
  555. Revision 1.14 2002/09/01 12:14:53 peter
  556. * fixed some wrong levels in extdebug comments
  557. Revision 1.13 2002/08/24 18:35:04 peter
  558. * when reusing a block also update the temptype instead of forcing it
  559. to tt_normal
  560. Revision 1.12 2002/08/23 16:14:49 peter
  561. * tempgen cleanup
  562. * tt_noreuse temp type added that will be used in genentrycode
  563. Revision 1.11 2002/08/17 09:23:44 florian
  564. * first part of procinfo rewrite
  565. Revision 1.10 2002/07/01 18:46:29 peter
  566. * internal linker
  567. * reorganized aasm layer
  568. Revision 1.9 2002/05/18 13:34:21 peter
  569. * readded missing revisions
  570. Revision 1.8 2002/05/16 19:46:45 carl
  571. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  572. + try to fix temp allocation (still in ifdef)
  573. + generic constructor calls
  574. + start of tassembler / tmodulebase class cleanup
  575. Revision 1.7 2002/05/14 19:34:52 peter
  576. * removed old logs and updated copyright year
  577. Revision 1.6 2002/04/15 19:08:22 carl
  578. + target_info.size_of_pointer -> pointer_size
  579. + some cleanup of unused types/variables
  580. Revision 1.5 2002/04/07 13:38:48 carl
  581. + update documentation
  582. Revision 1.4 2002/04/07 09:17:17 carl
  583. + documentation
  584. - clean-up
  585. Revision 1.3 2002/04/04 19:06:06 peter
  586. * removed unused units
  587. * use tlocation.size in cg.a_*loc*() routines
  588. Revision 1.2 2002/04/02 17:11:32 peter
  589. * tlocation,treference update
  590. * LOC_CONSTANT added for better constant handling
  591. * secondadd splitted in multiple routines
  592. * location_force_reg added for loading a location to a register
  593. of a specified size
  594. * secondassignment parses now first the right and then the left node
  595. (this is compatible with Kylix). This saves a lot of push/pop especially
  596. with string operations
  597. * adapted some routines to use the new cg methods
  598. Revision 1.1 2002/03/31 20:26:37 jonas
  599. + a_loadfpu_* and a_loadmm_* methods in tcg
  600. * register allocation is now handled by a class and is mostly processor
  601. independent (+rgobj.pas and i386/rgcpu.pas)
  602. * temp allocation is now handled by a class (+tgobj.pas, -i386\tgcpu.pas)
  603. * some small improvements and fixes to the optimizer
  604. * some register allocation fixes
  605. * some fpuvaroffset fixes in the unary minus node
  606. * push/popusedregisters is now called rg.save/restoreusedregisters and
  607. (for i386) uses temps instead of push/pop's when using -Op3 (that code is
  608. also better optimizable)
  609. * fixed and optimized register saving/restoring for new/dispose nodes
  610. * LOC_FPU locations now also require their "register" field to be set to
  611. R_ST, not R_ST0 (the latter is used for LOC_CFPUREGISTER locations only)
  612. - list field removed of the tnode class because it's not used currently
  613. and can cause hard-to-find bugs
  614. }