symppu.inc 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. {
  2. $Id$
  3. Copyright (c) 1993-98 by Florian Klaempfl, Pierre Muller
  4. Implementation of the reading of PPU Files for the symtable
  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. const
  19. {$ifdef FPC}
  20. ppubufsize=32768;
  21. {$ELSE}
  22. {$IFDEF USEOVERLAY}
  23. ppubufsize=512;
  24. {$ELSE}
  25. ppubufsize=4096;
  26. {$ENDIF}
  27. {$ENDIF}
  28. { define ORDERSOURCES}
  29. {*****************************************************************************
  30. PPU Writing
  31. *****************************************************************************}
  32. procedure writebyte(b:byte);
  33. begin
  34. current_ppu^.putbyte(b);
  35. end;
  36. procedure writeword(w:word);
  37. begin
  38. current_ppu^.putword(w);
  39. end;
  40. procedure writelong(l:longint);
  41. begin
  42. current_ppu^.putlongint(l);
  43. end;
  44. procedure writereal(d:bestreal);
  45. begin
  46. current_ppu^.putreal(d);
  47. end;
  48. procedure writestring(const s:string);
  49. begin
  50. current_ppu^.putstring(s);
  51. end;
  52. procedure writenormalset(var s); {You cannot pass an array[0..31] of byte!}
  53. begin
  54. current_ppu^.putdata(s,sizeof(tnormalset));
  55. end;
  56. procedure writesmallset(var s);
  57. begin
  58. current_ppu^.putdata(s,4);
  59. end;
  60. { posinfo is not relevant for changes in PPU }
  61. procedure writeposinfo(const p:tfileposinfo);
  62. var
  63. oldcrc : boolean;
  64. begin
  65. oldcrc:=current_ppu^.do_crc;
  66. current_ppu^.do_crc:=false;
  67. current_ppu^.putword(p.fileindex);
  68. current_ppu^.putlongint(p.line);
  69. current_ppu^.putword(p.column);
  70. current_ppu^.do_crc:=oldcrc;
  71. end;
  72. procedure writederef(p : psymtableentry);
  73. begin
  74. if p=nil then
  75. current_ppu^.putbyte(ord(derefnil))
  76. else
  77. begin
  78. { Static symtable ? }
  79. if p^.owner^.symtabletype=staticsymtable then
  80. begin
  81. current_ppu^.putbyte(ord(derefaktstaticindex));
  82. current_ppu^.putword(p^.indexnr);
  83. end
  84. { Local record/object symtable ? }
  85. else if (p^.owner=aktrecordsymtable) then
  86. begin
  87. current_ppu^.putbyte(ord(derefaktrecordindex));
  88. current_ppu^.putword(p^.indexnr);
  89. end
  90. { Local local/para symtable ? }
  91. else if (p^.owner=aktlocalsymtable) then
  92. begin
  93. current_ppu^.putbyte(ord(derefaktlocal));
  94. current_ppu^.putword(p^.indexnr);
  95. end
  96. else
  97. begin
  98. current_ppu^.putbyte(ord(derefindex));
  99. current_ppu^.putword(p^.indexnr);
  100. { Current unit symtable ? }
  101. repeat
  102. if not assigned(p) then
  103. internalerror(556655);
  104. case p^.owner^.symtabletype of
  105. { when writing the pseudo PPU file
  106. to get CRC values the globalsymtable is not yet
  107. a unitsymtable PM }
  108. globalsymtable,
  109. unitsymtable :
  110. begin
  111. { check if the unit is available in the uses
  112. clause, else it's an error }
  113. if p^.owner^.unitid=$ffff then
  114. internalerror(55665566);
  115. current_ppu^.putbyte(ord(derefunit));
  116. current_ppu^.putword(p^.owner^.unitid);
  117. break;
  118. end;
  119. staticsymtable :
  120. begin
  121. current_ppu^.putbyte(ord(derefaktstaticindex));
  122. current_ppu^.putword(p^.indexnr);
  123. break;
  124. end;
  125. localsymtable :
  126. begin
  127. p:=p^.owner^.defowner;
  128. current_ppu^.putbyte(ord(dereflocal));
  129. current_ppu^.putword(p^.indexnr);
  130. end;
  131. parasymtable :
  132. begin
  133. p:=p^.owner^.defowner;
  134. current_ppu^.putbyte(ord(derefpara));
  135. current_ppu^.putword(p^.indexnr);
  136. end;
  137. objectsymtable,
  138. recordsymtable :
  139. begin
  140. p:=p^.owner^.defowner;
  141. current_ppu^.putbyte(ord(derefrecord));
  142. current_ppu^.putword(p^.indexnr);
  143. end;
  144. else
  145. internalerror(556656);
  146. end;
  147. until false;
  148. end;
  149. end;
  150. end;
  151. procedure writedefref(p : pdef);
  152. begin
  153. writederef(p);
  154. end;
  155. procedure writesymref(p : psym);
  156. begin
  157. writederef(p);
  158. end;
  159. procedure writesourcefiles;
  160. var
  161. hp : pinputfile;
  162. {$ifdef ORDERSOURCES}
  163. i,j : longint;
  164. {$endif ORDERSOURCES}
  165. begin
  166. { second write the used source files }
  167. current_ppu^.do_crc:=false;
  168. hp:=current_module^.sourcefiles^.files;
  169. {$ifdef ORDERSOURCES}
  170. { write source files directly in good order }
  171. j:=0;
  172. while assigned(hp) do
  173. begin
  174. inc(j);
  175. hp:=hp^.ref_next;
  176. end;
  177. while j>0 do
  178. begin
  179. hp:=current_module^.sourcefiles^.files;
  180. for i:=1 to j-1 do
  181. hp:=hp^.ref_next;
  182. current_ppu^.putstring(hp^.name^);
  183. dec(j);
  184. end;
  185. {$else not ORDERSOURCES}
  186. while assigned(hp) do
  187. begin
  188. { only name and extension }
  189. current_ppu^.putstring(hp^.name^);
  190. hp:=hp^.ref_next;
  191. end;
  192. {$endif ORDERSOURCES}
  193. current_ppu^.writeentry(ibsourcefiles);
  194. current_ppu^.do_crc:=true;
  195. end;
  196. procedure writeusedmacros;
  197. var
  198. hp : pmacrosym;
  199. i : longint;
  200. begin
  201. { second write the used source files }
  202. current_ppu^.do_crc:=false;
  203. for i:=1 to macros^.symindex^.count do
  204. begin
  205. hp:=pmacrosym(macros^.symindex^.search(i));
  206. { only used or init defined macros are stored }
  207. if hp^.is_used or hp^.defined_at_startup then
  208. begin
  209. current_ppu^.putstring(hp^.name);
  210. current_ppu^.putbyte(byte(hp^.defined_at_startup));
  211. current_ppu^.putbyte(byte(hp^.is_used));
  212. end;
  213. end;
  214. current_ppu^.writeentry(ibusedmacros);
  215. current_ppu^.do_crc:=true;
  216. end;
  217. procedure writeusedunit;
  218. var
  219. hp : pused_unit;
  220. begin
  221. numberunits;
  222. hp:=pused_unit(current_module^.used_units.first);
  223. while assigned(hp) do
  224. begin
  225. { implementation units should not change
  226. the CRC PM }
  227. current_ppu^.do_crc:=hp^.in_interface;
  228. current_ppu^.putstring(hp^.name^);
  229. { the checksum should not affect the crc of this unit ! (PFV) }
  230. current_ppu^.do_crc:=false;
  231. current_ppu^.putlongint(hp^.checksum);
  232. current_ppu^.putlongint(hp^.interface_checksum);
  233. current_ppu^.putbyte(byte(hp^.in_interface));
  234. current_ppu^.do_crc:=true;
  235. hp:=pused_unit(hp^.next);
  236. end;
  237. current_ppu^.do_interface_crc:=true;
  238. current_ppu^.writeentry(ibloadunit);
  239. end;
  240. procedure writelinkcontainer(var p:tlinkcontainer;id:byte;strippath:boolean);
  241. var
  242. hcontainer : tlinkcontainer;
  243. s : string;
  244. mask : longint;
  245. begin
  246. hcontainer.init;
  247. while not p.empty do
  248. begin
  249. s:=p.get(mask);
  250. if strippath then
  251. current_ppu^.putstring(SplitFileName(s))
  252. else
  253. current_ppu^.putstring(s);
  254. current_ppu^.putlongint(mask);
  255. hcontainer.insert(s,mask);
  256. end;
  257. current_ppu^.writeentry(id);
  258. p:=hcontainer;
  259. end;
  260. procedure writeunitas(const s : string;unittable : punitsymtable;only_crc : boolean);
  261. begin
  262. Message1(unit_u_ppu_write,s);
  263. { create unit flags }
  264. with Current_Module^ do
  265. begin
  266. {$ifdef GDB}
  267. if cs_gdb_dbx in aktglobalswitches then
  268. flags:=flags or uf_has_dbx;
  269. {$endif GDB}
  270. if target_os.endian=endian_big then
  271. flags:=flags or uf_big_endian;
  272. if cs_browser in aktmoduleswitches then
  273. flags:=flags or uf_has_browser;
  274. if cs_local_browser in aktmoduleswitches then
  275. flags:=flags or uf_local_browser;
  276. end;
  277. {$ifdef Test_Double_checksum_write}
  278. If only_crc then
  279. Assign(CRCFile,s+'.INT')
  280. else
  281. Assign(CRCFile,s+'.IMP');
  282. Rewrite(CRCFile);
  283. {$endif def Test_Double_checksum_write}
  284. { open ppufile }
  285. current_ppu:=new(pppufile,init(s));
  286. current_ppu^.crc_only:=only_crc;
  287. if not current_ppu^.create then
  288. Message(unit_f_ppu_cannot_write);
  289. {$ifdef Test_Double_checksum}
  290. if only_crc then
  291. begin
  292. new(current_ppu^.crc_test);
  293. new(current_ppu^.crc_test2);
  294. end
  295. else
  296. begin
  297. current_ppu^.crc_test:=Current_Module^.crc_array;
  298. current_ppu^.crc_index:=Current_Module^.crc_size;
  299. current_ppu^.crc_test2:=Current_Module^.crc_array2;
  300. current_ppu^.crc_index2:=Current_Module^.crc_size2;
  301. end;
  302. {$endif def Test_Double_checksum}
  303. current_ppu^.change_endian:=source_os.endian<>target_os.endian;
  304. { write symbols and definitions }
  305. unittable^.writeasunit;
  306. { flush to be sure }
  307. current_ppu^.flush;
  308. { create and write header }
  309. current_ppu^.header.size:=current_ppu^.size;
  310. current_ppu^.header.checksum:=current_ppu^.crc;
  311. current_ppu^.header.interface_checksum:=current_ppu^.interface_crc;
  312. current_ppu^.header.compiler:=wordversion;
  313. current_ppu^.header.cpu:=word(target_cpu);
  314. current_ppu^.header.target:=word(target_info.target);
  315. current_ppu^.header.flags:=current_module^.flags;
  316. If not only_crc then
  317. current_ppu^.writeheader;
  318. { save crc in current_module also }
  319. current_module^.crc:=current_ppu^.crc;
  320. current_module^.interface_crc:=current_ppu^.interface_crc;
  321. if only_crc then
  322. begin
  323. {$ifdef Test_Double_checksum}
  324. Current_Module^.crc_array:=current_ppu^.crc_test;
  325. current_ppu^.crc_test:=nil;
  326. Current_Module^.crc_size:=current_ppu^.crc_index2;
  327. Current_Module^.crc_array2:=current_ppu^.crc_test2;
  328. current_ppu^.crc_test2:=nil;
  329. Current_Module^.crc_size2:=current_ppu^.crc_index2;
  330. {$endif def Test_Double_checksum}
  331. closecurrentppu;
  332. end;
  333. {$ifdef Test_Double_checksum_write}
  334. close(CRCFile);
  335. {$endif Test_Double_checksum_write}
  336. end;
  337. procedure closecurrentppu;
  338. begin
  339. {$ifdef Test_Double_checksum}
  340. if assigned(current_ppu^.crc_test) then
  341. dispose(current_ppu^.crc_test);
  342. if assigned(current_ppu^.crc_test2) then
  343. dispose(current_ppu^.crc_test2);
  344. {$endif Test_Double_checksum}
  345. { close }
  346. current_ppu^.close;
  347. dispose(current_ppu,done);
  348. current_ppu:=nil;
  349. end;
  350. {*****************************************************************************
  351. PPU Reading
  352. *****************************************************************************}
  353. function readbyte:byte;
  354. begin
  355. readbyte:=current_ppu^.getbyte;
  356. if current_ppu^.error then
  357. Message(unit_f_ppu_read_error);
  358. end;
  359. function readword:word;
  360. begin
  361. readword:=current_ppu^.getword;
  362. if current_ppu^.error then
  363. Message(unit_f_ppu_read_error);
  364. end;
  365. function readlong:longint;
  366. begin
  367. readlong:=current_ppu^.getlongint;
  368. if current_ppu^.error then
  369. Message(unit_f_ppu_read_error);
  370. end;
  371. function readreal : bestreal;
  372. begin
  373. readreal:=current_ppu^.getreal;
  374. if current_ppu^.error then
  375. Message(unit_f_ppu_read_error);
  376. end;
  377. function readstring : string;
  378. begin
  379. readstring:=current_ppu^.getstring;
  380. if current_ppu^.error then
  381. Message(unit_f_ppu_read_error);
  382. end;
  383. procedure readnormalset(var s); {You cannot pass an array [0..31] of byte.}
  384. begin
  385. current_ppu^.getdata(s,sizeof(tnormalset));
  386. if current_ppu^.error then
  387. Message(unit_f_ppu_read_error);
  388. end;
  389. procedure readsmallset(var s);
  390. begin
  391. current_ppu^.getdata(s,4);
  392. if current_ppu^.error then
  393. Message(unit_f_ppu_read_error);
  394. end;
  395. procedure readposinfo(var p:tfileposinfo);
  396. begin
  397. p.fileindex:=current_ppu^.getword;
  398. p.line:=current_ppu^.getlongint;
  399. p.column:=current_ppu^.getword;
  400. end;
  401. function readderef : pderef;
  402. var
  403. hp,p : pderef;
  404. b : tdereftype;
  405. begin
  406. p:=nil;
  407. repeat
  408. hp:=p;
  409. b:=tdereftype(current_ppu^.getbyte);
  410. case b of
  411. derefnil :
  412. break;
  413. derefunit,
  414. derefaktrecordindex,
  415. derefaktlocal,
  416. derefaktstaticindex :
  417. begin
  418. new(p,init(b,current_ppu^.getword));
  419. p^.next:=hp;
  420. break;
  421. end;
  422. derefindex,
  423. dereflocal,
  424. derefpara,
  425. derefrecord :
  426. begin
  427. new(p,init(b,current_ppu^.getword));
  428. p^.next:=hp;
  429. end;
  430. end;
  431. until false;
  432. readderef:=p;
  433. end;
  434. function readdefref : pdef;
  435. begin
  436. readdefref:=pdef(readderef);
  437. end;
  438. function readsymref : psym;
  439. begin
  440. readsymref:=psym(readderef);
  441. end;
  442. procedure readusedmacros;
  443. var
  444. hs : string;
  445. mac : pmacrosym;
  446. was_defined_at_startup,
  447. was_used : boolean;
  448. begin
  449. while not current_ppu^.endofentry do
  450. begin
  451. hs:=current_ppu^.getstring;
  452. was_defined_at_startup:=boolean(current_ppu^.getbyte);
  453. was_used:=boolean(current_ppu^.getbyte);
  454. mac:=pmacrosym(macros^.search(hs));
  455. if assigned(mac) then
  456. begin
  457. {$ifndef EXTDEBUG}
  458. { if we don't have the sources why tell }
  459. if current_module^.sources_avail then
  460. {$endif ndef EXTDEBUG}
  461. if not was_defined_at_startup and was_used and
  462. mac^.defined_at_startup then
  463. Comment(V_Hint,'Conditional '+hs+' was not set at startup '+
  464. 'in last compilation of '+current_module^.mainsource^);
  465. end
  466. else { not assigned }
  467. if was_defined_at_startup and was_used then
  468. Comment(V_Hint,'Conditional '+hs+' was set at startup '+
  469. 'in last compilation of '+current_module^.mainsource^);
  470. end;
  471. end;
  472. procedure readsourcefiles;
  473. var
  474. temp,hs : string;
  475. {$ifdef ORDERSOURCES}
  476. main_dir : string;
  477. {$endif ORDERSOURCES}
  478. incfile_found,
  479. main_found,
  480. is_main : boolean;
  481. ppufiletime,
  482. source_time : longint;
  483. hp : pinputfile;
  484. begin
  485. ppufiletime:=getnamedfiletime(current_module^.ppufilename^);
  486. current_module^.sources_avail:=true;
  487. {$ifdef ORDERSOURCES}
  488. is_main:=true;
  489. main_dir:='';
  490. {$endif ORDERSOURCES}
  491. while not current_ppu^.endofentry do
  492. begin
  493. hs:=current_ppu^.getstring;
  494. {$ifndef ORDERSOURCES}
  495. is_main:=current_ppu^.endofentry;
  496. {$endif ORDERSOURCES}
  497. temp:='';
  498. if (current_module^.flags and uf_in_library)<>0 then
  499. begin
  500. current_module^.sources_avail:=false;
  501. temp:=' library';
  502. end
  503. else if pos('Macro ',hs)=1 then
  504. begin
  505. { we don't want to find this file }
  506. { but there is a problem with file indexing !! }
  507. temp:='';
  508. end
  509. else
  510. begin
  511. { check the date of the source files }
  512. Source_Time:=GetNamedFileTime(current_module^.path^+hs);
  513. incfile_found:=false;
  514. if Source_Time<>-1 then
  515. hs:=current_module^.path^+hs
  516. {$ifdef ORDERSOURCES}
  517. else if not(is_main) then
  518. begin
  519. Source_Time:=GetNamedFileTime(main_dir+hs);
  520. if Source_Time<>-1 then
  521. hs:=main_dir+hs;
  522. end
  523. {$endif def ORDERSOURCES}
  524. ;
  525. if (Source_Time=-1) then
  526. begin
  527. if is_main then
  528. temp:=unitsearchpath.FindFile(hs,main_found)
  529. else
  530. temp:=includesearchpath.FindFile(hs,incfile_found);
  531. {$ifdef ORDERSOURCES}
  532. if is_main then
  533. begin
  534. stringdispose(current_module^.mainsource);
  535. current_module^.mainsource:=stringdup(hs);
  536. if main_found then
  537. main_dir:=temp;
  538. end;
  539. {$endif ORDERSOURCES}
  540. if incfile_found or main_found then
  541. begin
  542. hs:=temp+hs;
  543. Source_Time:=GetNamedFileTime(hs);
  544. end
  545. end;
  546. if Source_Time=-1 then
  547. begin
  548. current_module^.sources_avail:=false;
  549. temp:=' not found';
  550. end
  551. else
  552. begin
  553. { time newer? But only allow if the file is not searched
  554. in the include path (PFV), else you've problems with
  555. units which use the same includefile names }
  556. if incfile_found then
  557. temp:=' found'
  558. else
  559. begin
  560. temp:=' time '+filetimestring(source_time);
  561. if (source_time>ppufiletime) then
  562. begin
  563. current_module^.do_compile:=true;
  564. current_module^.recompile_reason:=rr_sourcenewer;
  565. temp:=temp+' *'
  566. end;
  567. end;
  568. end;
  569. new(hp,init(hs));
  570. { the indexing is wrong here PM }
  571. current_module^.sourcefiles^.register_file(hp);
  572. end;
  573. Message1(unit_u_ppu_source,hs+temp);
  574. {$ifdef ORDERSOURCES}
  575. is_main:=false;
  576. {$endif ORDERSOURCES}
  577. end;
  578. {$ifndef ORDERSOURCES}
  579. { main source is always the last }
  580. stringdispose(current_module^.mainsource);
  581. current_module^.mainsource:=stringdup(hs);
  582. { the indexing is corrected here PM }
  583. current_module^.sourcefiles^.inverse_register_indexes;
  584. {$endif ORDERSOURCES}
  585. { check if we want to rebuild every unit, only if the sources are
  586. available }
  587. if do_build and current_module^.sources_avail then
  588. begin
  589. current_module^.do_compile:=true;
  590. current_module^.recompile_reason:=rr_build;
  591. end;
  592. end;
  593. procedure readloadunit;
  594. var
  595. hs : string;
  596. intfchecksum,
  597. checksum : longint;
  598. in_interface : boolean;
  599. begin
  600. while not current_ppu^.endofentry do
  601. begin
  602. hs:=current_ppu^.getstring;
  603. checksum:=current_ppu^.getlongint;
  604. intfchecksum:=current_ppu^.getlongint;
  605. in_interface:=(current_ppu^.getbyte<>0);
  606. current_module^.used_units.concat(new(pused_unit,init_to_load(hs,checksum,intfchecksum,in_interface)));
  607. end;
  608. end;
  609. procedure readlinkcontainer(var p:tlinkcontainer);
  610. var
  611. s : string;
  612. m : longint;
  613. begin
  614. while not current_ppu^.endofentry do
  615. begin
  616. s:=current_ppu^.getstring;
  617. m:=current_ppu^.getlongint;
  618. p.insert(s,m);
  619. end;
  620. end;
  621. procedure load_interface;
  622. var
  623. b : byte;
  624. newmodulename : pstring;
  625. begin
  626. { read interface part }
  627. repeat
  628. b:=current_ppu^.readentry;
  629. case b of
  630. ibmodulename :
  631. begin
  632. newmodulename:=stringdup(current_ppu^.getstring);
  633. if newmodulename^<>current_module^.modulename^ then
  634. Message2(unit_f_unit_name_error,current_module^.modulename^,newmodulename^);
  635. stringdispose(current_module^.modulename);
  636. current_module^.modulename:=newmodulename;
  637. end;
  638. ibsourcefiles :
  639. readsourcefiles;
  640. ibusedmacros :
  641. readusedmacros;
  642. ibloadunit :
  643. readloadunit;
  644. iblinkunitofiles :
  645. readlinkcontainer(current_module^.LinkUnitOFiles);
  646. iblinkunitstaticlibs :
  647. readlinkcontainer(current_module^.LinkUnitStaticLibs);
  648. iblinkunitsharedlibs :
  649. readlinkcontainer(current_module^.LinkUnitSharedLibs);
  650. iblinkotherofiles :
  651. readlinkcontainer(current_module^.LinkotherOFiles);
  652. iblinkotherstaticlibs :
  653. readlinkcontainer(current_module^.LinkotherStaticLibs);
  654. iblinkothersharedlibs :
  655. readlinkcontainer(current_module^.LinkotherSharedLibs);
  656. ibendinterface :
  657. break;
  658. else
  659. Message1(unit_f_ppu_invalid_entry,tostr(b));
  660. end;
  661. until false;
  662. end;
  663. {
  664. $Log$
  665. Revision 1.57 1999-11-30 10:40:55 peter
  666. + ttype, tsymlist
  667. Revision 1.56 1999/11/21 01:42:37 pierre
  668. * Nextoverloading ordering fix
  669. Revision 1.55 1999/11/17 17:05:04 pierre
  670. * Notes/hints changes
  671. Revision 1.54 1999/11/12 11:03:50 peter
  672. * searchpaths changed to stringqueue object
  673. Revision 1.53 1999/11/06 14:34:27 peter
  674. * truncated log to 20 revs
  675. Revision 1.52 1999/11/05 17:18:03 pierre
  676. * local browsing works at first level
  677. ie for function defined in interface or implementation
  678. not yet for functions inside other functions
  679. Revision 1.51 1999/09/16 13:27:08 pierre
  680. + error if PPU modulename is different from what is searched
  681. (8+3 limitations!)
  682. + cond ORDERSOURCES to allow recompilation of FP
  683. if symppu.inc is changed (need PPUversion change!)
  684. Revision 1.50 1999/09/12 15:45:11 florian
  685. * tnamedindexobject._name should be never accessed direct! Use the
  686. function name instead
  687. Revision 1.49 1999/09/03 10:54:22 pierre
  688. * message about conditionals changed to Hint
  689. Revision 1.48 1999/08/31 15:47:56 pierre
  690. + startup conditionals stored in PPU file for debug info
  691. Revision 1.47 1999/08/27 10:54:45 pierre
  692. * some code adapted to CRC_only computation
  693. + main file is search in unitspathlist
  694. and triggers do_compile flag
  695. * some changes to get identical CRC vaules after
  696. interface and after implementation
  697. Revision 1.46 1999/08/13 21:33:12 peter
  698. * support for array constructors extended and more error checking
  699. Revision 1.45 1999/08/03 22:03:17 peter
  700. * moved bitmask constants to sets
  701. * some other type/const renamings
  702. Revision 1.44 1999/07/14 21:19:12 florian
  703. + implemented a better error message if a PPU file isn't found as suggested
  704. by Lee John
  705. Revision 1.43 1999/07/03 00:30:00 peter
  706. * new link writing to the ppu, one .ppu is needed for all link types,
  707. static (.o) is now always created also when smartlinking is used
  708. Revision 1.42 1999/06/22 16:24:47 pierre
  709. * local browser stuff corrected
  710. Revision 1.41 1999/05/14 17:52:28 peter
  711. * new deref code
  712. Revision 1.40 1999/05/13 21:59:44 peter
  713. * removed oldppu code
  714. * warning if objpas is loaded from uses
  715. * first things for new deref writing
  716. Revision 1.39 1999/05/04 21:45:06 florian
  717. * changes to compile it with Delphi 4.0
  718. Revision 1.38 1999/04/26 13:31:51 peter
  719. * release storenumber,double_checksum
  720. Revision 1.37 1999/04/21 09:43:53 peter
  721. * storenumber works
  722. * fixed some typos in double_checksum
  723. + incompatible types type1 and type2 message (with storenumber)
  724. Revision 1.36 1999/04/14 09:15:01 peter
  725. * first things to store the symbol/def number in the ppu
  726. Revision 1.35 1999/04/07 15:39:35 pierre
  727. + double_checksum code added
  728. Revision 1.34 1999/03/02 13:49:19 peter
  729. * renamed loadunit_int -> loadunit
  730. Revision 1.33 1999/02/23 18:29:25 pierre
  731. * win32 compilation error fix
  732. + some work for local browser (not cl=omplete yet)
  733. }