pdecl.pas 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  4. Does declaration (but not type) parsing for Free Pascal
  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 pdecl;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. { global }
  23. globals,
  24. { symtable }
  25. symsym,
  26. { pass_1 }
  27. node;
  28. function readconstant(const orgname:string;const filepos:tfileposinfo):tconstsym;
  29. procedure const_dec;
  30. procedure label_dec;
  31. procedure type_dec;
  32. procedure var_dec;
  33. procedure threadvar_dec;
  34. procedure resourcestring_dec;
  35. implementation
  36. uses
  37. { common }
  38. cutils,cclasses,
  39. { global }
  40. globtype,tokens,verbose,
  41. systems,
  42. { aasm }
  43. aasmbase,aasmtai,aasmcpu,fmodule,
  44. { symtable }
  45. symconst,symbase,symtype,symdef,symtable,paramgr,
  46. { pass 1 }
  47. nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nobj,
  48. { parser }
  49. scanner,
  50. pbase,pexpr,ptype,ptconst,pdecsub,pdecvar,pdecobj,
  51. { cpu-information }
  52. cpuinfo
  53. ;
  54. function readconstant(const orgname:string;const filepos:tfileposinfo):tconstsym;
  55. var
  56. hp : tconstsym;
  57. p : tnode;
  58. ps : pconstset;
  59. pd : pbestreal;
  60. pg : pguid;
  61. sp : pchar;
  62. storetokenpos : tfileposinfo;
  63. begin
  64. readconstant:=nil;
  65. if orgname='' then
  66. internalerror(9584582);
  67. hp:=nil;
  68. p:=comp_expr(true);
  69. storetokenpos:=akttokenpos;
  70. akttokenpos:=filepos;
  71. case p.nodetype of
  72. ordconstn:
  73. begin
  74. if is_constintnode(p) then
  75. hp:=tconstsym.create_ord_typed(orgname,constint,tordconstnode(p).value,tordconstnode(p).resulttype)
  76. else if is_constcharnode(p) then
  77. hp:=tconstsym.create_ord(orgname,constchar,tordconstnode(p).value)
  78. else if is_constboolnode(p) then
  79. hp:=tconstsym.create_ord(orgname,constbool,tordconstnode(p).value)
  80. else if is_constwidecharnode(p) then
  81. hp:=tconstsym.create_ord(orgname,constwchar,tordconstnode(p).value)
  82. else if p.resulttype.def.deftype=enumdef then
  83. hp:=tconstsym.create_ord_typed(orgname,constord,tordconstnode(p).value,p.resulttype)
  84. else if p.resulttype.def.deftype=pointerdef then
  85. hp:=tconstsym.create_ordptr_typed(orgname,constpointer,tordconstnode(p).value,p.resulttype)
  86. else internalerror(111);
  87. end;
  88. stringconstn:
  89. begin
  90. getmem(sp,tstringconstnode(p).len+1);
  91. move(tstringconstnode(p).value_str^,sp^,tstringconstnode(p).len+1);
  92. hp:=tconstsym.create_string(orgname,conststring,sp,tstringconstnode(p).len);
  93. end;
  94. realconstn :
  95. begin
  96. new(pd);
  97. pd^:=trealconstnode(p).value_real;
  98. hp:=tconstsym.create_ptr(orgname,constreal,pd);
  99. end;
  100. setconstn :
  101. begin
  102. new(ps);
  103. ps^:=tsetconstnode(p).value_set^;
  104. hp:=tconstsym.create_ptr_typed(orgname,constset,ps,p.resulttype);
  105. end;
  106. pointerconstn :
  107. begin
  108. hp:=tconstsym.create_ordptr_typed(orgname,constpointer,tpointerconstnode(p).value,p.resulttype);
  109. end;
  110. niln :
  111. begin
  112. hp:=tconstsym.create_ord_typed(orgname,constnil,0,p.resulttype);
  113. end;
  114. typen :
  115. begin
  116. if is_interface(p.resulttype.def) then
  117. begin
  118. if tobjectdef(p.resulttype.def).isiidguidvalid then
  119. begin
  120. new(pg);
  121. pg^:=tobjectdef(p.resulttype.def).iidguid;
  122. hp:=tconstsym.create_ptr(orgname,constguid,pg);
  123. end
  124. else
  125. Message1(parser_e_interface_has_no_guid,tobjectdef(p.resulttype.def).objrealname^);
  126. end
  127. else
  128. Message(cg_e_illegal_expression);
  129. end;
  130. else
  131. Message(cg_e_illegal_expression);
  132. end;
  133. akttokenpos:=storetokenpos;
  134. p.free;
  135. readconstant:=hp;
  136. end;
  137. procedure const_dec;
  138. var
  139. orgname : stringid;
  140. tt : ttype;
  141. sym : tsym;
  142. storetokenpos,filepos : tfileposinfo;
  143. old_block_type : tblock_type;
  144. skipequal : boolean;
  145. begin
  146. consume(_CONST);
  147. old_block_type:=block_type;
  148. block_type:=bt_const;
  149. repeat
  150. orgname:=orgpattern;
  151. filepos:=akttokenpos;
  152. consume(_ID);
  153. case token of
  154. _EQUAL:
  155. begin
  156. consume(_EQUAL);
  157. sym:=readconstant(orgname,filepos);
  158. if assigned(sym) then
  159. symtablestack.insert(sym);
  160. try_consume_hintdirective(sym.symoptions);
  161. consume(_SEMICOLON);
  162. end;
  163. _COLON:
  164. begin
  165. { set the blocktype first so a consume also supports a
  166. caret, to support const s : ^string = nil }
  167. block_type:=bt_type;
  168. consume(_COLON);
  169. ignore_equal:=true;
  170. read_type(tt,'');
  171. ignore_equal:=false;
  172. block_type:=bt_const;
  173. skipequal:=false;
  174. { create symbol }
  175. storetokenpos:=akttokenpos;
  176. akttokenpos:=filepos;
  177. sym:=ttypedconstsym.createtype(orgname,tt,(cs_typed_const_writable in aktlocalswitches));
  178. akttokenpos:=storetokenpos;
  179. symtablestack.insert(sym);
  180. { procvar can have proc directives }
  181. if (tt.def.deftype=procvardef) then
  182. begin
  183. { support p : procedure;stdcall=nil; }
  184. if (token=_SEMICOLON) then
  185. begin
  186. consume(_SEMICOLON);
  187. if is_proc_directive(token) then
  188. parse_var_proc_directives(sym)
  189. else
  190. begin
  191. Message(parser_e_proc_directive_expected);
  192. skipequal:=true;
  193. end;
  194. end
  195. else
  196. { support p : procedure stdcall=nil; }
  197. begin
  198. if is_proc_directive(token) then
  199. parse_var_proc_directives(sym);
  200. end;
  201. { add default calling convention }
  202. handle_calling_convention(nil,tabstractprocdef(tt.def));
  203. paramanager.create_param_loc_info(tabstractprocdef(tt.def));
  204. end;
  205. if not skipequal then
  206. begin
  207. { get init value }
  208. consume(_EQUAL);
  209. readtypedconst(tt,ttypedconstsym(sym),(cs_typed_const_writable in aktlocalswitches));
  210. try_consume_hintdirective(sym.symoptions);
  211. consume(_SEMICOLON);
  212. end;
  213. end;
  214. else
  215. { generate an error }
  216. consume(_EQUAL);
  217. end;
  218. until token<>_ID;
  219. block_type:=old_block_type;
  220. end;
  221. procedure label_dec;
  222. var
  223. hl : tasmlabel;
  224. begin
  225. consume(_LABEL);
  226. if not(cs_support_goto in aktmoduleswitches) then
  227. Message(sym_e_goto_and_label_not_supported);
  228. repeat
  229. if not(token in [_ID,_INTCONST]) then
  230. consume(_ID)
  231. else
  232. begin
  233. if (cs_create_smart in aktmoduleswitches) then
  234. begin
  235. objectlibrary.getdatalabel(hl);
  236. { we still want a warning if unused }
  237. hl.refs:=0;
  238. end
  239. else
  240. objectlibrary.getlabel(hl);
  241. if token=_ID then
  242. symtablestack.insert(tlabelsym.create(orgpattern,hl))
  243. else
  244. symtablestack.insert(tlabelsym.create(pattern,hl));
  245. consume(token);
  246. end;
  247. if token<>_SEMICOLON then consume(_COMMA);
  248. until not(token in [_ID,_INTCONST]);
  249. consume(_SEMICOLON);
  250. end;
  251. { search in symtablestack used, but not defined type }
  252. procedure resolve_type_forward(p : tnamedindexitem;arg:pointer);
  253. var
  254. hpd,pd : tdef;
  255. stpos : tfileposinfo;
  256. again : boolean;
  257. srsym : tsym;
  258. srsymtable : tsymtable;
  259. begin
  260. { Check only typesyms or record/object fields }
  261. case tsym(p).typ of
  262. typesym :
  263. pd:=ttypesym(p).restype.def;
  264. varsym :
  265. if (tsym(p).owner.symtabletype in [objectsymtable,recordsymtable]) then
  266. pd:=tvarsym(p).vartype.def
  267. else
  268. exit;
  269. else
  270. exit;
  271. end;
  272. repeat
  273. again:=false;
  274. case pd.deftype of
  275. arraydef :
  276. begin
  277. { elementtype could also be defined using a forwarddef }
  278. pd:=tarraydef(pd).elementtype.def;
  279. again:=true;
  280. end;
  281. pointerdef,
  282. classrefdef :
  283. begin
  284. { classrefdef inherits from pointerdef }
  285. hpd:=tpointerdef(pd).pointertype.def;
  286. { still a forward def ? }
  287. if hpd.deftype=forwarddef then
  288. begin
  289. { try to resolve the forward }
  290. { get the correct position for it }
  291. stpos:=akttokenpos;
  292. akttokenpos:=tforwarddef(hpd).forwardpos;
  293. resolving_forward:=true;
  294. make_ref:=false;
  295. searchsym(tforwarddef(hpd).tosymname,srsym,srsymtable);
  296. make_ref:=true;
  297. resolving_forward:=false;
  298. akttokenpos:=stpos;
  299. { we don't need the forwarddef anymore, dispose it }
  300. hpd.free;
  301. tpointerdef(pd).pointertype.def:=nil; { if error occurs }
  302. { was a type sym found ? }
  303. if assigned(srsym) and
  304. (srsym.typ=typesym) then
  305. begin
  306. tpointerdef(pd).pointertype.setsym(srsym);
  307. { avoid wrong unused warnings web bug 801 PM }
  308. inc(tstoredsym(srsym).refs);
  309. {$ifdef GDB}
  310. if (cs_debuginfo in aktmoduleswitches) and assigned(debuglist) and
  311. (tsym(p).owner.symtabletype in [globalsymtable,staticsymtable]) then
  312. begin
  313. ttypesym(p).isusedinstab := true;
  314. ttypesym(p).concatstabto(debuglist);
  315. end;
  316. {$endif GDB}
  317. { we need a class type for classrefdef }
  318. if (pd.deftype=classrefdef) and
  319. not(is_class(ttypesym(srsym).restype.def)) then
  320. Message1(type_e_class_type_expected,ttypesym(srsym).restype.def.typename);
  321. end
  322. else
  323. begin
  324. MessagePos1(tsym(p).fileinfo,sym_e_forward_type_not_resolved,tsym(p).realname);
  325. { try to recover }
  326. tpointerdef(pd).pointertype:=generrortype;
  327. end;
  328. end;
  329. end;
  330. recorddef :
  331. trecorddef(pd).symtable.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  332. objectdef :
  333. begin
  334. if not(m_fpc in aktmodeswitches) and
  335. (oo_is_forward in tobjectdef(pd).objectoptions) then
  336. begin
  337. { only give an error as the implementation may follow in an
  338. other type block which is allowed by FPC modes }
  339. MessagePos1(tsym(p).fileinfo,sym_e_forward_type_not_resolved,tsym(p).realname);
  340. end
  341. else
  342. begin
  343. { Check all fields of the object declaration, but don't
  344. check objectdefs in objects/records, because these
  345. can't exist (anonymous objects aren't allowed) }
  346. if not(tsym(p).owner.symtabletype in [objectsymtable,recordsymtable]) then
  347. tobjectdef(pd).symtable.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  348. end;
  349. end;
  350. end;
  351. until not again;
  352. end;
  353. { reads a type declaration to the symbol table }
  354. procedure type_dec;
  355. var
  356. typename,orgtypename : stringid;
  357. newtype : ttypesym;
  358. sym : tsym;
  359. srsymtable : tsymtable;
  360. tt : ttype;
  361. oldfilepos,
  362. defpos,storetokenpos : tfileposinfo;
  363. old_block_type : tblock_type;
  364. ch : tclassheader;
  365. istyperenaming : boolean;
  366. begin
  367. old_block_type:=block_type;
  368. block_type:=bt_type;
  369. consume(_TYPE);
  370. typecanbeforward:=true;
  371. repeat
  372. typename:=pattern;
  373. orgtypename:=orgpattern;
  374. defpos:=akttokenpos;
  375. istyperenaming:=false;
  376. consume(_ID);
  377. consume(_EQUAL);
  378. { support 'ttype=type word' syntax }
  379. if token=_TYPE then
  380. Consume(_TYPE);
  381. { is the type already defined? }
  382. searchsym(typename,sym,srsymtable);
  383. newtype:=nil;
  384. { found a symbol with this name? }
  385. if assigned(sym) then
  386. begin
  387. if (sym.typ=typesym) then
  388. begin
  389. if ((token=_CLASS) or
  390. (token=_INTERFACE)) and
  391. (assigned(ttypesym(sym).restype.def)) and
  392. is_class_or_interface(ttypesym(sym).restype.def) and
  393. (oo_is_forward in tobjectdef(ttypesym(sym).restype.def).objectoptions) then
  394. begin
  395. { we can ignore the result }
  396. { the definition is modified }
  397. object_dec(orgtypename,tobjectdef(ttypesym(sym).restype.def));
  398. newtype:=ttypesym(sym);
  399. tt:=newtype.restype;
  400. end;
  401. end;
  402. end;
  403. { no old type reused ? Then insert this new type }
  404. if not assigned(newtype) then
  405. begin
  406. { insert the new type first with an errordef, so that
  407. referencing the type before it's really set it
  408. will give an error (PFV) }
  409. tt:=generrortype;
  410. storetokenpos:=akttokenpos;
  411. newtype:=ttypesym.create(orgtypename,tt);
  412. symtablestack.insert(newtype);
  413. akttokenpos:=defpos;
  414. akttokenpos:=storetokenpos;
  415. { read the type definition }
  416. read_type(tt,orgtypename);
  417. { update the definition of the type }
  418. newtype.restype:=tt;
  419. if assigned(tt.sym) then
  420. istyperenaming:=true
  421. else
  422. tt.sym:=newtype;
  423. if assigned(tt.def) and not assigned(tt.def.typesym) then
  424. tt.def.typesym:=newtype;
  425. { KAZ: handle TGUID declaration in system unit }
  426. if (cs_compilesystem in aktmoduleswitches) and not assigned(rec_tguid) and
  427. (typename='TGUID') and { name: TGUID and size=16 bytes that is 128 bits }
  428. assigned(tt.def) and (tt.def.deftype=recorddef) and (tt.def.size=16) then
  429. rec_tguid:=trecorddef(tt.def);
  430. end;
  431. if assigned(tt.def) then
  432. begin
  433. case tt.def.deftype of
  434. pointerdef :
  435. begin
  436. consume(_SEMICOLON);
  437. if try_to_consume(_FAR) then
  438. begin
  439. tpointerdef(tt.def).is_far:=true;
  440. consume(_SEMICOLON);
  441. end;
  442. end;
  443. procvardef :
  444. begin
  445. { in case of type renaming, don't parse proc directives }
  446. if istyperenaming then
  447. consume(_SEMICOLON)
  448. else
  449. begin
  450. if not is_proc_directive(token) then
  451. consume(_SEMICOLON);
  452. parse_var_proc_directives(tsym(newtype));
  453. end;
  454. paramanager.create_param_loc_info(tabstractprocdef(tt.def));
  455. end;
  456. objectdef,
  457. recorddef :
  458. begin
  459. try_consume_hintdirective(newtype.symoptions);
  460. consume(_SEMICOLON);
  461. end;
  462. else
  463. consume(_SEMICOLON);
  464. end;
  465. end;
  466. { Write tables if we are the typesym that defines
  467. this type. This will not be done for simple type renamings }
  468. if (tt.def.typesym=newtype) then
  469. begin
  470. { file position }
  471. oldfilepos:=aktfilepos;
  472. aktfilepos:=newtype.fileinfo;
  473. { generate persistent init/final tables when it's declared in the interface so it can
  474. be reused in other used }
  475. if (not current_module.in_implementation) and
  476. (tt.def.needs_inittable or
  477. (is_class(tt.def) and
  478. not(oo_is_forward in tobjectdef(tt.def).objectoptions)
  479. )
  480. ) then
  481. generate_inittable(newtype);
  482. { for objects we should write the vmt and interfaces.
  483. This need to be done after the rtti has been written, because
  484. it can contain a reference to that data (PFV)
  485. This is not for forward classes }
  486. if (tt.def.deftype=objectdef) and
  487. not(oo_is_forward in tobjectdef(tt.def).objectoptions) then
  488. begin
  489. ch:=cclassheader.create(tobjectdef(tt.def));
  490. { generate and check virtual methods, must be done
  491. before RTTI is written }
  492. ch.genvmt;
  493. { generate rtti info if published items are available }
  494. if (oo_can_have_published in tobjectdef(tt.def).objectoptions) then
  495. generate_rtti(newtype);
  496. if is_interface(tobjectdef(tt.def)) then
  497. ch.writeinterfaceids;
  498. if (oo_has_vmt in tobjectdef(tt.def).objectoptions) then
  499. ch.writevmt;
  500. ch.free;
  501. end;
  502. aktfilepos:=oldfilepos;
  503. end;
  504. until token<>_ID;
  505. typecanbeforward:=false;
  506. symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  507. block_type:=old_block_type;
  508. end;
  509. procedure var_dec;
  510. { parses variable declarations and inserts them in }
  511. { the top symbol table of symtablestack }
  512. begin
  513. consume(_VAR);
  514. read_var_decs(false,false,false);
  515. end;
  516. procedure threadvar_dec;
  517. { parses thread variable declarations and inserts them in }
  518. { the top symbol table of symtablestack }
  519. begin
  520. consume(_THREADVAR);
  521. if not(symtablestack.symtabletype in [staticsymtable,globalsymtable]) then
  522. message(parser_e_threadvars_only_sg);
  523. read_var_decs(false,false,true);
  524. end;
  525. procedure resourcestring_dec;
  526. var
  527. orgname : stringid;
  528. p : tnode;
  529. storetokenpos,filepos : tfileposinfo;
  530. old_block_type : tblock_type;
  531. sp : pchar;
  532. begin
  533. consume(_RESOURCESTRING);
  534. if not(symtablestack.symtabletype in [staticsymtable,globalsymtable]) then
  535. message(parser_e_resourcestring_only_sg);
  536. old_block_type:=block_type;
  537. block_type:=bt_const;
  538. repeat
  539. orgname:=orgpattern;
  540. filepos:=akttokenpos;
  541. consume(_ID);
  542. case token of
  543. _EQUAL:
  544. begin
  545. consume(_EQUAL);
  546. p:=comp_expr(true);
  547. storetokenpos:=akttokenpos;
  548. akttokenpos:=filepos;
  549. case p.nodetype of
  550. ordconstn:
  551. begin
  552. if is_constcharnode(p) then
  553. begin
  554. getmem(sp,2);
  555. sp[0]:=chr(tordconstnode(p).value);
  556. sp[1]:=#0;
  557. symtablestack.insert(tconstsym.create_string(orgname,constresourcestring,sp,1));
  558. end
  559. else
  560. Message(cg_e_illegal_expression);
  561. end;
  562. stringconstn:
  563. begin
  564. getmem(sp,tstringconstnode(p).len+1);
  565. move(tstringconstnode(p).value_str^,sp^,tstringconstnode(p).len+1);
  566. symtablestack.insert(tconstsym.create_string(orgname,constresourcestring,sp,tstringconstnode(p).len));
  567. end;
  568. else
  569. Message(cg_e_illegal_expression);
  570. end;
  571. akttokenpos:=storetokenpos;
  572. consume(_SEMICOLON);
  573. p.free;
  574. end;
  575. else consume(_EQUAL);
  576. end;
  577. until token<>_ID;
  578. block_type:=old_block_type;
  579. end;
  580. end.
  581. {
  582. $Log$
  583. Revision 1.52 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.51 2002/08/11 14:32:27 peter
  590. * renamed current_library to objectlibrary
  591. Revision 1.50 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.49 2002/07/29 21:23:43 florian
  600. * more fixes for the ppc
  601. + wrappers for the tcnvnode.first_* stuff introduced
  602. Revision 1.48 2002/07/01 18:46:25 peter
  603. * internal linker
  604. * reorganized aasm layer
  605. Revision 1.47 2002/06/12 13:20:29 jonas
  606. * fix from Florian for init/final info of forward classes
  607. Revision 1.46 2002/05/18 13:34:12 peter
  608. * readded missing revisions
  609. Revision 1.45 2002/05/16 19:46:42 carl
  610. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  611. + try to fix temp allocation (still in ifdef)
  612. + generic constructor calls
  613. + start of tassembler / tmodulebase class cleanup
  614. Revision 1.43 2002/05/12 16:53:08 peter
  615. * moved entry and exitcode to ncgutil and cgobj
  616. * foreach gets extra argument for passing local data to the
  617. iterator function
  618. * -CR checks also class typecasts at runtime by changing them
  619. into as
  620. * fixed compiler to cycle with the -CR option
  621. * fixed stabs with elf writer, finally the global variables can
  622. be watched
  623. * removed a lot of routines from cga unit and replaced them by
  624. calls to cgobj
  625. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  626. u32bit then the other is typecasted also to u32bit without giving
  627. a rangecheck warning/error.
  628. * fixed pascal calling method with reversing also the high tree in
  629. the parast, detected by tcalcst3 test
  630. Revision 1.42 2002/04/19 15:46:02 peter
  631. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  632. in most cases and not written to the ppu
  633. * add mangeledname_prefix() routine to generate the prefix of
  634. manglednames depending on the current procedure, object and module
  635. * removed static procprefix since the mangledname is now build only
  636. on demand from tprocdef.mangledname
  637. Revision 1.41 2002/03/04 17:54:59 peter
  638. * allow oridinal labels again
  639. }