pdecl.pas 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  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 assigned(tobjectdef(p.resulttype.def).iidguid) 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. symtablestack.insertconstdata(sym);
  181. { procvar can have proc directives }
  182. if (tt.def.deftype=procvardef) then
  183. begin
  184. { support p : procedure;stdcall=nil; }
  185. if (token=_SEMICOLON) then
  186. begin
  187. consume(_SEMICOLON);
  188. if is_proc_directive(token) then
  189. parse_var_proc_directives(sym)
  190. else
  191. begin
  192. Message(parser_e_proc_directive_expected);
  193. skipequal:=true;
  194. end;
  195. end
  196. else
  197. { support p : procedure stdcall=nil; }
  198. begin
  199. if is_proc_directive(token) then
  200. parse_var_proc_directives(sym);
  201. end;
  202. { add default calling convention }
  203. handle_calling_convention(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.decrefs;
  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. if not assigned(tforwarddef(hpd).tosymname) then
  296. internalerror(20021120);
  297. searchsym(tforwarddef(hpd).tosymname^,srsym,srsymtable);
  298. make_ref:=true;
  299. resolving_forward:=false;
  300. akttokenpos:=stpos;
  301. { we don't need the forwarddef anymore, dispose it }
  302. hpd.free;
  303. tpointerdef(pd).pointertype.def:=nil; { if error occurs }
  304. { was a type sym found ? }
  305. if assigned(srsym) and
  306. (srsym.typ=typesym) then
  307. begin
  308. tpointerdef(pd).pointertype.setsym(srsym);
  309. { avoid wrong unused warnings web bug 801 PM }
  310. inc(tstoredsym(srsym).refs);
  311. {$ifdef GDB}
  312. if (cs_debuginfo in aktmoduleswitches) and assigned(debuglist) and
  313. (tsym(p).owner.symtabletype in [globalsymtable,staticsymtable]) then
  314. begin
  315. ttypesym(p).isusedinstab := true;
  316. ttypesym(p).concatstabto(debuglist);
  317. end;
  318. {$endif GDB}
  319. { we need a class type for classrefdef }
  320. if (pd.deftype=classrefdef) and
  321. not(is_class(ttypesym(srsym).restype.def)) then
  322. Message1(type_e_class_type_expected,ttypesym(srsym).restype.def.typename);
  323. end
  324. else
  325. begin
  326. MessagePos1(tsym(p).fileinfo,sym_e_forward_type_not_resolved,tsym(p).realname);
  327. { try to recover }
  328. tpointerdef(pd).pointertype:=generrortype;
  329. end;
  330. end;
  331. end;
  332. recorddef :
  333. trecorddef(pd).symtable.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  334. objectdef :
  335. begin
  336. if not(m_fpc in aktmodeswitches) and
  337. (oo_is_forward in tobjectdef(pd).objectoptions) then
  338. begin
  339. { only give an error as the implementation may follow in an
  340. other type block which is allowed by FPC modes }
  341. MessagePos1(tsym(p).fileinfo,sym_e_forward_type_not_resolved,tsym(p).realname);
  342. end
  343. else
  344. begin
  345. { Check all fields of the object declaration, but don't
  346. check objectdefs in objects/records, because these
  347. can't exist (anonymous objects aren't allowed) }
  348. if not(tsym(p).owner.symtabletype in [objectsymtable,recordsymtable]) then
  349. tobjectdef(pd).symtable.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  350. end;
  351. end;
  352. end;
  353. until not again;
  354. end;
  355. { reads a type declaration to the symbol table }
  356. procedure type_dec;
  357. var
  358. typename,orgtypename : stringid;
  359. newtype : ttypesym;
  360. sym : tsym;
  361. srsymtable : tsymtable;
  362. tt : ttype;
  363. oldfilepos,
  364. defpos,storetokenpos : tfileposinfo;
  365. old_block_type : tblock_type;
  366. ch : tclassheader;
  367. unique,istyperenaming : boolean;
  368. begin
  369. old_block_type:=block_type;
  370. block_type:=bt_type;
  371. consume(_TYPE);
  372. typecanbeforward:=true;
  373. repeat
  374. typename:=pattern;
  375. orgtypename:=orgpattern;
  376. defpos:=akttokenpos;
  377. istyperenaming:=false;
  378. consume(_ID);
  379. consume(_EQUAL);
  380. { support 'ttype=type word' syntax }
  381. if token=_TYPE then
  382. begin
  383. Consume(_TYPE);
  384. unique:=true;
  385. end
  386. else
  387. unique:=false;
  388. { is the type already defined? }
  389. searchsym(typename,sym,srsymtable);
  390. newtype:=nil;
  391. { found a symbol with this name? }
  392. if assigned(sym) then
  393. begin
  394. if (sym.typ=typesym) then
  395. begin
  396. if ((token=_CLASS) or
  397. (token=_INTERFACE)) and
  398. (assigned(ttypesym(sym).restype.def)) and
  399. is_class_or_interface(ttypesym(sym).restype.def) and
  400. (oo_is_forward in tobjectdef(ttypesym(sym).restype.def).objectoptions) then
  401. begin
  402. { we can ignore the result }
  403. { the definition is modified }
  404. object_dec(orgtypename,tobjectdef(ttypesym(sym).restype.def));
  405. newtype:=ttypesym(sym);
  406. tt:=newtype.restype;
  407. end;
  408. message1(parser_h_type_redef,typename);
  409. end;
  410. end;
  411. { no old type reused ? Then insert this new type }
  412. if not assigned(newtype) then
  413. begin
  414. { insert the new type first with an errordef, so that
  415. referencing the type before it's really set it
  416. will give an error (PFV) }
  417. tt:=generrortype;
  418. storetokenpos:=akttokenpos;
  419. newtype:=ttypesym.create(orgtypename,tt);
  420. symtablestack.insert(newtype);
  421. akttokenpos:=defpos;
  422. akttokenpos:=storetokenpos;
  423. { read the type definition }
  424. read_type(tt,orgtypename);
  425. { update the definition of the type }
  426. newtype.restype:=tt;
  427. if assigned(tt.sym) then
  428. istyperenaming:=true
  429. else
  430. tt.sym:=newtype;
  431. if unique and assigned(tt.def) then
  432. begin
  433. tt.setdef(tstoreddef(tt.def).getcopy);
  434. include(tt.def.defoptions,df_unique);
  435. newtype.restype:=tt;
  436. end;
  437. if assigned(tt.def) and not assigned(tt.def.typesym) then
  438. tt.def.typesym:=newtype;
  439. { KAZ: handle TGUID declaration in system unit }
  440. if (cs_compilesystem in aktmoduleswitches) and not assigned(rec_tguid) and
  441. (typename='TGUID') and { name: TGUID and size=16 bytes that is 128 bits }
  442. assigned(tt.def) and (tt.def.deftype=recorddef) and (tt.def.size=16) then
  443. rec_tguid:=trecorddef(tt.def);
  444. end;
  445. if assigned(tt.def) then
  446. begin
  447. case tt.def.deftype of
  448. pointerdef :
  449. begin
  450. consume(_SEMICOLON);
  451. if try_to_consume(_FAR) then
  452. begin
  453. tpointerdef(tt.def).is_far:=true;
  454. consume(_SEMICOLON);
  455. end;
  456. end;
  457. procvardef :
  458. begin
  459. { in case of type renaming, don't parse proc directives }
  460. if istyperenaming then
  461. consume(_SEMICOLON)
  462. else
  463. begin
  464. if not is_proc_directive(token) then
  465. consume(_SEMICOLON);
  466. parse_var_proc_directives(tsym(newtype));
  467. end;
  468. end;
  469. objectdef,
  470. recorddef :
  471. begin
  472. try_consume_hintdirective(newtype.symoptions);
  473. consume(_SEMICOLON);
  474. end;
  475. else
  476. consume(_SEMICOLON);
  477. end;
  478. end;
  479. { Write tables if we are the typesym that defines
  480. this type. This will not be done for simple type renamings }
  481. if (tt.def.typesym=newtype) then
  482. begin
  483. { file position }
  484. oldfilepos:=aktfilepos;
  485. aktfilepos:=newtype.fileinfo;
  486. { generate persistent init/final tables when it's declared in the interface so it can
  487. be reused in other used }
  488. if current_module.in_interface and
  489. ((is_class(tt.def) and
  490. tobjectdef(tt.def).members_need_inittable) or
  491. tt.def.needs_inittable) then
  492. generate_inittable(newtype);
  493. { for objects we should write the vmt and interfaces.
  494. This need to be done after the rtti has been written, because
  495. it can contain a reference to that data (PFV)
  496. This is not for forward classes }
  497. if (tt.def.deftype=objectdef) and
  498. not(oo_is_forward in tobjectdef(tt.def).objectoptions) then
  499. begin
  500. ch:=cclassheader.create(tobjectdef(tt.def));
  501. { generate and check virtual methods, must be done
  502. before RTTI is written }
  503. ch.genvmt;
  504. { generate rtti info if published items are available }
  505. if (oo_can_have_published in tobjectdef(tt.def).objectoptions) then
  506. generate_rtti(newtype);
  507. if is_interface(tobjectdef(tt.def)) then
  508. ch.writeinterfaceids;
  509. if (oo_has_vmt in tobjectdef(tt.def).objectoptions) then
  510. ch.writevmt;
  511. ch.free;
  512. end;
  513. aktfilepos:=oldfilepos;
  514. end;
  515. until token<>_ID;
  516. typecanbeforward:=false;
  517. symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  518. block_type:=old_block_type;
  519. end;
  520. procedure var_dec;
  521. { parses variable declarations and inserts them in }
  522. { the top symbol table of symtablestack }
  523. begin
  524. consume(_VAR);
  525. read_var_decs(false,false,false);
  526. end;
  527. procedure threadvar_dec;
  528. { parses thread variable declarations and inserts them in }
  529. { the top symbol table of symtablestack }
  530. begin
  531. consume(_THREADVAR);
  532. if not(symtablestack.symtabletype in [staticsymtable,globalsymtable]) then
  533. message(parser_e_threadvars_only_sg);
  534. if not(cs_threading in aktmoduleswitches) and
  535. not(cs_compilesystem in aktmoduleswitches) then
  536. Comment(V_Error,'Threading is turned off');
  537. read_var_decs(false,false,true);
  538. end;
  539. procedure resourcestring_dec;
  540. var
  541. orgname : stringid;
  542. p : tnode;
  543. storetokenpos,filepos : tfileposinfo;
  544. old_block_type : tblock_type;
  545. sp : pchar;
  546. begin
  547. consume(_RESOURCESTRING);
  548. if not(symtablestack.symtabletype in [staticsymtable,globalsymtable]) then
  549. message(parser_e_resourcestring_only_sg);
  550. old_block_type:=block_type;
  551. block_type:=bt_const;
  552. repeat
  553. orgname:=orgpattern;
  554. filepos:=akttokenpos;
  555. consume(_ID);
  556. case token of
  557. _EQUAL:
  558. begin
  559. consume(_EQUAL);
  560. p:=comp_expr(true);
  561. storetokenpos:=akttokenpos;
  562. akttokenpos:=filepos;
  563. case p.nodetype of
  564. ordconstn:
  565. begin
  566. if is_constcharnode(p) then
  567. begin
  568. getmem(sp,2);
  569. sp[0]:=chr(tordconstnode(p).value);
  570. sp[1]:=#0;
  571. symtablestack.insert(tconstsym.create_string(orgname,constresourcestring,sp,1));
  572. end
  573. else
  574. Message(cg_e_illegal_expression);
  575. end;
  576. stringconstn:
  577. begin
  578. getmem(sp,tstringconstnode(p).len+1);
  579. move(tstringconstnode(p).value_str^,sp^,tstringconstnode(p).len+1);
  580. symtablestack.insert(tconstsym.create_string(orgname,constresourcestring,sp,tstringconstnode(p).len));
  581. end;
  582. else
  583. Message(cg_e_illegal_expression);
  584. end;
  585. akttokenpos:=storetokenpos;
  586. consume(_SEMICOLON);
  587. p.free;
  588. end;
  589. else consume(_EQUAL);
  590. end;
  591. until token<>_ID;
  592. block_type:=old_block_type;
  593. end;
  594. end.
  595. {
  596. $Log$
  597. Revision 1.68 2003-07-02 22:18:04 peter
  598. * paraloc splitted in callerparaloc,calleeparaloc
  599. * sparc calling convention updates
  600. Revision 1.67 2003/04/27 11:21:33 peter
  601. * aktprocdef renamed to current_procdef
  602. * procinfo renamed to current_procinfo
  603. * procinfo will now be stored in current_module so it can be
  604. cleaned up properly
  605. * gen_main_procsym changed to create_main_proc and release_main_proc
  606. to also generate a tprocinfo structure
  607. * fixed unit implicit initfinal
  608. Revision 1.66 2003/04/27 07:29:50 peter
  609. * current_procdef cleanup, current_procdef is now always nil when parsing
  610. a new procdef declaration
  611. * aktprocsym removed
  612. * lexlevel removed, use symtable.symtablelevel instead
  613. * implicit init/final code uses the normal genentry/genexit
  614. * funcret state checking updated for new funcret handling
  615. Revision 1.65 2003/04/01 16:17:15 peter
  616. * reset symbol for unique types
  617. Revision 1.64 2003/01/05 15:54:15 florian
  618. + added proper support of type = type <type>; for simple types
  619. Revision 1.63 2002/12/29 14:57:50 peter
  620. * unit loading changed to first register units and load them
  621. afterwards. This is needed to support uses xxx in yyy correctly
  622. * unit dependency check fixed
  623. Revision 1.62 2002/12/05 19:27:40 carl
  624. - remove lower in hint
  625. Revision 1.61 2002/11/25 18:43:32 carl
  626. - removed the invalid if <> checking (Delphi is strange on this)
  627. + implemented abstract warning on instance creation of class with
  628. abstract methods.
  629. * some error message cleanups
  630. Revision 1.60 2002/11/23 22:50:06 carl
  631. * some small speed optimizations
  632. + added several new warnings/hints
  633. Revision 1.59 2002/11/17 16:31:56 carl
  634. * memory optimization (3-4%) : cleanup of tai fields,
  635. cleanup of tdef and tsym fields.
  636. * make it work for m68k
  637. Revision 1.58 2002/11/15 16:29:30 peter
  638. * made tasmsymbol.refs private (merged)
  639. Revision 1.57 2002/10/20 15:34:16 peter
  640. * removed df_unique flag. It breaks code. For a good type=type <id>
  641. a def copy is required
  642. Revision 1.56 2002/10/19 15:09:25 peter
  643. + tobjectdef.members_need_inittable that is used to generate only the
  644. inittable when it is really used. This saves a lot of useless calls
  645. to fpc_finalize when destroying classes
  646. Revision 1.55 2002/10/14 19:45:02 peter
  647. * only allow threadvar when threading switch is defined
  648. Revision 1.54 2002/10/06 12:25:05 florian
  649. + proper support of type <id> = type <another id>;
  650. Revision 1.53 2002/08/25 19:25:19 peter
  651. * sym.insert_in_data removed
  652. * symtable.insertvardata/insertconstdata added
  653. * removed insert_in_data call from symtable.insert, it needs to be
  654. called separatly. This allows to deref the address calculation
  655. * procedures now calculate the parast addresses after the procedure
  656. directives are parsed. This fixes the cdecl parast problem
  657. * push_addr_param has an extra argument that specifies if cdecl is used
  658. or not
  659. Revision 1.52 2002/08/12 15:08:40 carl
  660. + stab register indexes for powerpc (moved from gdb to cpubase)
  661. + tprocessor enumeration moved to cpuinfo
  662. + linker in target_info is now a class
  663. * many many updates for m68k (will soon start to compile)
  664. - removed some ifdef or correct them for correct cpu
  665. Revision 1.51 2002/08/11 14:32:27 peter
  666. * renamed current_library to objectlibrary
  667. Revision 1.50 2002/08/11 13:24:12 peter
  668. * saving of asmsymbols in ppu supported
  669. * asmsymbollist global is removed and moved into a new class
  670. tasmlibrarydata that will hold the info of a .a file which
  671. corresponds with a single module. Added librarydata to tmodule
  672. to keep the library info stored for the module. In the future the
  673. objectfiles will also be stored to the tasmlibrarydata class
  674. * all getlabel/newasmsymbol and friends are moved to the new class
  675. Revision 1.49 2002/07/29 21:23:43 florian
  676. * more fixes for the ppc
  677. + wrappers for the tcnvnode.first_* stuff introduced
  678. Revision 1.48 2002/07/01 18:46:25 peter
  679. * internal linker
  680. * reorganized aasm layer
  681. Revision 1.47 2002/06/12 13:20:29 jonas
  682. * fix from Florian for init/final info of forward classes
  683. Revision 1.46 2002/05/18 13:34:12 peter
  684. * readded missing revisions
  685. Revision 1.45 2002/05/16 19:46:42 carl
  686. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  687. + try to fix temp allocation (still in ifdef)
  688. + generic constructor calls
  689. + start of tassembler / tmodulebase class cleanup
  690. Revision 1.43 2002/05/12 16:53:08 peter
  691. * moved entry and exitcode to ncgutil and cgobj
  692. * foreach gets extra argument for passing local data to the
  693. iterator function
  694. * -CR checks also class typecasts at runtime by changing them
  695. into as
  696. * fixed compiler to cycle with the -CR option
  697. * fixed stabs with elf writer, finally the global variables can
  698. be watched
  699. * removed a lot of routines from cga unit and replaced them by
  700. calls to cgobj
  701. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  702. u32bit then the other is typecasted also to u32bit without giving
  703. a rangecheck warning/error.
  704. * fixed pascal calling method with reversing also the high tree in
  705. the parast, detected by tcalcst3 test
  706. Revision 1.42 2002/04/19 15:46:02 peter
  707. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  708. in most cases and not written to the ppu
  709. * add mangeledname_prefix() routine to generate the prefix of
  710. manglednames depending on the current procedure, object and module
  711. * removed static procprefix since the mangledname is now build only
  712. on demand from tprocdef.mangledname
  713. Revision 1.41 2002/03/04 17:54:59 peter
  714. * allow oridinal labels again
  715. }