fmodule.pas 22 KB

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