parser.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  4. This unit does the parsing process
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit parser;
  19. {$i fpcdefs.inc}
  20. interface
  21. {$ifdef PREPROCWRITE}
  22. procedure preprocess(const filename:string);
  23. {$endif PREPROCWRITE}
  24. procedure compile(const filename:string);
  25. procedure initparser;
  26. procedure doneparser;
  27. implementation
  28. uses
  29. cutils,cclasses,
  30. globtype,version,tokens,systems,globals,verbose,
  31. symbase,symtable,symdef,symsym,
  32. fmodule,fppu,
  33. aasmbase,aasmtai,
  34. cgbase,
  35. script,gendef,
  36. {$ifdef BrowserLog}
  37. browlog,
  38. {$endif BrowserLog}
  39. {$ifdef UseExcept}
  40. tpexcept,
  41. {$endif UseExcept}
  42. {$ifdef GDB}
  43. gdb,
  44. {$endif GDB}
  45. comphook,
  46. scanner,scandir,
  47. pbase,ptype,psystem,pmodules,cresstr,cpuinfo;
  48. procedure initparser;
  49. begin
  50. { ^M means a string or a char, because we don't parse a }
  51. { type declaration }
  52. ignore_equal:=false;
  53. { we didn't parse a object or class declaration }
  54. { and no function header }
  55. testcurobject:=0;
  56. { Symtable }
  57. aktprocsym:=nil;
  58. aktprocdef:=nil;
  59. objectlibrary:=nil;
  60. current_module:=nil;
  61. compiled_module:=nil;
  62. procinfo:=nil;
  63. loaded_units:=TLinkedList.Create;
  64. usedunits:=TLinkedList.Create;
  65. { global switches }
  66. aktglobalswitches:=initglobalswitches;
  67. aktsourcecodepage:=initsourcecodepage;
  68. { initialize scanner }
  69. InitScanner;
  70. InitScannerDirectives;
  71. { scanner }
  72. c:=#0;
  73. pattern:='';
  74. orgpattern:='';
  75. current_scanner:=nil;
  76. { register all nodes and tais }
  77. registernodes;
  78. registertais;
  79. { memory sizes }
  80. if heapsize=0 then
  81. heapsize:=target_info.heapsize;
  82. if stacksize=0 then
  83. stacksize:=target_info.stacksize;
  84. { open assembler response }
  85. GenerateAsmRes(outputexedir+'ppas');
  86. { open deffile }
  87. DefFile:=TDefFile.Create(outputexedir+inputfile+target_info.defext);
  88. { list of generated .o files, so the linker can remove them }
  89. SmartLinkOFiles:=TStringList.Create;
  90. end;
  91. procedure doneparser;
  92. begin
  93. { unload units }
  94. loaded_units.free;
  95. usedunits.free;
  96. { if there was an error in the scanner, the scanner is
  97. still assinged }
  98. if assigned(current_scanner) then
  99. begin
  100. current_scanner.free;
  101. current_scanner:=nil;
  102. end;
  103. { close scanner }
  104. DoneScanner;
  105. { close ppas,deffile }
  106. asmres.free;
  107. deffile.free;
  108. { free list of .o files }
  109. SmartLinkOFiles.Free;
  110. end;
  111. procedure default_macros;
  112. var
  113. hp : tstringlistitem;
  114. begin
  115. { commandline }
  116. hp:=tstringlistitem(initdefines.first);
  117. while assigned(hp) do
  118. begin
  119. current_scanner.def_macro(hp.str);
  120. hp:=tstringlistitem(hp.next);
  121. end;
  122. { set macros for version checking }
  123. current_scanner.set_macro('FPC_VERSION',version_nr);
  124. current_scanner.set_macro('FPC_RELEASE',release_nr);
  125. current_scanner.set_macro('FPC_PATCH',patch_nr);
  126. end;
  127. {$ifdef PREPROCWRITE}
  128. procedure preprocess(const filename:string);
  129. var
  130. i : longint;
  131. begin
  132. new(preprocfile,init('pre'));
  133. { default macros }
  134. current_scanner^.macros:=new(pdictionary,init);
  135. default_macros;
  136. { initialize a module }
  137. current_module:=new(pmodule,init(filename,false));
  138. main_module:=current_module;
  139. { startup scanner, and save in current_module }
  140. current_scanner:=new(pscannerfile,Init(filename));
  141. current_module.scanner:=current_scanner;
  142. { loop until EOF is found }
  143. repeat
  144. current_scanner^.readtoken;
  145. preprocfile^.AddSpace;
  146. case token of
  147. _ID :
  148. begin
  149. preprocfile^.Add(orgpattern);
  150. end;
  151. _REALNUMBER,
  152. _INTCONST :
  153. preprocfile^.Add(pattern);
  154. _CSTRING :
  155. begin
  156. i:=0;
  157. while (i<length(pattern)) do
  158. begin
  159. inc(i);
  160. if pattern[i]='''' then
  161. begin
  162. insert('''',pattern,i);
  163. inc(i);
  164. end;
  165. end;
  166. preprocfile^.Add(''''+pattern+'''');
  167. end;
  168. _CCHAR :
  169. begin
  170. case pattern[1] of
  171. #39 :
  172. pattern:='''''''';
  173. #0..#31,
  174. #128..#255 :
  175. begin
  176. str(ord(pattern[1]),pattern);
  177. pattern:='#'+pattern;
  178. end;
  179. else
  180. pattern:=''''+pattern[1]+'''';
  181. end;
  182. preprocfile^.Add(pattern);
  183. end;
  184. _EOF :
  185. break;
  186. else
  187. preprocfile^.Add(tokeninfo^[token].str)
  188. end;
  189. until false;
  190. { free scanner }
  191. dispose(current_scanner,done);
  192. current_scanner:=nil;
  193. { close }
  194. dispose(preprocfile,done);
  195. end;
  196. {$endif PREPROCWRITE}
  197. procedure compile(const filename:string);
  198. type
  199. polddata=^tolddata;
  200. tolddata=record
  201. { scanner }
  202. oldidtoken,
  203. oldtoken : ttoken;
  204. oldtokenpos : tfileposinfo;
  205. oldc : char;
  206. oldpattern,
  207. oldorgpattern : string;
  208. old_block_type : tblock_type;
  209. { symtable }
  210. oldrefsymtable,
  211. olddefaultsymtablestack,
  212. oldsymtablestack : tsymtable;
  213. oldaktprocsym : tprocsym;
  214. oldaktprocdef : tprocdef;
  215. oldoverloaded_operators : toverloaded_operators;
  216. { cg }
  217. oldparse_only : boolean;
  218. { asmlists }
  219. oldimports,
  220. oldexports,
  221. oldresource,
  222. oldrttilist,
  223. oldresourcestringlist,
  224. oldbsssegment,
  225. olddatasegment,
  226. oldcodesegment,
  227. oldexprasmlist,
  228. olddebuglist,
  229. oldwithdebuglist,
  230. oldconsts : taasmoutput;
  231. oldobjectlibrary : tasmlibrarydata;
  232. { resourcestrings }
  233. OldResourceStrings : tResourceStrings;
  234. { akt.. things }
  235. oldaktlocalswitches : tlocalswitches;
  236. oldaktmoduleswitches : tmoduleswitches;
  237. oldaktfilepos : tfileposinfo;
  238. oldaktpackenum,oldaktmaxfpuregisters : longint;
  239. oldaktalignment : talignmentinfo;
  240. oldaktoutputformat : tasm;
  241. oldaktspecificoptprocessor,
  242. oldaktoptprocessor : tprocessors;
  243. oldaktasmmode : tasmmode;
  244. oldaktinterfacetype: tinterfacetypes;
  245. oldaktmodeswitches : tmodeswitches;
  246. old_compiled_module : tmodule;
  247. oldaktdefproccall : tproccalloption;
  248. oldsourcecodepage : tcodepagestring;
  249. oldstatement_level : integer;
  250. {$ifdef GDB}
  251. store_dbx : plongint;
  252. {$endif GDB}
  253. end;
  254. var
  255. olddata : polddata;
  256. {$ifdef USEEXCEPT}
  257. {$ifndef Delphi}
  258. recoverpos : jmp_buf;
  259. oldrecoverpos : pjmp_buf;
  260. {$endif Delphi}
  261. {$endif useexcept}
  262. begin
  263. inc(compile_level);
  264. parser_current_file:=filename;
  265. { Uses heap memory instead of placing everything on the
  266. stack. This is needed because compile() can be called
  267. recursively }
  268. new(olddata);
  269. with olddata^ do
  270. begin
  271. old_compiled_module:=compiled_module;
  272. { save symtable state }
  273. oldsymtablestack:=symtablestack;
  274. olddefaultsymtablestack:=defaultsymtablestack;
  275. oldrefsymtable:=refsymtable;
  276. oldaktprocsym:=aktprocsym;
  277. oldaktprocdef:=aktprocdef;
  278. oldaktdefproccall:=aktdefproccall;
  279. move(overloaded_operators,oldoverloaded_operators,sizeof(toverloaded_operators));
  280. { save scanner state }
  281. oldc:=c;
  282. oldpattern:=pattern;
  283. oldorgpattern:=orgpattern;
  284. oldtoken:=token;
  285. oldidtoken:=idtoken;
  286. old_block_type:=block_type;
  287. oldtokenpos:=akttokenpos;
  288. oldsourcecodepage:=aktsourcecodepage;
  289. { save cg }
  290. oldparse_only:=parse_only;
  291. { save assembler lists }
  292. olddatasegment:=datasegment;
  293. oldbsssegment:=bsssegment;
  294. oldcodesegment:=codesegment;
  295. olddebuglist:=debuglist;
  296. oldwithdebuglist:=withdebuglist;
  297. oldconsts:=consts;
  298. oldrttilist:=rttilist;
  299. oldexprasmlist:=exprasmlist;
  300. oldimports:=importssection;
  301. oldexports:=exportssection;
  302. oldresource:=resourcesection;
  303. oldresourcestringlist:=resourcestringlist;
  304. oldobjectlibrary:=objectlibrary;
  305. OldResourceStrings:=ResourceStrings;
  306. { save akt... state }
  307. { handle the postponed case first }
  308. if localswitcheschanged then
  309. begin
  310. aktlocalswitches:=nextaktlocalswitches;
  311. localswitcheschanged:=false;
  312. end;
  313. oldaktlocalswitches:=aktlocalswitches;
  314. oldaktmoduleswitches:=aktmoduleswitches;
  315. oldaktalignment:=aktalignment;
  316. oldaktpackenum:=aktpackenum;
  317. oldaktmaxfpuregisters:=aktmaxfpuregisters;
  318. oldaktoutputformat:=aktoutputformat;
  319. oldaktoptprocessor:=aktoptprocessor;
  320. oldaktspecificoptprocessor:=aktspecificoptprocessor;
  321. oldaktasmmode:=aktasmmode;
  322. oldaktinterfacetype:=aktinterfacetype;
  323. oldaktfilepos:=aktfilepos;
  324. oldaktmodeswitches:=aktmodeswitches;
  325. oldstatement_level:=statement_level;
  326. {$ifdef GDB}
  327. store_dbx:=dbx_counter;
  328. dbx_counter:=nil;
  329. {$endif GDB}
  330. end;
  331. { show info }
  332. Message1(parser_i_compiling,filename);
  333. { reset symtable }
  334. symtablestack:=nil;
  335. defaultsymtablestack:=nil;
  336. systemunit:=nil;
  337. refsymtable:=nil;
  338. aktprocsym:=nil;
  339. aktdefproccall:=initdefproccall;
  340. registerdef:=true;
  341. statement_level:=0;
  342. aktexceptblock:=0;
  343. exceptblockcounter:=0;
  344. aktmaxfpuregisters:=-1;
  345. fillchar(overloaded_operators,sizeof(toverloaded_operators),0);
  346. { reset the unit or create a new program }
  347. if assigned(current_module) then
  348. current_module.reset
  349. else
  350. begin
  351. current_module:=tppumodule.create(nil,filename,'',false);
  352. main_module:=current_module;
  353. end;
  354. { a unit compiled at command line must be inside the loaded_unit list }
  355. if (compile_level=1) then
  356. loaded_units.insert(current_module);
  357. { Set the module to use for verbose }
  358. SetCompileModule(current_module);
  359. compiled_module:=current_module;
  360. current_module.in_compile:=true;
  361. { Load current state from the init values }
  362. aktlocalswitches:=initlocalswitches;
  363. aktmoduleswitches:=initmoduleswitches;
  364. aktmodeswitches:=initmodeswitches;
  365. {$IFDEF Testvarsets}
  366. aktsetalloc:=initsetalloc;
  367. {$ENDIF}
  368. aktalignment:=initalignment;
  369. aktpackenum:=initpackenum;
  370. aktoutputformat:=initoutputformat;
  371. set_target_asm(aktoutputformat);
  372. aktoptprocessor:=initoptprocessor;
  373. aktspecificoptprocessor:=initspecificoptprocessor;
  374. aktasmmode:=initasmmode;
  375. aktinterfacetype:=initinterfacetype;
  376. { startup scanner and load the first file }
  377. current_scanner:=tscannerfile.Create(filename);
  378. current_scanner.firstfile;
  379. current_module.scanner:=current_scanner;
  380. { macros }
  381. default_macros;
  382. { read the first token }
  383. current_scanner.readtoken;
  384. { init code generator for a new module }
  385. codegen_newmodule;
  386. { If the compile level > 1 we get a nice "unit expected" error
  387. message if we are trying to use a program as unit.}
  388. {$ifdef USEEXCEPT}
  389. if setjmp(recoverpos)=0 then
  390. begin
  391. oldrecoverpos:=recoverpospointer;
  392. recoverpospointer:=@recoverpos;
  393. {$endif USEEXCEPT}
  394. if (token=_UNIT) or (compile_level>1) then
  395. begin
  396. current_module.is_unit:=true;
  397. proc_unit;
  398. end
  399. else
  400. proc_program(token=_LIBRARY);
  401. {$ifdef USEEXCEPT}
  402. recoverpospointer:=oldrecoverpos;
  403. end
  404. else
  405. begin
  406. recoverpospointer:=oldrecoverpos;
  407. longjump_used:=true;
  408. end;
  409. {$endif USEEXCEPT}
  410. { clear memory }
  411. {$ifdef Splitheap}
  412. if testsplit then
  413. begin
  414. { temp heap should be empty after that !!!}
  415. codegen_donemodule;
  416. Releasetempheap;
  417. end;
  418. {$endif Splitheap}
  419. { restore old state, close trees, > 0.99.5 has heapblocks, so
  420. it's the default to release the trees }
  421. codegen_donemodule;
  422. if assigned(current_module) then
  423. begin
  424. { free ppu }
  425. if assigned(tppumodule(current_module).ppufile) then
  426. begin
  427. tppumodule(current_module).ppufile.free;
  428. tppumodule(current_module).ppufile:=nil;
  429. end;
  430. { free scanner }
  431. if assigned(current_module.scanner) then
  432. begin
  433. if current_scanner=tscannerfile(current_module.scanner) then
  434. current_scanner:=nil;
  435. tscannerfile(current_module.scanner).free;
  436. current_module.scanner:=nil;
  437. end;
  438. end;
  439. if (compile_level>1) then
  440. begin
  441. with olddata^ do
  442. begin
  443. { restore scanner }
  444. c:=oldc;
  445. pattern:=oldpattern;
  446. orgpattern:=oldorgpattern;
  447. token:=oldtoken;
  448. idtoken:=oldidtoken;
  449. akttokenpos:=oldtokenpos;
  450. block_type:=old_block_type;
  451. { restore cg }
  452. parse_only:=oldparse_only;
  453. { restore asmlists }
  454. exprasmlist:=oldexprasmlist;
  455. datasegment:=olddatasegment;
  456. bsssegment:=oldbsssegment;
  457. codesegment:=oldcodesegment;
  458. consts:=oldconsts;
  459. debuglist:=olddebuglist;
  460. withdebuglist:=oldwithdebuglist;
  461. importssection:=oldimports;
  462. exportssection:=oldexports;
  463. resourcesection:=oldresource;
  464. rttilist:=oldrttilist;
  465. resourcestringlist:=oldresourcestringlist;
  466. { object data }
  467. ResourceStrings:=OldResourceStrings;
  468. objectlibrary:=oldobjectlibrary;
  469. { restore previous scanner }
  470. if assigned(old_compiled_module) then
  471. current_scanner:=tscannerfile(old_compiled_module.scanner)
  472. else
  473. current_scanner:=nil;
  474. if assigned(current_scanner) then
  475. parser_current_file:=current_scanner.inputfile.name^;
  476. { restore symtable state }
  477. refsymtable:=oldrefsymtable;
  478. symtablestack:=oldsymtablestack;
  479. defaultsymtablestack:=olddefaultsymtablestack;
  480. aktdefproccall:=oldaktdefproccall;
  481. aktprocsym:=oldaktprocsym;
  482. aktprocdef:=oldaktprocdef;
  483. move(oldoverloaded_operators,overloaded_operators,sizeof(toverloaded_operators));
  484. aktsourcecodepage:=oldsourcecodepage;
  485. aktlocalswitches:=oldaktlocalswitches;
  486. aktmoduleswitches:=oldaktmoduleswitches;
  487. aktalignment:=oldaktalignment;
  488. aktpackenum:=oldaktpackenum;
  489. aktmaxfpuregisters:=oldaktmaxfpuregisters;
  490. aktoutputformat:=oldaktoutputformat;
  491. set_target_asm(aktoutputformat);
  492. aktoptprocessor:=oldaktoptprocessor;
  493. aktspecificoptprocessor:=oldaktspecificoptprocessor;
  494. aktasmmode:=oldaktasmmode;
  495. aktinterfacetype:=oldaktinterfacetype;
  496. aktfilepos:=oldaktfilepos;
  497. aktmodeswitches:=oldaktmodeswitches;
  498. statement_level:=oldstatement_level;
  499. aktexceptblock:=0;
  500. exceptblockcounter:=0;
  501. {$ifdef GDB}
  502. dbx_counter:=store_dbx;
  503. {$endif GDB}
  504. end;
  505. end
  506. else
  507. begin
  508. parser_current_file:='';
  509. { Shut down things when the last file is compiled }
  510. if (compile_level=1) then
  511. begin
  512. { Close script }
  513. if (not AsmRes.Empty) then
  514. begin
  515. Message1(exec_i_closing_script,AsmRes.Fn);
  516. AsmRes.WriteToDisk;
  517. end;
  518. {$ifdef USEEXCEPT}
  519. if not longjump_used then
  520. {$endif USEEXCEPT}
  521. begin
  522. { do not create browsers on errors !! }
  523. if status.errorcount=0 then
  524. begin
  525. {$ifdef BrowserLog}
  526. { Write Browser Log }
  527. if (cs_browser_log in aktglobalswitches) and
  528. (cs_browser in aktmoduleswitches) then
  529. begin
  530. if browserlog.elements_to_list.empty then
  531. begin
  532. Message1(parser_i_writing_browser_log,browserlog.Fname);
  533. WriteBrowserLog;
  534. end
  535. else
  536. browserlog.list_elements;
  537. end;
  538. {$endif BrowserLog}
  539. { Write Browser Collections }
  540. do_extractsymbolinfo{$ifdef FPC}(){$endif};
  541. end;
  542. end;
  543. {$ifdef dummy}
  544. if current_module.in_second_compile then
  545. begin
  546. current_module.in_second_compile:=false;
  547. current_module.in_compile:=true;
  548. end
  549. else
  550. current_module.in_compile:=false;
  551. {$endif dummy}
  552. end;
  553. end;
  554. dec(compile_level);
  555. compiled_module:=olddata^.old_compiled_module;
  556. dispose(olddata);
  557. {$ifdef USEEXCEPT}
  558. if longjump_used then
  559. longjmp(recoverpospointer^,1);
  560. {$endif USEEXCEPT}
  561. end;
  562. end.
  563. {
  564. $Log$
  565. Revision 1.47 2002-12-24 23:32:19 peter
  566. * fixed crash when old_compiled_module was nil
  567. Revision 1.46 2002/11/20 12:36:24 mazen
  568. * $UNITPATH directive is now working
  569. Revision 1.45 2002/10/07 19:29:52 peter
  570. * Place old data in compile() in the heap to save stack
  571. Revision 1.44 2002/09/05 19:27:06 peter
  572. * fixed crash when current_module becomes nil
  573. Revision 1.43 2002/08/18 19:58:28 peter
  574. * more current_scanner fixes
  575. Revision 1.42 2002/08/16 15:31:08 peter
  576. * fixed possible crashes with current_scanner
  577. Revision 1.41 2002/08/15 19:10:35 peter
  578. * first things tai,tnode storing in ppu
  579. Revision 1.40 2002/08/12 16:46:04 peter
  580. * tscannerfile is now destroyed in tmodule.reset and current_scanner
  581. is updated accordingly. This removes all the loading and saving of
  582. the old scanner and the invalid flag marking
  583. Revision 1.39 2002/08/12 15:08:40 carl
  584. + stab register indexes for powerpc (moved from gdb to cpubase)
  585. + tprocessor enumeration moved to cpuinfo
  586. + linker in target_info is now a class
  587. * many many updates for m68k (will soon start to compile)
  588. - removed some ifdef or correct them for correct cpu
  589. Revision 1.38 2002/08/11 14:28:19 peter
  590. * TScannerFile.SetInvalid added that will also reset inputfile
  591. Revision 1.37 2002/08/11 13:24:12 peter
  592. * saving of asmsymbols in ppu supported
  593. * asmsymbollist global is removed and moved into a new class
  594. tasmlibrarydata that will hold the info of a .a file which
  595. corresponds with a single module. Added librarydata to tmodule
  596. to keep the library info stored for the module. In the future the
  597. objectfiles will also be stored to the tasmlibrarydata class
  598. * all getlabel/newasmsymbol and friends are moved to the new class
  599. Revision 1.36 2002/08/09 19:15:41 carl
  600. - removed newcg define
  601. Revision 1.35 2002/07/20 17:16:03 florian
  602. + source code page support
  603. Revision 1.34 2002/07/01 18:46:24 peter
  604. * internal linker
  605. * reorganized aasm layer
  606. Revision 1.33 2002/05/18 13:34:11 peter
  607. * readded missing revisions
  608. Revision 1.32 2002/05/16 19:46:42 carl
  609. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  610. + try to fix temp allocation (still in ifdef)
  611. + generic constructor calls
  612. + start of tassembler / tmodulebase class cleanup
  613. Revision 1.30 2002/04/21 18:57:23 peter
  614. * fixed memleaks when file can't be opened
  615. Revision 1.29 2002/04/20 21:32:24 carl
  616. + generic FPC_CHECKPOINTER
  617. + first parameter offset in stack now portable
  618. * rename some constants
  619. + move some cpu stuff to other units
  620. - remove unused constents
  621. * fix stacksize for some targets
  622. * fix generic size problems which depend now on EXTEND_SIZE constant
  623. Revision 1.28 2002/04/19 15:46:02 peter
  624. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  625. in most cases and not written to the ppu
  626. * add mangeledname_prefix() routine to generate the prefix of
  627. manglednames depending on the current procedure, object and module
  628. * removed static procprefix since the mangledname is now build only
  629. on demand from tprocdef.mangledname
  630. Revision 1.27 2002/01/29 19:43:11 peter
  631. * update target_asm according to outputformat
  632. }