symtype.pas 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936
  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. def : tdef;
  123. defderef : tderef;
  124. firstsym,
  125. lastsym : psymlistitem;
  126. constructor create;
  127. destructor destroy;override;
  128. function empty:boolean;
  129. procedure setdef(p:tdef);
  130. procedure addsym(slt:tsltype;p:tsym);
  131. procedure addsymderef(slt:tsltype;const d:tderef);
  132. procedure addconst(slt:tsltype;v:longint);
  133. procedure clear;
  134. function getcopy:tsymlist;
  135. procedure resolve;
  136. end;
  137. {$ifdef MEMDEBUG}
  138. var
  139. membrowser,
  140. memrealnames,
  141. memmanglednames,
  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. def:=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. def:=nil;
  327. end;
  328. procedure tsymlist.setdef(p:tdef);
  329. begin
  330. def:=p;
  331. end;
  332. procedure tsymlist.addsym(slt:tsltype;p:tsym);
  333. var
  334. hp : psymlistitem;
  335. begin
  336. if not assigned(p) then
  337. internalerror(200110203);
  338. new(hp);
  339. hp^.sltype:=slt;
  340. hp^.sym:=p;
  341. hp^.symderef.reset;
  342. hp^.value:=0;
  343. hp^.next:=nil;
  344. if assigned(lastsym) then
  345. lastsym^.next:=hp
  346. else
  347. firstsym:=hp;
  348. lastsym:=hp;
  349. end;
  350. procedure tsymlist.addsymderef(slt:tsltype;const d:tderef);
  351. var
  352. hp : psymlistitem;
  353. begin
  354. new(hp);
  355. hp^.sltype:=slt;
  356. hp^.sym:=nil;
  357. hp^.symderef:=d;
  358. hp^.value:=0;
  359. hp^.next:=nil;
  360. if assigned(lastsym) then
  361. lastsym^.next:=hp
  362. else
  363. firstsym:=hp;
  364. lastsym:=hp;
  365. end;
  366. procedure tsymlist.addconst(slt:tsltype;v:longint);
  367. var
  368. hp : psymlistitem;
  369. begin
  370. new(hp);
  371. hp^.sltype:=slt;
  372. hp^.sym:=nil;
  373. hp^.symderef.reset;
  374. hp^.value:=v;
  375. hp^.next:=nil;
  376. if assigned(lastsym) then
  377. lastsym^.next:=hp
  378. else
  379. firstsym:=hp;
  380. lastsym:=hp;
  381. end;
  382. function tsymlist.getcopy:tsymlist;
  383. var
  384. hp : tsymlist;
  385. hp2 : psymlistitem;
  386. hpn : psymlistitem;
  387. begin
  388. hp:=tsymlist.create;
  389. hp.def:=def;
  390. hp2:=firstsym;
  391. while assigned(hp2) do
  392. begin
  393. new(hpn);
  394. hpn^:=hp2^;
  395. hpn^.next:=nil;
  396. if assigned(hp.lastsym) then
  397. hp.lastsym^.next:=hpn
  398. else
  399. hp.firstsym:=hpn;
  400. hp.lastsym:=hpn;
  401. hp2:=hp2^.next;
  402. end;
  403. getcopy:=hp;
  404. end;
  405. procedure tsymlist.resolve;
  406. var
  407. hp : psymlistitem;
  408. begin
  409. def:=tdef(defderef.resolve);
  410. hp:=firstsym;
  411. while assigned(hp) do
  412. begin
  413. hp^.sym:=tsym(hp^.symderef.resolve);
  414. hp:=hp^.next;
  415. end;
  416. end;
  417. {****************************************************************************
  418. Tderef
  419. ****************************************************************************}
  420. procedure tderef.reset;
  421. begin
  422. len:=0;
  423. end;
  424. procedure tderef.setdata(l:longint;var d);
  425. begin
  426. len:=l;
  427. if l>sizeof(tderefdata) then
  428. internalerror(200306068);
  429. move(d,data,len);
  430. end;
  431. procedure tderef.build(s:tsymtableentry);
  432. function is_child(currdef,ownerdef:tdef):boolean;
  433. begin
  434. while assigned(currdef) and
  435. (currdef<>ownerdef) do
  436. currdef:=currdef.getparentdef;
  437. result:=assigned(currdef);
  438. end;
  439. procedure addowner(s:tsymtableentry);
  440. begin
  441. if not assigned(s.owner) then
  442. internalerror(200306063);
  443. case s.owner.symtabletype of
  444. globalsymtable :
  445. begin
  446. if s.owner.unitid=0 then
  447. begin
  448. data[len]:=ord(deref_aktglobal);
  449. inc(len);
  450. end
  451. else
  452. begin
  453. { check if the unit is available in the uses
  454. clause, else it's an error }
  455. if s.owner.unitid=$ffff then
  456. internalerror(200306063);
  457. data[len]:=ord(deref_unit);
  458. data[len+1]:=s.owner.unitid shr 8;
  459. data[len+2]:=s.owner.unitid and $ff;
  460. inc(len,3);
  461. end;
  462. end;
  463. staticsymtable :
  464. begin
  465. { only references to the current static symtable are allowed }
  466. if s.owner<>aktstaticsymtable then
  467. internalerror(200306233);
  468. data[len]:=ord(deref_aktstatic);
  469. inc(len);
  470. end;
  471. localsymtable :
  472. begin
  473. addowner(s.owner.defowner);
  474. data[len]:=ord(deref_def);
  475. data[len+1]:=s.owner.defowner.indexnr shr 8;
  476. data[len+2]:=s.owner.defowner.indexnr and $ff;
  477. data[len+3]:=ord(deref_local);
  478. inc(len,4);
  479. end;
  480. parasymtable :
  481. begin
  482. addowner(s.owner.defowner);
  483. data[len]:=ord(deref_def);
  484. data[len+1]:=s.owner.defowner.indexnr shr 8;
  485. data[len+2]:=s.owner.defowner.indexnr and $ff;
  486. data[len+3]:=ord(deref_para);
  487. inc(len,4);
  488. end;
  489. objectsymtable,
  490. recordsymtable :
  491. begin
  492. addowner(s.owner.defowner);
  493. data[len]:=ord(deref_def);
  494. data[len+1]:=s.owner.defowner.indexnr shr 8;
  495. data[len+2]:=s.owner.defowner.indexnr and $ff;
  496. data[len+3]:=ord(deref_record);
  497. inc(len,4);
  498. end;
  499. else
  500. internalerror(200306065);
  501. end;
  502. if len+3>sizeof(tderefdata) then
  503. internalerror(200306062);
  504. end;
  505. procedure addparentobject(currdef,ownerdef:tdef);
  506. var
  507. nextdef : tdef;
  508. begin
  509. if not assigned(currdef) then
  510. internalerror(200306185);
  511. { Already handled by derefaktrecordindex }
  512. if currdef=ownerdef then
  513. internalerror(200306188);
  514. { Generate a direct reference to the top parent
  515. class available in the current unit, this is required because
  516. the parent class is maybe not resolved yet and therefor
  517. has the childof value not available yet }
  518. while (currdef<>ownerdef) do
  519. begin
  520. nextdef:=currdef.getparentdef;
  521. { objects are only allowed in globalsymtable,staticsymtable this check is
  522. needed because we need the unitid }
  523. if not(nextdef.owner.symtabletype in [globalsymtable,staticsymtable]) then
  524. internalerror(200306187);
  525. { Next parent is in a different unit, then stop }
  526. if nextdef.owner.unitid<>0 then
  527. break;
  528. currdef:=nextdef;
  529. end;
  530. { Add reference where to start the parent lookup }
  531. if currdef=aktrecordsymtable.defowner then
  532. begin
  533. data[len]:=ord(deref_aktrecord);
  534. inc(len);
  535. end
  536. else
  537. begin
  538. if currdef.owner.symtabletype=globalsymtable then
  539. data[len]:=ord(deref_aktglobal)
  540. else
  541. data[len]:=ord(deref_aktstatic);
  542. data[len+1]:=ord(deref_def);
  543. data[len+2]:=currdef.indexnr shr 8;
  544. data[len+3]:=currdef.indexnr and $ff;
  545. data[len+4]:=ord(deref_record);
  546. inc(len,5);
  547. end;
  548. { When the current found parent in this module is not the owner we
  549. add derefs for the parent classes not available in this unit }
  550. while (currdef<>ownerdef) do
  551. begin
  552. data[len]:=ord(deref_parent_object);
  553. inc(len);
  554. currdef:=currdef.getparentdef;
  555. { It should be valid as it is checked by is_child }
  556. if not assigned(currdef) then
  557. internalerror(200306186);
  558. end;
  559. end;
  560. begin
  561. len:=0;
  562. if assigned(s) then
  563. begin
  564. { Static symtable of current unit ? }
  565. if (s.owner.symtabletype=staticsymtable) and
  566. (s.owner.unitid=0) then
  567. begin
  568. data[len]:=ord(deref_aktstatic);
  569. inc(len);
  570. end
  571. { Global symtable of current unit ? }
  572. else if (s.owner.symtabletype=globalsymtable) and
  573. (s.owner.unitid=0) then
  574. begin
  575. data[len]:=ord(deref_aktglobal);
  576. inc(len);
  577. end
  578. { Current record/object symtable ? }
  579. else if (s.owner=aktrecordsymtable) then
  580. begin
  581. data[len]:=ord(deref_aktrecord);
  582. inc(len);
  583. end
  584. { Current local symtable ? }
  585. else if (s.owner=aktlocalsymtable) then
  586. begin
  587. data[len]:=ord(deref_aktlocal);
  588. inc(len);
  589. end
  590. { Current para symtable ? }
  591. else if (s.owner=aktparasymtable) then
  592. begin
  593. data[len]:=ord(deref_aktpara);
  594. inc(len);
  595. end
  596. { Parent class? }
  597. else if assigned(aktrecordsymtable) and
  598. (aktrecordsymtable.symtabletype=objectsymtable) and
  599. (s.owner.symtabletype=objectsymtable) and
  600. is_child(tdef(aktrecordsymtable.defowner),tdef(s.owner.defowner)) then
  601. begin
  602. addparentobject(tdef(aktrecordsymtable.defowner),tdef(s.owner.defowner));
  603. end
  604. else
  605. { Default, start by building from unit symtable }
  606. begin
  607. addowner(s);
  608. end;
  609. { Add index of the symbol/def }
  610. if s is tsym then
  611. data[len]:=ord(deref_sym)
  612. else
  613. data[len]:=ord(deref_def);
  614. data[len+1]:=s.indexnr shr 8;
  615. data[len+2]:=s.indexnr and $ff;
  616. inc(len,3);
  617. end
  618. else
  619. begin
  620. { nil pointer }
  621. data[len]:=0;
  622. inc(len);
  623. end;
  624. end;
  625. function tderef.resolve:tsymtableentry;
  626. var
  627. pd : tdef;
  628. pm : tmodule;
  629. typ : tdereftype;
  630. st : tsymtable;
  631. idx : word;
  632. i : longint;
  633. begin
  634. result:=nil;
  635. { not initialized }
  636. if len=0 then
  637. internalerror(200306067);
  638. st:=nil;
  639. i:=0;
  640. while (i<len) do
  641. begin
  642. typ:=tdereftype(data[i]);
  643. inc(i);
  644. case typ of
  645. deref_nil :
  646. begin
  647. result:=nil;
  648. { Only allowed when no other deref is available }
  649. if len<>1 then
  650. internalerror(200306232);
  651. end;
  652. deref_sym :
  653. begin
  654. idx:=(data[i] shl 8) or data[i+1];
  655. inc(i,2);
  656. result:=st.getsymnr(idx);
  657. end;
  658. deref_def :
  659. begin
  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. memprocparast:=TMemDebug.create('ProcParaSt');
  745. memprocparast.stop;
  746. memproclocalst:=TMemDebug.create('ProcLocalSt');
  747. memproclocalst.stop;
  748. memprocnodetree:=TMemDebug.create('ProcNodeTree');
  749. memprocnodetree.stop;
  750. finalization
  751. membrowser.free;
  752. memrealnames.free;
  753. memmanglednames.free;
  754. memprocparast.free;
  755. memproclocalst.free;
  756. memprocnodetree.free;
  757. {$endif MEMDEBUG}
  758. end.
  759. {
  760. $Log$
  761. Revision 1.26 2003-06-25 18:31:23 peter
  762. * sym,def resolving partly rewritten to support also parent objects
  763. not directly available through the uses clause
  764. Revision 1.25 2003/06/07 20:26:32 peter
  765. * re-resolving added instead of reloading from ppu
  766. * tderef object added to store deref info for resolving
  767. Revision 1.24 2002/12/29 18:26:31 peter
  768. * also use gettypename for procdef always
  769. Revision 1.23 2002/12/29 14:57:50 peter
  770. * unit loading changed to first register units and load them
  771. afterwards. This is needed to support uses xxx in yyy correctly
  772. * unit dependency check fixed
  773. Revision 1.22 2002/09/05 19:29:46 peter
  774. * memdebug enhancements
  775. Revision 1.21 2002/08/18 20:06:28 peter
  776. * inlining is now also allowed in interface
  777. * renamed write/load to ppuwrite/ppuload
  778. * tnode storing in ppu
  779. * nld,ncon,nbas are already updated for storing in ppu
  780. Revision 1.20 2002/08/11 13:24:16 peter
  781. * saving of asmsymbols in ppu supported
  782. * asmsymbollist global is removed and moved into a new class
  783. tasmlibrarydata that will hold the info of a .a file which
  784. corresponds with a single module. Added librarydata to tmodule
  785. to keep the library info stored for the module. In the future the
  786. objectfiles will also be stored to the tasmlibrarydata class
  787. * all getlabel/newasmsymbol and friends are moved to the new class
  788. Revision 1.19 2002/07/01 18:46:29 peter
  789. * internal linker
  790. * reorganized aasm layer
  791. Revision 1.18 2002/05/18 13:34:21 peter
  792. * readded missing revisions
  793. Revision 1.17 2002/05/16 19:46:45 carl
  794. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  795. + try to fix temp allocation (still in ifdef)
  796. + generic constructor calls
  797. + start of tassembler / tmodulebase class cleanup
  798. Revision 1.15 2002/05/12 16:53:15 peter
  799. * moved entry and exitcode to ncgutil and cgobj
  800. * foreach gets extra argument for passing local data to the
  801. iterator function
  802. * -CR checks also class typecasts at runtime by changing them
  803. into as
  804. * fixed compiler to cycle with the -CR option
  805. * fixed stabs with elf writer, finally the global variables can
  806. be watched
  807. * removed a lot of routines from cga unit and replaced them by
  808. calls to cgobj
  809. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  810. u32bit then the other is typecasted also to u32bit without giving
  811. a rangecheck warning/error.
  812. * fixed pascal calling method with reversing also the high tree in
  813. the parast, detected by tcalcst3 test
  814. Revision 1.14 2002/04/19 15:46:04 peter
  815. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  816. in most cases and not written to the ppu
  817. * add mangeledname_prefix() routine to generate the prefix of
  818. manglednames depending on the current procedure, object and module
  819. * removed static procprefix since the mangledname is now build only
  820. on demand from tprocdef.mangledname
  821. }