fmodule.pas 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  4. This unit implements the first loading and searching of the modules
  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 fmodule;
  19. {$i fpcdefs.inc}
  20. {$ifdef go32v2}
  21. {$define shortasmprefix}
  22. {$endif}
  23. {$ifdef tos}
  24. {$define shortasmprefix}
  25. {$endif}
  26. {$ifdef OS2}
  27. { Allthough OS/2 supports long filenames I play it safe and
  28. use 8.3 filenames, because this allows the compiler to run
  29. on a FAT partition. (DM) }
  30. {$define shortasmprefix}
  31. {$endif}
  32. interface
  33. uses
  34. cutils,cclasses,
  35. globals,finput,
  36. symbase,symsym,aasmbase;
  37. type
  38. trecompile_reason = (rr_unknown,
  39. rr_noppu,rr_sourcenewer,rr_build,rr_crcchanged
  40. );
  41. TExternalsItem=class(TLinkedListItem)
  42. public
  43. found : longbool;
  44. data : pstring;
  45. constructor Create(const s:string);
  46. Destructor Destroy;override;
  47. end;
  48. tlinkcontaineritem=class(tlinkedlistitem)
  49. public
  50. data : pstring;
  51. needlink : cardinal;
  52. constructor Create(const s:string;m:cardinal);
  53. destructor Destroy;override;
  54. end;
  55. tlinkcontainer=class(tlinkedlist)
  56. procedure add(const s : string;m:cardinal);
  57. function get(var m:cardinal) : string;
  58. function getusemask(mask:cardinal) : string;
  59. function find(const s:string):boolean;
  60. end;
  61. tmodule = class;
  62. tused_unit = class;
  63. tunitmaprec = record
  64. u : tmodule;
  65. unitsym : tunitsym;
  66. end;
  67. punitmap = ^tunitmaprec;
  68. tmodule = class(tmodulebase)
  69. do_reload, { force reloading of the unit }
  70. do_compile, { need to compile the sources }
  71. sources_avail, { if all sources are reachable }
  72. interface_compiled, { if the interface section has been parsed/compiled/loaded }
  73. is_stab_written,
  74. is_reset,
  75. is_unit,
  76. in_interface, { processing the implementation part? }
  77. in_global : boolean; { allow global settings }
  78. recompile_reason : trecompile_reason; { the reason why the unit should be recompiled }
  79. crc,
  80. interface_crc : cardinal;
  81. flags : cardinal; { the PPU flags }
  82. islibrary : boolean; { if it is a library (win32 dll) }
  83. map : punitmap; { mapping of all used units }
  84. mapsize : longint; { number of units in the map }
  85. derefdataintflen : longint;
  86. derefdata : tdynamicarray;
  87. globalsymtable, { pointer to the global symtable of this unit }
  88. localsymtable : tsymtable;{ pointer to the local symtable of this unit }
  89. scanner : pointer; { scanner object used }
  90. procinfo : pointer; { current procedure being compiled }
  91. loaded_from : tmodule;
  92. uses_imports : boolean; { Set if the module imports from DLL's.}
  93. imports : tlinkedlist;
  94. _exports : tlinkedlist;
  95. externals : tlinkedlist; {Only for DLL scanners by using Unix-style $LINKLIB }
  96. resourcefiles : tstringlist;
  97. linkunitofiles,
  98. linkunitstaticlibs,
  99. linkunitsharedlibs,
  100. linkotherofiles, { objects,libs loaded from the source }
  101. linkothersharedlibs, { using $L or $LINKLIB or import lib (for linux) }
  102. linkotherstaticlibs : tlinkcontainer;
  103. used_units : tlinkedlist;
  104. dependent_units : tlinkedlist;
  105. localunitsearchpath, { local searchpaths }
  106. localobjectsearchpath,
  107. localincludesearchpath,
  108. locallibrarysearchpath : TSearchPathList;
  109. asmprefix : pstring; { prefix for the smartlink asmfiles }
  110. librarydata : tasmlibrarydata; { librarydata for this module }
  111. {create creates a new module which name is stored in 's'. LoadedFrom
  112. points to the module calling it. It is nil for the first compiled
  113. module. This allow inheritence of all path lists. MUST pay attention
  114. to that when creating link.res!!!!(mazen)}
  115. constructor create(LoadedFrom:TModule;const s:string;_is_unit:boolean);
  116. destructor destroy;override;
  117. procedure reset;virtual;
  118. procedure adddependency(callermodule:tmodule);
  119. procedure flagdependent(callermodule:tmodule);
  120. function addusedunit(hp:tmodule;inuses:boolean;usym:tunitsym):tused_unit;
  121. procedure numberunits;
  122. procedure allunitsused;
  123. procedure setmodulename(const s:string);
  124. end;
  125. tused_unit = class(tlinkedlistitem)
  126. checksum,
  127. interface_checksum : cardinal;
  128. in_uses,
  129. in_interface : boolean;
  130. u : tmodule;
  131. unitsym : tunitsym;
  132. constructor create(_u : tmodule;intface,inuses:boolean;usym:tunitsym);
  133. end;
  134. tdependent_unit = class(tlinkedlistitem)
  135. u : tmodule;
  136. constructor create(_u : tmodule);
  137. end;
  138. var
  139. main_module : tmodule; { Main module of the program }
  140. current_module : tmodule; { Current module which is compiled or loaded }
  141. compiled_module : tmodule; { Current module which is compiled }
  142. usedunits : tlinkedlist; { Used units for this program }
  143. loaded_units : tlinkedlist; { All loaded units }
  144. SmartLinkOFiles : TStringList; { List of .o files which are generated,
  145. used to delete them after linking }
  146. function get_source_file(moduleindex,fileindex : longint) : tinputfile;
  147. implementation
  148. uses
  149. {$IFDEF USE_SYSUTILS}
  150. SysUtils,
  151. GlobType,
  152. {$ELSE USE_SYSUTILS}
  153. dos,
  154. {$ENDIF USE_SYSUTILS}
  155. verbose,systems,
  156. scanner,
  157. procinfo;
  158. {*****************************************************************************
  159. Global Functions
  160. *****************************************************************************}
  161. function get_source_file(moduleindex,fileindex : longint) : tinputfile;
  162. var
  163. hp : tmodule;
  164. begin
  165. hp:=tmodule(loaded_units.first);
  166. while assigned(hp) and (hp.unit_index<>moduleindex) do
  167. hp:=tmodule(hp.next);
  168. if assigned(hp) then
  169. get_source_file:=hp.sourcefiles.get_file(fileindex)
  170. else
  171. get_source_file:=nil;
  172. end;
  173. {****************************************************************************
  174. TLinkContainerItem
  175. ****************************************************************************}
  176. constructor TLinkContainerItem.Create(const s:string;m:cardinal);
  177. begin
  178. inherited Create;
  179. data:=stringdup(s);
  180. needlink:=m;
  181. end;
  182. destructor TLinkContainerItem.Destroy;
  183. begin
  184. stringdispose(data);
  185. end;
  186. {****************************************************************************
  187. TLinkContainer
  188. ****************************************************************************}
  189. procedure TLinkContainer.add(const s : string;m:cardinal);
  190. begin
  191. inherited concat(TLinkContainerItem.Create(s,m));
  192. end;
  193. function TLinkContainer.get(var m:cardinal) : string;
  194. var
  195. p : tlinkcontaineritem;
  196. begin
  197. p:=tlinkcontaineritem(inherited getfirst);
  198. if p=nil then
  199. begin
  200. get:='';
  201. m:=0;
  202. end
  203. else
  204. begin
  205. get:=p.data^;
  206. m:=p.needlink;
  207. p.free;
  208. end;
  209. end;
  210. function TLinkContainer.getusemask(mask:cardinal) : string;
  211. var
  212. p : tlinkcontaineritem;
  213. found : boolean;
  214. begin
  215. found:=false;
  216. repeat
  217. p:=tlinkcontaineritem(inherited getfirst);
  218. if p=nil then
  219. begin
  220. getusemask:='';
  221. exit;
  222. end;
  223. getusemask:=p.data^;
  224. found:=(p.needlink and mask)<>0;
  225. p.free;
  226. until found;
  227. end;
  228. function TLinkContainer.find(const s:string):boolean;
  229. var
  230. newnode : tlinkcontaineritem;
  231. begin
  232. find:=false;
  233. newnode:=tlinkcontaineritem(First);
  234. while assigned(newnode) do
  235. begin
  236. if newnode.data^=s then
  237. begin
  238. find:=true;
  239. exit;
  240. end;
  241. newnode:=tlinkcontaineritem(newnode.next);
  242. end;
  243. end;
  244. {****************************************************************************
  245. TExternalsItem
  246. ****************************************************************************}
  247. constructor tExternalsItem.Create(const s:string);
  248. begin
  249. inherited Create;
  250. found:=false;
  251. data:=stringdup(s);
  252. end;
  253. destructor tExternalsItem.Destroy;
  254. begin
  255. stringdispose(data);
  256. inherited;
  257. end;
  258. {****************************************************************************
  259. TUSED_UNIT
  260. ****************************************************************************}
  261. constructor tused_unit.create(_u : tmodule;intface,inuses:boolean;usym:tunitsym);
  262. begin
  263. u:=_u;
  264. in_interface:=intface;
  265. in_uses:=inuses;
  266. unitsym:=usym;
  267. if _u.state=ms_compiled then
  268. begin
  269. checksum:=u.crc;
  270. interface_checksum:=u.interface_crc;
  271. end
  272. else
  273. begin
  274. checksum:=0;
  275. interface_checksum:=0;
  276. end;
  277. end;
  278. {****************************************************************************
  279. TDENPENDENT_UNIT
  280. ****************************************************************************}
  281. constructor tdependent_unit.create(_u : tmodule);
  282. begin
  283. u:=_u;
  284. end;
  285. {****************************************************************************
  286. TMODULE
  287. ****************************************************************************}
  288. constructor tmodule.create(LoadedFrom:TModule;const s:string;_is_unit:boolean);
  289. var
  290. p : dirstr;
  291. n : namestr;
  292. e : extstr;
  293. begin
  294. {$IFDEF USE_SYSUTILS}
  295. p := SplitPath(s);
  296. n := SplitName(s);
  297. e := SplitExtension(s);
  298. {$ELSE USE_SYSUTILS}
  299. FSplit(s,p,n,e);
  300. {$ENDIF USE_SYSUTILS}
  301. { Programs have the name 'Program' to don't conflict with dup id's }
  302. if _is_unit then
  303. inherited create(n)
  304. else
  305. inherited create('Program');
  306. mainsource:=stringdup(s);
  307. { Dos has the famous 8.3 limit :( }
  308. {$ifdef shortasmprefix}
  309. asmprefix:=stringdup(FixFileName('as'));
  310. {$else}
  311. asmprefix:=stringdup(FixFileName(n));
  312. {$endif}
  313. setfilename(p+n,true);
  314. localunitsearchpath:=TSearchPathList.Create;
  315. localobjectsearchpath:=TSearchPathList.Create;
  316. localincludesearchpath:=TSearchPathList.Create;
  317. locallibrarysearchpath:=TSearchPathList.Create;
  318. used_units:=TLinkedList.Create;
  319. dependent_units:=TLinkedList.Create;
  320. resourcefiles:=TStringList.Create;
  321. linkunitofiles:=TLinkContainer.Create;
  322. linkunitstaticlibs:=TLinkContainer.Create;
  323. linkunitsharedlibs:=TLinkContainer.Create;
  324. linkotherofiles:=TLinkContainer.Create;
  325. linkotherstaticlibs:=TLinkContainer.Create;
  326. linkothersharedlibs:=TLinkContainer.Create;
  327. crc:=0;
  328. interface_crc:=0;
  329. flags:=0;
  330. scanner:=nil;
  331. map:=nil;
  332. mapsize:=0;
  333. derefdata:=TDynamicArray.Create(1024);
  334. derefdataintflen:=0;
  335. globalsymtable:=nil;
  336. localsymtable:=nil;
  337. loaded_from:=LoadedFrom;
  338. do_reload:=false;
  339. do_compile:=false;
  340. sources_avail:=true;
  341. recompile_reason:=rr_unknown;
  342. in_interface:=true;
  343. in_global:=true;
  344. is_unit:=_is_unit;
  345. islibrary:=false;
  346. is_stab_written:=false;
  347. is_reset:=false;
  348. uses_imports:=false;
  349. imports:=TLinkedList.Create;
  350. _exports:=TLinkedList.Create;
  351. externals:=TLinkedList.Create;
  352. librarydata:=tasmlibrarydata.create(realmodulename^);
  353. end;
  354. destructor tmodule.Destroy;
  355. var
  356. {$ifdef MEMDEBUG}
  357. d : tmemdebug;
  358. {$endif}
  359. hpi : tprocinfo;
  360. begin
  361. dispose(map);
  362. if assigned(imports) then
  363. imports.free;
  364. if assigned(_exports) then
  365. _exports.free;
  366. if assigned(externals) then
  367. externals.free;
  368. if assigned(scanner) then
  369. begin
  370. { also update current_scanner if it was pointing
  371. to this module }
  372. if current_scanner=tscannerfile(scanner) then
  373. current_scanner:=nil;
  374. tscannerfile(scanner).free;
  375. end;
  376. if assigned(procinfo) then
  377. begin
  378. if current_procinfo=tprocinfo(procinfo) then
  379. current_procinfo:=nil;
  380. { release procinfo tree }
  381. while assigned(procinfo) do
  382. begin
  383. hpi:=tprocinfo(procinfo).parent;
  384. tprocinfo(procinfo).free;
  385. procinfo:=hpi;
  386. end;
  387. end;
  388. used_units.free;
  389. dependent_units.free;
  390. resourcefiles.Free;
  391. linkunitofiles.Free;
  392. linkunitstaticlibs.Free;
  393. linkunitsharedlibs.Free;
  394. linkotherofiles.Free;
  395. linkotherstaticlibs.Free;
  396. linkothersharedlibs.Free;
  397. stringdispose(objfilename);
  398. stringdispose(newfilename);
  399. stringdispose(ppufilename);
  400. stringdispose(staticlibfilename);
  401. stringdispose(sharedlibfilename);
  402. stringdispose(exefilename);
  403. stringdispose(outputpath);
  404. stringdispose(path);
  405. stringdispose(realmodulename);
  406. stringdispose(mainsource);
  407. stringdispose(asmprefix);
  408. localunitsearchpath.Free;
  409. localobjectsearchpath.free;
  410. localincludesearchpath.free;
  411. locallibrarysearchpath.free;
  412. {$ifdef MEMDEBUG}
  413. d:=tmemdebug.create(modulename^+' - symtable');
  414. {$endif}
  415. derefdata.free;
  416. if assigned(globalsymtable) then
  417. globalsymtable.free;
  418. if assigned(localsymtable) then
  419. localsymtable.free;
  420. {$ifdef MEMDEBUG}
  421. d.free;
  422. {$endif}
  423. {$ifdef MEMDEBUG}
  424. d:=tmemdebug.create(modulename^+' - librarydata');
  425. {$endif}
  426. librarydata.free;
  427. {$ifdef MEMDEBUG}
  428. d.free;
  429. {$endif}
  430. stringdispose(modulename);
  431. inherited Destroy;
  432. end;
  433. procedure tmodule.reset;
  434. var
  435. hpi : tprocinfo;
  436. begin
  437. if assigned(scanner) then
  438. begin
  439. { also update current_scanner if it was pointing
  440. to this module }
  441. if current_scanner=tscannerfile(scanner) then
  442. current_scanner:=nil;
  443. tscannerfile(scanner).free;
  444. scanner:=nil;
  445. end;
  446. if assigned(procinfo) then
  447. begin
  448. if current_procinfo=tprocinfo(procinfo) then
  449. current_procinfo:=nil;
  450. { release procinfo tree }
  451. while assigned(procinfo) do
  452. begin
  453. hpi:=tprocinfo(procinfo).parent;
  454. tprocinfo(procinfo).free;
  455. procinfo:=hpi;
  456. end;
  457. end;
  458. if assigned(globalsymtable) then
  459. begin
  460. globalsymtable.free;
  461. globalsymtable:=nil;
  462. end;
  463. if assigned(localsymtable) then
  464. begin
  465. localsymtable.free;
  466. localsymtable:=nil;
  467. end;
  468. derefdata.free;
  469. derefdata:=TDynamicArray.Create(1024);
  470. if assigned(map) then
  471. begin
  472. freemem(map);
  473. map:=nil;
  474. end;
  475. derefdataintflen:=0;
  476. mapsize:=0;
  477. sourcefiles.free;
  478. sourcefiles:=tinputfilemanager.create;
  479. librarydata.free;
  480. librarydata:=tasmlibrarydata.create(realmodulename^);
  481. imports.free;
  482. imports:=tlinkedlist.create;
  483. _exports.free;
  484. _exports:=tlinkedlist.create;
  485. externals.free;
  486. externals:=tlinkedlist.create;
  487. used_units.free;
  488. used_units:=TLinkedList.Create;
  489. dependent_units.free;
  490. dependent_units:=TLinkedList.Create;
  491. resourcefiles.Free;
  492. resourcefiles:=TStringList.Create;
  493. linkunitofiles.Free;
  494. linkunitofiles:=TLinkContainer.Create;
  495. linkunitstaticlibs.Free;
  496. linkunitstaticlibs:=TLinkContainer.Create;
  497. linkunitsharedlibs.Free;
  498. linkunitsharedlibs:=TLinkContainer.Create;
  499. linkotherofiles.Free;
  500. linkotherofiles:=TLinkContainer.Create;
  501. linkotherstaticlibs.Free;
  502. linkotherstaticlibs:=TLinkContainer.Create;
  503. linkothersharedlibs.Free;
  504. linkothersharedlibs:=TLinkContainer.Create;
  505. uses_imports:=false;
  506. do_compile:=false;
  507. do_reload:=false;
  508. interface_compiled:=false;
  509. in_interface:=true;
  510. in_global:=true;
  511. is_stab_written:=false;
  512. is_reset:=false;
  513. crc:=0;
  514. interface_crc:=0;
  515. flags:=0;
  516. recompile_reason:=rr_unknown;
  517. {
  518. The following fields should not
  519. be reset:
  520. mainsource
  521. state
  522. loaded_from
  523. sources_avail
  524. }
  525. end;
  526. procedure tmodule.adddependency(callermodule:tmodule);
  527. begin
  528. { This is not needed for programs }
  529. if not callermodule.is_unit then
  530. exit;
  531. Message2(unit_u_add_depend_to,callermodule.modulename^,modulename^);
  532. dependent_units.concat(tdependent_unit.create(callermodule));
  533. end;
  534. procedure tmodule.flagdependent(callermodule:tmodule);
  535. var
  536. pm : tdependent_unit;
  537. begin
  538. { flag all units that depend on this unit for reloading }
  539. pm:=tdependent_unit(current_module.dependent_units.first);
  540. while assigned(pm) do
  541. begin
  542. { We do not have to reload the unit that wants to load
  543. this unit, unless this unit is already compiled during
  544. the loading }
  545. if (pm.u=callermodule) and
  546. (pm.u.state<>ms_compiled) then
  547. Message1(unit_u_no_reload_is_caller,pm.u.modulename^)
  548. else
  549. if pm.u.state=ms_second_compile then
  550. Message1(unit_u_no_reload_in_second_compile,pm.u.modulename^)
  551. else
  552. begin
  553. pm.u.do_reload:=true;
  554. Message1(unit_u_flag_for_reload,pm.u.modulename^);
  555. end;
  556. pm:=tdependent_unit(pm.next);
  557. end;
  558. end;
  559. function tmodule.addusedunit(hp:tmodule;inuses:boolean;usym:tunitsym):tused_unit;
  560. var
  561. pu : tused_unit;
  562. begin
  563. pu:=tused_unit.create(hp,in_interface,inuses,usym);
  564. used_units.concat(pu);
  565. addusedunit:=pu;
  566. end;
  567. procedure tmodule.numberunits;
  568. var
  569. pu : tused_unit;
  570. hp : tmodule;
  571. i : integer;
  572. begin
  573. { Reset all numbers to -1 }
  574. hp:=tmodule(loaded_units.first);
  575. while assigned(hp) do
  576. begin
  577. if assigned(hp.globalsymtable) then
  578. hp.globalsymtable.unitid:=$ffff;
  579. hp:=tmodule(hp.next);
  580. end;
  581. { Allocate map }
  582. mapsize:=used_units.count+1;
  583. reallocmem(map,mapsize*sizeof(tunitmaprec));
  584. { Our own symtable gets unitid 0, for a program there is
  585. no globalsymtable }
  586. if assigned(globalsymtable) then
  587. globalsymtable.unitid:=0;
  588. map[0].u:=self;
  589. map[0].unitsym:=nil;
  590. { number units and map }
  591. i:=1;
  592. pu:=tused_unit(used_units.first);
  593. while assigned(pu) do
  594. begin
  595. if assigned(pu.u.globalsymtable) then
  596. begin
  597. tsymtable(pu.u.globalsymtable).unitid:=i;
  598. map[i].u:=pu.u;
  599. map[i].unitsym:=pu.unitsym;
  600. inc(i);
  601. end;
  602. pu:=tused_unit(pu.next);
  603. end;
  604. end;
  605. procedure tmodule.allunitsused;
  606. var
  607. i : longint;
  608. begin
  609. for i:=0 to mapsize-1 do
  610. begin
  611. if assigned(map[i].unitsym) and
  612. (map[i].unitsym.refs=0) then
  613. MessagePos2(map[i].unitsym.fileinfo,sym_n_unit_not_used,map[i].u.realmodulename^,realmodulename^);
  614. end;
  615. end;
  616. procedure tmodule.setmodulename(const s:string);
  617. begin
  618. stringdispose(modulename);
  619. stringdispose(realmodulename);
  620. modulename:=stringdup(upper(s));
  621. realmodulename:=stringdup(s);
  622. { also update asmlibrary names }
  623. librarydata.name:=modulename^;
  624. librarydata.realname:=realmodulename^;
  625. end;
  626. end.
  627. {
  628. $Log$
  629. Revision 1.48 2004-10-14 18:16:17 mazen
  630. * USE_SYSUTILS merged successfully : cycles with and without defines
  631. * Need to be optimized in performance
  632. Revision 1.47 2004/10/14 17:30:09 mazen
  633. * use SysUtils unit instead of Dos Unit
  634. Revision 1.46 2004/08/30 20:23:33 peter
  635. * use realmodulename in unit not used msg
  636. Revision 1.45 2004/06/20 08:55:29 florian
  637. * logs truncated
  638. Revision 1.44 2004/03/08 22:07:46 peter
  639. * stabs updates to write stabs for def for all implictly used
  640. units
  641. }