symppu.inc 24 KB

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