symppu.inc 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  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. {*****************************************************************************
  29. PPU Writing
  30. *****************************************************************************}
  31. procedure writebyte(b:byte);
  32. begin
  33. current_ppu^.putbyte(b);
  34. end;
  35. procedure writeword(w:word);
  36. begin
  37. current_ppu^.putword(w);
  38. end;
  39. procedure writelong(l:longint);
  40. begin
  41. current_ppu^.putlongint(l);
  42. end;
  43. procedure writereal(d:bestreal);
  44. begin
  45. current_ppu^.putreal(d);
  46. end;
  47. procedure writestring(const s:string);
  48. begin
  49. current_ppu^.putstring(s);
  50. end;
  51. procedure writenormalset(var s); {You cannot pass an array[0..31] of byte!}
  52. begin
  53. current_ppu^.putdata(s,sizeof(tnormalset));
  54. end;
  55. procedure writecontainer(var p:tstringcontainer;id:byte;hold,strippath:boolean);
  56. var
  57. hcontainer : tstringcontainer;
  58. s : string;
  59. begin
  60. if hold then
  61. hcontainer.init;
  62. while not p.empty do
  63. begin
  64. s:=p.get;
  65. if strippath then
  66. current_ppu^.putstring(SplitFileName(s))
  67. else
  68. current_ppu^.putstring(s);
  69. if hold then
  70. hcontainer.insert(s);
  71. end;
  72. current_ppu^.writeentry(id);
  73. if hold then
  74. p:=hcontainer;
  75. end;
  76. procedure writeposinfo(const p:tfileposinfo);
  77. begin
  78. current_ppu^.putword(p.fileindex);
  79. current_ppu^.putlongint(p.line);
  80. current_ppu^.putword(p.column);
  81. end;
  82. procedure writederef(p : psymtableentry);
  83. begin
  84. if p=nil then
  85. current_ppu^.putbyte(ord(derefnil))
  86. else
  87. begin
  88. { Static symtable ? }
  89. if p^.owner^.symtabletype=staticsymtable then
  90. begin
  91. current_ppu^.putbyte(ord(derefaktstaticindex));
  92. current_ppu^.putword(p^.indexnr);
  93. end
  94. { Local record/object symtable ? }
  95. else if (p^.owner=aktrecordsymtable) then
  96. begin
  97. current_ppu^.putbyte(ord(derefaktrecordindex));
  98. current_ppu^.putword(p^.indexnr);
  99. end
  100. else
  101. { else if p^.owner^.unitid>$8000 then
  102. current_ppu^.putword(p^.owner^.unitid) }
  103. begin
  104. current_ppu^.putbyte(ord(derefindex));
  105. current_ppu^.putword(p^.indexnr);
  106. { Current unit symtable ? }
  107. repeat
  108. if not assigned(p) then
  109. internalerror(556655);
  110. case p^.owner^.symtabletype of
  111. unitsymtable :
  112. begin
  113. current_ppu^.putbyte(ord(derefunit));
  114. current_ppu^.putword(p^.owner^.unitid);
  115. break;
  116. end;
  117. staticsymtable :
  118. begin
  119. current_ppu^.putbyte(ord(derefaktstaticindex));
  120. current_ppu^.putword(p^.indexnr);
  121. break;
  122. end;
  123. localsymtable :
  124. begin
  125. p:=p^.owner^.defowner;
  126. current_ppu^.putbyte(ord(dereflocal));
  127. current_ppu^.putword(p^.indexnr);
  128. end;
  129. parasymtable :
  130. begin
  131. p:=p^.owner^.defowner;
  132. current_ppu^.putbyte(ord(derefpara));
  133. current_ppu^.putword(p^.indexnr);
  134. end;
  135. objectsymtable,
  136. recordsymtable :
  137. begin
  138. p:=p^.owner^.defowner;
  139. current_ppu^.putbyte(ord(derefrecord));
  140. current_ppu^.putword(p^.indexnr);
  141. end;
  142. else
  143. internalerror(556656);
  144. end;
  145. until false;
  146. end;
  147. end;
  148. end;
  149. procedure writedefref(p : pdef);
  150. begin
  151. writederef(p);
  152. end;
  153. procedure writesymref(p : psym);
  154. begin
  155. writederef(p);
  156. end;
  157. procedure writesourcefiles;
  158. var
  159. hp : pinputfile;
  160. begin
  161. { second write the used source files }
  162. current_ppu^.do_crc:=false;
  163. hp:=current_module^.sourcefiles^.files;
  164. while assigned(hp) do
  165. begin
  166. { only name and extension }
  167. current_ppu^.putstring(hp^.name^);
  168. hp:=hp^.ref_next;
  169. end;
  170. current_ppu^.writeentry(ibsourcefiles);
  171. current_ppu^.do_crc:=true;
  172. end;
  173. procedure writeusedunit;
  174. var
  175. hp : pused_unit;
  176. begin
  177. numberunits;
  178. hp:=pused_unit(current_module^.used_units.first);
  179. while assigned(hp) do
  180. begin
  181. current_ppu^.do_interface_crc:=hp^.in_interface;
  182. current_ppu^.putstring(hp^.name^);
  183. { the checksum should not affect the crc of this unit ! (PFV) }
  184. current_ppu^.do_crc:=false;
  185. current_ppu^.putlongint(hp^.checksum);
  186. current_ppu^.putlongint(hp^.interface_checksum);
  187. current_ppu^.do_crc:=true;
  188. current_ppu^.putbyte(byte(hp^.in_interface));
  189. hp:=pused_unit(hp^.next);
  190. end;
  191. current_ppu^.do_interface_crc:=true;
  192. current_ppu^.writeentry(ibloadunit);
  193. end;
  194. procedure writeunitas(const s : string;unittable : punitsymtable;only_crc : boolean);
  195. begin
  196. Message1(unit_u_ppu_write,s);
  197. { create unit flags }
  198. with Current_Module^ do
  199. begin
  200. if (((cs_create_staticlib in aktmoduleswitches) or
  201. (cs_smartlink in aktmoduleswitches)) and
  202. (SplitName(ppufilename^)<>SplitName(staticlibfilename^))) or
  203. ((cs_create_sharedlib in aktmoduleswitches) and
  204. (SplitName(ppufilename^)<>SplitName(sharedlibfilename^))) then
  205. flags:=flags or uf_in_library;
  206. if cs_smartlink in aktmoduleswitches then
  207. flags:=flags or uf_smartlink;
  208. {$ifdef GDB}
  209. if cs_gdb_dbx in aktglobalswitches then
  210. flags:=flags or uf_has_dbx;
  211. {$endif GDB}
  212. if target_os.endian=endian_big then
  213. flags:=flags or uf_big_endian;
  214. if cs_browser in aktmoduleswitches then
  215. flags:=flags or uf_has_browser;
  216. if cs_local_browser in aktmoduleswitches then
  217. flags:=flags or uf_local_browser;
  218. end;
  219. {$ifdef Test_Double_checksum_write}
  220. If only_crc then
  221. Assign(CRCFile,s+'.INT')
  222. else
  223. Assign(CRCFile,s+'.IMP');
  224. Rewrite(CRCFile);
  225. {$endif def Test_Double_checksum_write}
  226. { open ppufile }
  227. current_ppu:=new(pppufile,init(s));
  228. if not current_ppu^.create then
  229. Message(unit_f_ppu_cannot_write);
  230. current_ppu^.crc_only:=only_crc;
  231. {$ifdef Test_Double_checksum}
  232. if only_crc then
  233. begin
  234. new(current_ppu^.crc_test);
  235. end
  236. else
  237. begin
  238. current_ppu^.crc_test:=Current_Module^.crc_array;
  239. current_ppu^.crc_index:=Current_Module^.crc_size;
  240. end;
  241. {$endif def Test_Double_checksum}
  242. current_ppu^.change_endian:=source_os.endian<>target_os.endian;
  243. { write symbols and definitions }
  244. unittable^.writeasunit;
  245. { flush to be sure }
  246. current_ppu^.flush;
  247. { create and write header }
  248. current_ppu^.header.size:=current_ppu^.size;
  249. current_ppu^.header.checksum:=current_ppu^.crc;
  250. current_ppu^.header.interface_checksum:=current_ppu^.interface_crc;
  251. current_ppu^.header.compiler:=wordversion;
  252. current_ppu^.header.cpu:=word(target_cpu);
  253. current_ppu^.header.target:=word(target_info.target);
  254. current_ppu^.header.flags:=current_module^.flags;
  255. current_ppu^.writeheader;
  256. { save crc in current_module also }
  257. current_module^.crc:=current_ppu^.crc;
  258. current_module^.interface_crc:=current_ppu^.interface_crc;
  259. if only_crc then
  260. begin
  261. {$ifdef Test_Double_checksum}
  262. Current_Module^.crc_array:=current_ppu^.crc_test;
  263. current_ppu^.crc_test:=nil;
  264. Current_Module^.crc_size:=current_ppu^.crc_index;
  265. {$endif def Test_Double_checksum}
  266. closecurrentppu;
  267. end;
  268. {$ifdef Test_Double_checksum_write}
  269. close(CRCFile);
  270. {$endif Test_Double_checksum_write}
  271. end;
  272. procedure closecurrentppu;
  273. begin
  274. {$ifdef Test_Double_checksum}
  275. if assigned(current_ppu^.crc_test) then
  276. dispose(current_ppu^.crc_test);
  277. {$endif Test_Double_checksum}
  278. { close }
  279. current_ppu^.close;
  280. dispose(current_ppu,done);
  281. current_ppu:=nil;
  282. end;
  283. {*****************************************************************************
  284. PPU Reading
  285. *****************************************************************************}
  286. function readbyte:byte;
  287. begin
  288. readbyte:=current_ppu^.getbyte;
  289. if current_ppu^.error then
  290. Message(unit_f_ppu_read_error);
  291. end;
  292. function readword:word;
  293. begin
  294. readword:=current_ppu^.getword;
  295. if current_ppu^.error then
  296. Message(unit_f_ppu_read_error);
  297. end;
  298. function readlong:longint;
  299. begin
  300. readlong:=current_ppu^.getlongint;
  301. if current_ppu^.error then
  302. Message(unit_f_ppu_read_error);
  303. end;
  304. function readreal : bestreal;
  305. begin
  306. readreal:=current_ppu^.getreal;
  307. if current_ppu^.error then
  308. Message(unit_f_ppu_read_error);
  309. end;
  310. function readstring : string;
  311. begin
  312. readstring:=current_ppu^.getstring;
  313. if current_ppu^.error then
  314. Message(unit_f_ppu_read_error);
  315. end;
  316. procedure readnormalset(var s); {You cannot pass an array [0..31] of byte.}
  317. begin
  318. current_ppu^.getdata(s,sizeof(tnormalset));
  319. if current_ppu^.error then
  320. Message(unit_f_ppu_read_error);
  321. end;
  322. procedure readcontainer(var p:tstringcontainer);
  323. begin
  324. while not current_ppu^.endofentry do
  325. p.insert(current_ppu^.getstring);
  326. end;
  327. procedure readposinfo(var p:tfileposinfo);
  328. begin
  329. p.fileindex:=current_ppu^.getword;
  330. p.line:=current_ppu^.getlongint;
  331. p.column:=current_ppu^.getword;
  332. end;
  333. {$ifndef OLDDEREF}
  334. function readderef : pderef;
  335. var
  336. hp,p : pderef;
  337. b : tdereftype;
  338. begin
  339. p:=nil;
  340. repeat
  341. hp:=p;
  342. b:=tdereftype(current_ppu^.getbyte);
  343. case b of
  344. derefnil :
  345. break;
  346. derefunit,
  347. derefaktrecordindex,
  348. derefaktstaticindex :
  349. begin
  350. new(p,init(b,current_ppu^.getword));
  351. p^.next:=hp;
  352. break;
  353. end;
  354. derefindex,
  355. derefpara,
  356. dereflocal,
  357. derefrecord :
  358. begin
  359. new(p,init(b,current_ppu^.getword));
  360. p^.next:=hp;
  361. end;
  362. end;
  363. until false;
  364. readderef:=p;
  365. end;
  366. function readdefref : pdef;
  367. begin
  368. readdefref:=pdef(readderef);
  369. end;
  370. function readsymref : psym;
  371. begin
  372. readsymref:=psym(readderef);
  373. end;
  374. {$else}
  375. function readdefref : pdef;
  376. var
  377. hd : pdef;
  378. begin
  379. longint(hd):=current_ppu^.getword;
  380. longint(hd):=longint(hd) or (longint(current_ppu^.getword) shl 16);
  381. readdefref:=hd;
  382. end;
  383. function readsymref : psym;
  384. var
  385. hd : psym;
  386. begin
  387. longint(hd):=current_ppu^.getword;
  388. longint(hd):=longint(hd) or (longint(current_ppu^.getword) shl 16);
  389. readsymref:=hd;
  390. end;
  391. {$endif}
  392. procedure readsourcefiles;
  393. var
  394. temp,hs : string;
  395. incfile_found : boolean;
  396. ppufiletime,
  397. source_time : longint;
  398. hp : pinputfile;
  399. begin
  400. ppufiletime:=getnamedfiletime(current_module^.ppufilename^);
  401. current_module^.sources_avail:=true;
  402. while not current_ppu^.endofentry do
  403. begin
  404. hs:=current_ppu^.getstring;
  405. temp:='';
  406. if (current_module^.flags and uf_in_library)<>0 then
  407. begin
  408. current_module^.sources_avail:=false;
  409. temp:=' library';
  410. end
  411. else if pos('Macro ',hs)=1 then
  412. begin
  413. { we don't want to find this file }
  414. { but there is a problem with file indexing !! }
  415. temp:='';
  416. end
  417. else
  418. begin
  419. { check the date of the source files }
  420. Source_Time:=GetNamedFileTime(current_module^.path^+hs);
  421. incfile_found:=false;
  422. if (Source_Time=-1) then
  423. begin
  424. temp:=search(hs,includesearchpath,incfile_found);
  425. if incfile_found then
  426. begin
  427. hs:=temp+hs;
  428. Source_Time:=GetNamedFileTime(hs);
  429. end
  430. end
  431. else
  432. hs:=current_module^.path^+hs;
  433. if Source_Time=-1 then
  434. begin
  435. current_module^.sources_avail:=false;
  436. temp:=' not found';
  437. end
  438. else
  439. begin
  440. { time newer? But only allow if the file is not searched
  441. in the include path (PFV), else you've problems with
  442. units which use the same includefile names }
  443. if incfile_found then
  444. temp:=' found'
  445. else
  446. begin
  447. temp:=' time '+filetimestring(source_time);
  448. if (source_time>ppufiletime) then
  449. begin
  450. current_module^.do_compile:=true;
  451. temp:=temp+' *'
  452. end;
  453. end;
  454. end;
  455. new(hp,init(hs));
  456. { the indexing is wrong here PM }
  457. current_module^.sourcefiles^.register_file(hp);
  458. end;
  459. Message1(unit_u_ppu_source,hs+temp);
  460. end;
  461. { main source is always the last }
  462. stringdispose(current_module^.mainsource);
  463. current_module^.mainsource:=stringdup(hs);
  464. { the indexing is corrected here PM }
  465. current_module^.sourcefiles^.inverse_register_indexes;
  466. { check if we want to rebuild every unit, only if the sources are
  467. available }
  468. if do_build and current_module^.sources_avail then
  469. current_module^.do_compile:=true;
  470. end;
  471. procedure readloadunit;
  472. var
  473. hs : string;
  474. intfchecksum,
  475. checksum : longint;
  476. in_interface : boolean;
  477. begin
  478. while not current_ppu^.endofentry do
  479. begin
  480. hs:=current_ppu^.getstring;
  481. checksum:=current_ppu^.getlongint;
  482. intfchecksum:=current_ppu^.getlongint;
  483. in_interface:=(current_ppu^.getbyte<>0);
  484. current_module^.used_units.concat(new(pused_unit,init_to_load(hs,checksum,intfchecksum,in_interface)));
  485. end;
  486. end;
  487. procedure load_interface;
  488. var
  489. b : byte;
  490. begin
  491. { read interface part }
  492. repeat
  493. b:=current_ppu^.readentry;
  494. case b of
  495. ibmodulename : begin
  496. stringdispose(current_module^.modulename);
  497. current_module^.modulename:=stringdup(current_ppu^.getstring);
  498. end;
  499. ibsourcefiles : readsourcefiles;
  500. ibloadunit : readloadunit;
  501. iblinksharedlibs : readcontainer(current_module^.LinkSharedLibs);
  502. iblinkstaticlibs : readcontainer(current_module^.LinkStaticLibs);
  503. iblinkunitfiles : readcontainer(current_module^.LinkUnitFiles);
  504. iblinkofiles : readcontainer(current_module^.LinkOFiles);
  505. ibendinterface : break;
  506. else
  507. Message1(unit_f_ppu_invalid_entry,tostr(b));
  508. end;
  509. until false;
  510. end;
  511. {
  512. $Log$
  513. Revision 1.42 1999-06-22 16:24:47 pierre
  514. * local browser stuff corrected
  515. Revision 1.41 1999/05/14 17:52:28 peter
  516. * new deref code
  517. Revision 1.40 1999/05/13 21:59:44 peter
  518. * removed oldppu code
  519. * warning if objpas is loaded from uses
  520. * first things for new deref writing
  521. Revision 1.39 1999/05/04 21:45:06 florian
  522. * changes to compile it with Delphi 4.0
  523. Revision 1.38 1999/04/26 13:31:51 peter
  524. * release storenumber,double_checksum
  525. Revision 1.37 1999/04/21 09:43:53 peter
  526. * storenumber works
  527. * fixed some typos in double_checksum
  528. + incompatible types type1 and type2 message (with storenumber)
  529. Revision 1.36 1999/04/14 09:15:01 peter
  530. * first things to store the symbol/def number in the ppu
  531. Revision 1.35 1999/04/07 15:39:35 pierre
  532. + double_checksum code added
  533. Revision 1.34 1999/03/02 13:49:19 peter
  534. * renamed loadunit_int -> loadunit
  535. Revision 1.33 1999/02/23 18:29:25 pierre
  536. * win32 compilation error fix
  537. + some work for local browser (not cl=omplete yet)
  538. Revision 1.32 1999/02/22 13:07:08 pierre
  539. + -b and -bl options work !
  540. + cs_local_browser ($L+) is disabled if cs_browser ($Y+)
  541. is not enabled when quitting global section
  542. * local vars and procedures are not yet stored into PPU
  543. Revision 1.31 1999/02/16 00:48:25 peter
  544. * save in the ppu if linked with obj file instead of using the
  545. library flag, so the .inc files are also checked
  546. Revision 1.30 1999/02/05 08:54:30 pierre
  547. + linkofiles splitted inot linkofiles and linkunitfiles
  548. because linkofiles must be stored with directory
  549. to enabled linking of different objects with same name
  550. in a different directory
  551. Revision 1.29 1999/01/20 10:16:46 peter
  552. * don't update crc when writing objs,libs and sources
  553. Revision 1.28 1999/01/12 14:25:35 peter
  554. + BrowserLog for browser.log generation
  555. + BrowserCol for browser info in TCollections
  556. * released all other UseBrowser
  557. Revision 1.27 1998/12/08 10:18:14 peter
  558. + -gh for heaptrc unit
  559. Revision 1.26 1998/11/26 14:36:02 peter
  560. * set also library flag if smartlinking and outputname is different
  561. Revision 1.25 1998/10/26 09:35:47 peter
  562. * don't count includefiles which are found in the includepath for a
  563. recompile.
  564. Revision 1.24 1998/10/20 08:06:59 pierre
  565. * several memory corruptions due to double freemem solved
  566. => never use p^.loc.location:=p^.left^.loc.location;
  567. + finally I added now by default
  568. that ra386dir translates global and unit symbols
  569. + added a first field in tsymtable and
  570. a nextsym field in tsym
  571. (this allows to obtain ordered type info for
  572. records and objects in gdb !)
  573. Revision 1.23 1998/10/16 13:37:24 florian
  574. + switch -FD added to specify the path for utilities
  575. Revision 1.22 1998/10/14 13:38:24 peter
  576. * fixed path with staticlib/objects in ppufiles
  577. Revision 1.21 1998/10/14 10:45:10 pierre
  578. * ppu problems for m68k fixed (at least in cross compiling)
  579. * one last memory leak for sysamiga fixed
  580. * the amiga RTL compiles now completely !!
  581. Revision 1.20 1998/10/13 13:10:30 peter
  582. * new style for m68k/i386 infos and enums
  583. Revision 1.19 1998/10/08 23:29:07 peter
  584. * -vu shows unit info, -vt shows tried/used files
  585. Revision 1.18 1998/09/28 16:57:27 pierre
  586. * changed all length(p^.value_str^) into str_length(p)
  587. to get it work with and without ansistrings
  588. * changed sourcefiles field of tmodule to a pointer
  589. Revision 1.17 1998/09/22 17:13:53 pierre
  590. + browsing updated and developed
  591. records and objects fields are also stored
  592. Revision 1.16 1998/09/22 15:40:56 peter
  593. * some extra ifdef GDB
  594. Revision 1.15 1998/09/21 08:45:23 pierre
  595. + added vmt_offset in tobjectdef.write for fututre use
  596. (first steps to have objects without vmt if no virtual !!)
  597. + added fpu_used field for tabstractprocdef :
  598. sets this level to 2 if the functions return with value in FPU
  599. (is then set to correct value at parsing of implementation)
  600. THIS MIGHT refuse some code with FPU expression too complex
  601. that were accepted before and even in some cases
  602. that don't overflow in fact
  603. ( like if f : float; is a forward that finally in implementation
  604. only uses one fpu register !!)
  605. Nevertheless I think that it will improve security on
  606. FPU operations !!
  607. * most other changes only for UseBrowser code
  608. (added symtable references for record and objects)
  609. local switch for refs to args and local of each function
  610. (static symtable still missing)
  611. UseBrowser still not stable and probably broken by
  612. the definition hash array !!
  613. Revision 1.14 1998/09/01 07:54:24 pierre
  614. * UseBrowser a little updated (might still be buggy !!)
  615. * bug in psub.pas in function specifier removed
  616. * stdcall allowed in interface and in implementation
  617. (FPC will not yet complain if it is missing in either part
  618. because stdcall is only a dummy !!)
  619. Revision 1.13 1998/08/17 10:10:11 peter
  620. - removed OLDPPU
  621. Revision 1.12 1998/08/17 09:17:53 peter
  622. * static/shared linking updates
  623. Revision 1.11 1998/08/16 20:32:49 peter
  624. * crcs of used units are not important for the current crc, reduces the
  625. amount of recompiles
  626. Revision 1.10 1998/08/13 10:57:30 peter
  627. * constant sets are now written correctly to the ppufile
  628. Revision 1.9 1998/08/11 15:31:41 peter
  629. * write extended to ppu file
  630. * new version 0.99.7
  631. Revision 1.8 1998/08/10 14:50:29 peter
  632. + localswitches, moduleswitches, globalswitches splitting
  633. Revision 1.7 1998/07/14 14:47:07 peter
  634. * released NEWINPUT
  635. Revision 1.6 1998/07/07 11:20:14 peter
  636. + NEWINPUT for a better inputfile and scanner object
  637. Revision 1.5 1998/06/24 14:48:39 peter
  638. * ifdef newppu -> ifndef oldppu
  639. Revision 1.4 1998/06/16 08:56:32 peter
  640. + targetcpu
  641. * cleaner pmodules for newppu
  642. Revision 1.3 1998/06/13 00:10:17 peter
  643. * working browser and newppu
  644. * some small fixes against crashes which occured in bp7 (but not in
  645. fpc?!)
  646. Revision 1.2 1998/05/28 14:40:28 peter
  647. * fixes for newppu, remake3 works now with it
  648. Revision 1.1 1998/05/27 19:45:09 peter
  649. * symtable.pas splitted into includefiles
  650. * symtable adapted for $ifdef NEWPPU
  651. }