fmodule.pas 22 KB

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