pdecl.pas 25 KB

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