symtype.pas 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl, Pierre Muller
  4. This unit handles the symbol tables
  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. unit symtype;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. { common }
  23. cutils,
  24. {$ifdef MEMDEBUG}
  25. cclasses,
  26. {$endif MEMDEBUG}
  27. { global }
  28. globtype,globals,
  29. { symtable }
  30. symconst,symbase,
  31. { aasm }
  32. aasmbase
  33. ;
  34. type
  35. {************************************************
  36. Required Forwards
  37. ************************************************}
  38. tsym = class;
  39. {************************************************
  40. TRef
  41. ************************************************}
  42. tref = class
  43. nextref : tref;
  44. posinfo : tfileposinfo;
  45. moduleindex : longint;
  46. is_written : boolean;
  47. constructor create(ref:tref;pos:pfileposinfo);
  48. procedure freechain;
  49. destructor destroy;override;
  50. end;
  51. {************************************************
  52. TDef
  53. ************************************************}
  54. tgetsymtable = (gs_none,gs_record,gs_local,gs_para);
  55. tdef = class(tdefentry)
  56. typesym : tsym; { which type the definition was generated this def }
  57. defoptions : tdefoptions;
  58. constructor create;
  59. procedure deref;virtual;abstract;
  60. procedure derefimpl;virtual;abstract;
  61. function typename:string;
  62. function gettypename:string;virtual;
  63. function mangledparaname:string;
  64. function getmangledparaname:string;virtual;abstract;
  65. function size:longint;virtual;abstract;
  66. function alignment:longint;virtual;abstract;
  67. function getparentdef:tdef;virtual;
  68. function getsymtable(t:tgetsymtable):tsymtable;virtual;
  69. function is_publishable:boolean;virtual;abstract;
  70. function needs_inittable:boolean;virtual;abstract;
  71. end;
  72. {************************************************
  73. TSym
  74. ************************************************}
  75. { this object is the base for all symbol objects }
  76. tsym = class(tsymentry)
  77. _realname : pstring;
  78. fileinfo : tfileposinfo;
  79. symoptions : tsymoptions;
  80. constructor create(const n : string);
  81. destructor destroy;override;
  82. function realname:string;
  83. procedure deref;virtual;abstract;
  84. function gettypedef:tdef;virtual;
  85. end;
  86. {************************************************
  87. TDeref
  88. ************************************************}
  89. tderefdata = array[0..31] of byte;
  90. tderef = object
  91. len : longint;
  92. data : tderefdata;
  93. procedure reset;
  94. procedure setdata(l:longint;var d);
  95. procedure build(s:tsymtableentry);
  96. function resolve:tsymtableentry;
  97. end;
  98. {************************************************
  99. TType
  100. ************************************************}
  101. ttype = object
  102. def : tdef;
  103. sym : tsym;
  104. deref : tderef;
  105. procedure reset;
  106. procedure setdef(p:tdef);
  107. procedure setsym(p:tsym);
  108. procedure resolve;
  109. end;
  110. {************************************************
  111. TSymList
  112. ************************************************}
  113. psymlistitem = ^tsymlistitem;
  114. tsymlistitem = record
  115. sltype : tsltype;
  116. sym : tsym;
  117. symderef : tderef;
  118. value : longint;
  119. next : psymlistitem;
  120. end;
  121. tsymlist = class
  122. procdef : tdef;
  123. procdefderef : tderef;
  124. firstsym,
  125. lastsym : psymlistitem;
  126. constructor create;
  127. destructor destroy;override;
  128. function empty:boolean;
  129. procedure addsym(slt:tsltype;p:tsym);
  130. procedure addsymderef(slt:tsltype;const d:tderef);
  131. procedure addconst(slt:tsltype;v:longint);
  132. procedure clear;
  133. function getcopy:tsymlist;
  134. procedure resolve;
  135. end;
  136. {$ifdef MEMDEBUG}
  137. var
  138. membrowser,
  139. memrealnames,
  140. memmanglednames,
  141. memprocpara,
  142. memprocparast,
  143. memproclocalst,
  144. memprocnodetree : tmemdebug;
  145. {$endif MEMDEBUG}
  146. implementation
  147. uses
  148. verbose,
  149. fmodule;
  150. {****************************************************************************
  151. Tdef
  152. ****************************************************************************}
  153. constructor tdef.create;
  154. begin
  155. inherited create;
  156. deftype:=abstractdef;
  157. owner := nil;
  158. typesym := nil;
  159. defoptions:=[];
  160. end;
  161. function tdef.typename:string;
  162. begin
  163. if assigned(typesym) and
  164. not(deftype in [procvardef,procdef]) and
  165. assigned(typesym._realname) and
  166. (typesym._realname^[1]<>'$') then
  167. typename:=typesym._realname^
  168. else
  169. typename:=gettypename;
  170. end;
  171. function tdef.gettypename : string;
  172. begin
  173. gettypename:='<unknown type>'
  174. end;
  175. function tdef.mangledparaname:string;
  176. begin
  177. if assigned(typesym) then
  178. mangledparaname:=typesym.name
  179. else
  180. mangledparaname:=getmangledparaname;
  181. end;
  182. function tdef.getparentdef:tdef;
  183. begin
  184. result:=nil;
  185. end;
  186. function tdef.getsymtable(t:tgetsymtable):tsymtable;
  187. begin
  188. getsymtable:=nil;
  189. end;
  190. {****************************************************************************
  191. TSYM (base for all symtypes)
  192. ****************************************************************************}
  193. constructor tsym.create(const n : string);
  194. begin
  195. if n[1]='$' then
  196. inherited createname(copy(n,2,255))
  197. else
  198. inherited createname(upper(n));
  199. _realname:=stringdup(n);
  200. typ:=abstractsym;
  201. symoptions:=[];
  202. end;
  203. destructor tsym.destroy;
  204. begin
  205. {$ifdef MEMDEBUG}
  206. memrealnames.start;
  207. {$endif MEMDEBUG}
  208. stringdispose(_realname);
  209. {$ifdef MEMDEBUG}
  210. memrealnames.stop;
  211. {$endif MEMDEBUG}
  212. inherited destroy;
  213. end;
  214. function tsym.realname : string;
  215. begin
  216. if assigned(_realname) then
  217. realname:=_realname^
  218. else
  219. realname:=name;
  220. end;
  221. function tsym.gettypedef:tdef;
  222. begin
  223. gettypedef:=nil;
  224. end;
  225. {****************************************************************************
  226. TRef
  227. ****************************************************************************}
  228. constructor tref.create(ref :tref;pos : pfileposinfo);
  229. begin
  230. nextref:=nil;
  231. if pos<>nil then
  232. posinfo:=pos^;
  233. if assigned(current_module) then
  234. moduleindex:=current_module.unit_index;
  235. if assigned(ref) then
  236. ref.nextref:=self;
  237. is_written:=false;
  238. end;
  239. procedure tref.freechain;
  240. var
  241. p,q : tref;
  242. begin
  243. p:=nextref;
  244. nextref:=nil;
  245. while assigned(p) do
  246. begin
  247. q:=p.nextref;
  248. p.free;
  249. p:=q;
  250. end;
  251. end;
  252. destructor tref.destroy;
  253. begin
  254. nextref:=nil;
  255. end;
  256. {****************************************************************************
  257. TType
  258. ****************************************************************************}
  259. procedure ttype.reset;
  260. begin
  261. def:=nil;
  262. sym:=nil;
  263. end;
  264. procedure ttype.setdef(p:tdef);
  265. begin
  266. def:=p;
  267. sym:=nil;
  268. end;
  269. procedure ttype.setsym(p:tsym);
  270. begin
  271. sym:=p;
  272. def:=p.gettypedef;
  273. if not assigned(def) then
  274. internalerror(1234005);
  275. end;
  276. procedure ttype.resolve;
  277. var
  278. p : tsymtableentry;
  279. begin
  280. p:=deref.resolve;
  281. if assigned(p) then
  282. begin
  283. if p is tsym then
  284. begin
  285. setsym(tsym(p));
  286. if not assigned(def) then
  287. internalerror(200212272);
  288. end
  289. else
  290. begin
  291. setdef(tdef(p));
  292. end;
  293. end
  294. else
  295. reset;
  296. end;
  297. {****************************************************************************
  298. TSymList
  299. ****************************************************************************}
  300. constructor tsymlist.create;
  301. begin
  302. procdef:=nil; { needed for procedures }
  303. firstsym:=nil;
  304. lastsym:=nil;
  305. end;
  306. destructor tsymlist.destroy;
  307. begin
  308. clear;
  309. end;
  310. function tsymlist.empty:boolean;
  311. begin
  312. empty:=(firstsym=nil);
  313. end;
  314. procedure tsymlist.clear;
  315. var
  316. hp : psymlistitem;
  317. begin
  318. while assigned(firstsym) do
  319. begin
  320. hp:=firstsym;
  321. firstsym:=firstsym^.next;
  322. dispose(hp);
  323. end;
  324. firstsym:=nil;
  325. lastsym:=nil;
  326. procdef:=nil;
  327. end;
  328. procedure tsymlist.addsym(slt:tsltype;p:tsym);
  329. var
  330. hp : psymlistitem;
  331. begin
  332. if not assigned(p) then
  333. internalerror(200110203);
  334. new(hp);
  335. hp^.sltype:=slt;
  336. hp^.sym:=p;
  337. hp^.symderef.reset;
  338. hp^.value:=0;
  339. hp^.next:=nil;
  340. if assigned(lastsym) then
  341. lastsym^.next:=hp
  342. else
  343. firstsym:=hp;
  344. lastsym:=hp;
  345. end;
  346. procedure tsymlist.addsymderef(slt:tsltype;const d:tderef);
  347. var
  348. hp : psymlistitem;
  349. begin
  350. new(hp);
  351. hp^.sltype:=slt;
  352. hp^.sym:=nil;
  353. hp^.symderef:=d;
  354. hp^.value:=0;
  355. hp^.next:=nil;
  356. if assigned(lastsym) then
  357. lastsym^.next:=hp
  358. else
  359. firstsym:=hp;
  360. lastsym:=hp;
  361. end;
  362. procedure tsymlist.addconst(slt:tsltype;v:longint);
  363. var
  364. hp : psymlistitem;
  365. begin
  366. new(hp);
  367. hp^.sltype:=slt;
  368. hp^.sym:=nil;
  369. hp^.symderef.reset;
  370. hp^.value:=v;
  371. hp^.next:=nil;
  372. if assigned(lastsym) then
  373. lastsym^.next:=hp
  374. else
  375. firstsym:=hp;
  376. lastsym:=hp;
  377. end;
  378. function tsymlist.getcopy:tsymlist;
  379. var
  380. hp : tsymlist;
  381. hp2 : psymlistitem;
  382. hpn : psymlistitem;
  383. begin
  384. hp:=tsymlist.create;
  385. hp.procdef:=procdef;
  386. hp2:=firstsym;
  387. while assigned(hp2) do
  388. begin
  389. new(hpn);
  390. hpn^:=hp2^;
  391. hpn^.next:=nil;
  392. if assigned(hp.lastsym) then
  393. hp.lastsym^.next:=hpn
  394. else
  395. hp.firstsym:=hpn;
  396. hp.lastsym:=hpn;
  397. hp2:=hp2^.next;
  398. end;
  399. getcopy:=hp;
  400. end;
  401. procedure tsymlist.resolve;
  402. var
  403. hp : psymlistitem;
  404. begin
  405. procdef:=tdef(procdefderef.resolve);
  406. hp:=firstsym;
  407. while assigned(hp) do
  408. begin
  409. hp^.sym:=tsym(hp^.symderef.resolve);
  410. hp:=hp^.next;
  411. end;
  412. end;
  413. {****************************************************************************
  414. Tderef
  415. ****************************************************************************}
  416. procedure tderef.reset;
  417. begin
  418. len:=0;
  419. end;
  420. procedure tderef.setdata(l:longint;var d);
  421. begin
  422. len:=l;
  423. if l>sizeof(tderefdata) then
  424. internalerror(200306068);
  425. move(d,data,len);
  426. end;
  427. procedure tderef.build(s:tsymtableentry);
  428. function is_child(currdef,ownerdef:tdef):boolean;
  429. begin
  430. while assigned(currdef) and
  431. (currdef<>ownerdef) do
  432. currdef:=currdef.getparentdef;
  433. result:=assigned(currdef);
  434. end;
  435. procedure addowner(s:tsymtableentry);
  436. begin
  437. if not assigned(s.owner) then
  438. internalerror(200306063);
  439. case s.owner.symtabletype of
  440. globalsymtable :
  441. begin
  442. if s.owner.unitid=0 then
  443. begin
  444. data[len]:=ord(deref_aktglobal);
  445. inc(len);
  446. end
  447. else
  448. begin
  449. { check if the unit is available in the uses
  450. clause, else it's an error }
  451. if s.owner.unitid=$ffff then
  452. internalerror(200306063);
  453. data[len]:=ord(deref_unit);
  454. data[len+1]:=s.owner.unitid shr 8;
  455. data[len+2]:=s.owner.unitid and $ff;
  456. inc(len,3);
  457. end;
  458. end;
  459. staticsymtable :
  460. begin
  461. { only references to the current static symtable are allowed }
  462. if s.owner<>aktstaticsymtable then
  463. internalerror(200306233);
  464. data[len]:=ord(deref_aktstatic);
  465. inc(len);
  466. end;
  467. localsymtable :
  468. begin
  469. addowner(s.owner.defowner);
  470. data[len]:=ord(deref_def);
  471. data[len+1]:=s.owner.defowner.indexnr shr 8;
  472. data[len+2]:=s.owner.defowner.indexnr and $ff;
  473. data[len+3]:=ord(deref_local);
  474. inc(len,4);
  475. end;
  476. parasymtable :
  477. begin
  478. addowner(s.owner.defowner);
  479. data[len]:=ord(deref_def);
  480. data[len+1]:=s.owner.defowner.indexnr shr 8;
  481. data[len+2]:=s.owner.defowner.indexnr and $ff;
  482. data[len+3]:=ord(deref_para);
  483. inc(len,4);
  484. end;
  485. objectsymtable,
  486. recordsymtable :
  487. begin
  488. addowner(s.owner.defowner);
  489. data[len]:=ord(deref_def);
  490. data[len+1]:=s.owner.defowner.indexnr shr 8;
  491. data[len+2]:=s.owner.defowner.indexnr and $ff;
  492. data[len+3]:=ord(deref_record);
  493. inc(len,4);
  494. end;
  495. else
  496. internalerror(200306065);
  497. end;
  498. if len+3>sizeof(tderefdata) then
  499. internalerror(200306062);
  500. end;
  501. procedure addparentobject(currdef,ownerdef:tdef);
  502. var
  503. nextdef : tdef;
  504. begin
  505. if not assigned(currdef) then
  506. internalerror(200306185);
  507. { Already handled by derefaktrecordindex }
  508. if currdef=ownerdef then
  509. internalerror(200306188);
  510. { Generate a direct reference to the top parent
  511. class available in the current unit, this is required because
  512. the parent class is maybe not resolved yet and therefor
  513. has the childof value not available yet }
  514. while (currdef<>ownerdef) do
  515. begin
  516. nextdef:=currdef.getparentdef;
  517. { objects are only allowed in globalsymtable,staticsymtable this check is
  518. needed because we need the unitid }
  519. if not(nextdef.owner.symtabletype in [globalsymtable,staticsymtable]) then
  520. internalerror(200306187);
  521. { Next parent is in a different unit, then stop }
  522. if nextdef.owner.unitid<>0 then
  523. break;
  524. currdef:=nextdef;
  525. end;
  526. { Add reference where to start the parent lookup }
  527. if currdef=aktrecordsymtable.defowner then
  528. begin
  529. data[len]:=ord(deref_aktrecord);
  530. inc(len);
  531. end
  532. else
  533. begin
  534. if currdef.owner.symtabletype=globalsymtable then
  535. data[len]:=ord(deref_aktglobal)
  536. else
  537. data[len]:=ord(deref_aktstatic);
  538. data[len+1]:=ord(deref_def);
  539. data[len+2]:=currdef.indexnr shr 8;
  540. data[len+3]:=currdef.indexnr and $ff;
  541. data[len+4]:=ord(deref_record);
  542. inc(len,5);
  543. end;
  544. { When the current found parent in this module is not the owner we
  545. add derefs for the parent classes not available in this unit }
  546. while (currdef<>ownerdef) do
  547. begin
  548. data[len]:=ord(deref_parent_object);
  549. inc(len);
  550. currdef:=currdef.getparentdef;
  551. { It should be valid as it is checked by is_child }
  552. if not assigned(currdef) then
  553. internalerror(200306186);
  554. end;
  555. end;
  556. begin
  557. len:=0;
  558. if assigned(s) then
  559. begin
  560. { Static symtable of current unit ? }
  561. if (s.owner.symtabletype=staticsymtable) and
  562. (s.owner.unitid=0) then
  563. begin
  564. data[len]:=ord(deref_aktstatic);
  565. inc(len);
  566. end
  567. { Global symtable of current unit ? }
  568. else if (s.owner.symtabletype=globalsymtable) and
  569. (s.owner.unitid=0) then
  570. begin
  571. data[len]:=ord(deref_aktglobal);
  572. inc(len);
  573. end
  574. { Current record/object symtable ? }
  575. else if (s.owner=aktrecordsymtable) then
  576. begin
  577. data[len]:=ord(deref_aktrecord);
  578. inc(len);
  579. end
  580. { Current local symtable ? }
  581. else if (s.owner=aktlocalsymtable) then
  582. begin
  583. data[len]:=ord(deref_aktlocal);
  584. inc(len);
  585. end
  586. { Current para symtable ? }
  587. else if (s.owner=aktparasymtable) then
  588. begin
  589. data[len]:=ord(deref_aktpara);
  590. inc(len);
  591. end
  592. { Parent class? }
  593. else if assigned(aktrecordsymtable) and
  594. (aktrecordsymtable.symtabletype=objectsymtable) and
  595. (s.owner.symtabletype=objectsymtable) and
  596. is_child(tdef(aktrecordsymtable.defowner),tdef(s.owner.defowner)) then
  597. begin
  598. addparentobject(tdef(aktrecordsymtable.defowner),tdef(s.owner.defowner));
  599. end
  600. else
  601. { Default, start by building from unit symtable }
  602. begin
  603. addowner(s);
  604. end;
  605. { Add index of the symbol/def }
  606. if s is tsym then
  607. data[len]:=ord(deref_sym)
  608. else
  609. data[len]:=ord(deref_def);
  610. data[len+1]:=s.indexnr shr 8;
  611. data[len+2]:=s.indexnr and $ff;
  612. inc(len,3);
  613. end
  614. else
  615. begin
  616. { nil pointer }
  617. data[len]:=0;
  618. inc(len);
  619. end;
  620. end;
  621. function tderef.resolve:tsymtableentry;
  622. var
  623. pd : tdef;
  624. pm : tmodule;
  625. typ : tdereftype;
  626. st : tsymtable;
  627. idx : word;
  628. i : longint;
  629. begin
  630. result:=nil;
  631. { not initialized }
  632. if len=0 then
  633. internalerror(200306067);
  634. st:=nil;
  635. i:=0;
  636. while (i<len) do
  637. begin
  638. typ:=tdereftype(data[i]);
  639. inc(i);
  640. case typ of
  641. deref_nil :
  642. begin
  643. result:=nil;
  644. { Only allowed when no other deref is available }
  645. if len<>1 then
  646. internalerror(200306232);
  647. end;
  648. deref_sym :
  649. begin
  650. if not assigned(st) then
  651. internalerror(200309141);
  652. idx:=(data[i] shl 8) or data[i+1];
  653. inc(i,2);
  654. result:=st.getsymnr(idx);
  655. end;
  656. deref_def :
  657. begin
  658. if not assigned(st) then
  659. internalerror(200309142);
  660. idx:=(data[i] shl 8) or data[i+1];
  661. inc(i,2);
  662. result:=st.getdefnr(idx);
  663. end;
  664. deref_aktrecord :
  665. st:=aktrecordsymtable;
  666. deref_aktstatic :
  667. st:=aktstaticsymtable;
  668. deref_aktglobal :
  669. st:=aktglobalsymtable;
  670. deref_aktlocal :
  671. st:=aktlocalsymtable;
  672. deref_aktpara :
  673. st:=aktparasymtable;
  674. deref_unit :
  675. begin
  676. idx:=(data[i] shl 8) or data[i+1];
  677. inc(i,2);
  678. if idx>maxunits then
  679. internalerror(200306231);
  680. pm:=current_module.map^[idx];
  681. if not assigned(pm) then
  682. internalerror(200212273);
  683. st:=pm.globalsymtable;
  684. end;
  685. deref_local :
  686. begin
  687. if not assigned(result) then
  688. internalerror(200306069);
  689. st:=tdef(result).getsymtable(gs_local);
  690. result:=nil;
  691. if not assigned(st) then
  692. internalerror(200212275);
  693. end;
  694. deref_para :
  695. begin
  696. if not assigned(result) then
  697. internalerror(2003060610);
  698. st:=tdef(result).getsymtable(gs_para);
  699. result:=nil;
  700. if not assigned(st) then
  701. internalerror(200212276);
  702. end;
  703. deref_record :
  704. begin
  705. if not assigned(result) then
  706. internalerror(200306068);
  707. st:=tdef(result).getsymtable(gs_record);
  708. result:=nil;
  709. if not assigned(st) then
  710. internalerror(200212274);
  711. end;
  712. deref_parent_object :
  713. begin
  714. { load current object symtable if no
  715. symtable is available yet }
  716. if st=nil then
  717. begin
  718. st:=aktrecordsymtable;
  719. if not assigned(st) then
  720. internalerror(200306068);
  721. end;
  722. if st.symtabletype<>objectsymtable then
  723. internalerror(200306189);
  724. pd:=tdef(st.defowner).getparentdef;
  725. if not assigned(pd) then
  726. internalerror(200306184);
  727. st:=pd.getsymtable(gs_record);
  728. if not assigned(st) then
  729. internalerror(200212274);
  730. end;
  731. else
  732. internalerror(200212277);
  733. end;
  734. end;
  735. end;
  736. {$ifdef MEMDEBUG}
  737. initialization
  738. membrowser:=TMemDebug.create('BrowserRefs');
  739. membrowser.stop;
  740. memrealnames:=TMemDebug.create('Realnames');
  741. memrealnames.stop;
  742. memmanglednames:=TMemDebug.create('Manglednames');
  743. memmanglednames.stop;
  744. memprocpara:=TMemDebug.create('ProcPara');
  745. memprocpara.stop;
  746. memprocparast:=TMemDebug.create('ProcParaSt');
  747. memprocparast.stop;
  748. memproclocalst:=TMemDebug.create('ProcLocalSt');
  749. memproclocalst.stop;
  750. memprocnodetree:=TMemDebug.create('ProcNodeTree');
  751. memprocnodetree.stop;
  752. finalization
  753. membrowser.free;
  754. memrealnames.free;
  755. memmanglednames.free;
  756. memprocpara.free;
  757. memprocparast.free;
  758. memproclocalst.free;
  759. memprocnodetree.free;
  760. {$endif MEMDEBUG}
  761. end.
  762. {
  763. $Log$
  764. Revision 1.29 2003-10-17 14:38:32 peter
  765. * 64k registers supported
  766. * fixed some memory leaks
  767. Revision 1.28 2003/10/07 16:06:30 peter
  768. * tsymlist.def renamed to tsymlist.procdef
  769. * tsymlist.procdef is now only used to store the procdef
  770. Revision 1.27 2003/09/14 12:58:29 peter
  771. * give IE when st is not assigned in deref
  772. Revision 1.26 2003/06/25 18:31:23 peter
  773. * sym,def resolving partly rewritten to support also parent objects
  774. not directly available through the uses clause
  775. Revision 1.25 2003/06/07 20:26:32 peter
  776. * re-resolving added instead of reloading from ppu
  777. * tderef object added to store deref info for resolving
  778. Revision 1.24 2002/12/29 18:26:31 peter
  779. * also use gettypename for procdef always
  780. Revision 1.23 2002/12/29 14:57:50 peter
  781. * unit loading changed to first register units and load them
  782. afterwards. This is needed to support uses xxx in yyy correctly
  783. * unit dependency check fixed
  784. Revision 1.22 2002/09/05 19:29:46 peter
  785. * memdebug enhancements
  786. Revision 1.21 2002/08/18 20:06:28 peter
  787. * inlining is now also allowed in interface
  788. * renamed write/load to ppuwrite/ppuload
  789. * tnode storing in ppu
  790. * nld,ncon,nbas are already updated for storing in ppu
  791. Revision 1.20 2002/08/11 13:24:16 peter
  792. * saving of asmsymbols in ppu supported
  793. * asmsymbollist global is removed and moved into a new class
  794. tasmlibrarydata that will hold the info of a .a file which
  795. corresponds with a single module. Added librarydata to tmodule
  796. to keep the library info stored for the module. In the future the
  797. objectfiles will also be stored to the tasmlibrarydata class
  798. * all getlabel/newasmsymbol and friends are moved to the new class
  799. Revision 1.19 2002/07/01 18:46:29 peter
  800. * internal linker
  801. * reorganized aasm layer
  802. Revision 1.18 2002/05/18 13:34:21 peter
  803. * readded missing revisions
  804. Revision 1.17 2002/05/16 19:46:45 carl
  805. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  806. + try to fix temp allocation (still in ifdef)
  807. + generic constructor calls
  808. + start of tassembler / tmodulebase class cleanup
  809. Revision 1.15 2002/05/12 16:53:15 peter
  810. * moved entry and exitcode to ncgutil and cgobj
  811. * foreach gets extra argument for passing local data to the
  812. iterator function
  813. * -CR checks also class typecasts at runtime by changing them
  814. into as
  815. * fixed compiler to cycle with the -CR option
  816. * fixed stabs with elf writer, finally the global variables can
  817. be watched
  818. * removed a lot of routines from cga unit and replaced them by
  819. calls to cgobj
  820. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  821. u32bit then the other is typecasted also to u32bit without giving
  822. a rangecheck warning/error.
  823. * fixed pascal calling method with reversing also the high tree in
  824. the parast, detected by tcalcst3 test
  825. Revision 1.14 2002/04/19 15:46:04 peter
  826. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  827. in most cases and not written to the ppu
  828. * add mangeledname_prefix() routine to generate the prefix of
  829. manglednames depending on the current procedure, object and module
  830. * removed static procprefix since the mangledname is now build only
  831. on demand from tprocdef.mangledname
  832. }