symtype.pas 22 KB

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