symppu.inc 23 KB

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