pdecl.pas 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786
  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. { codegen }
  49. ncgutil,
  50. { parser }
  51. scanner,
  52. pbase,pexpr,ptype,ptconst,pdecsub,pdecvar,pdecobj,
  53. { cpu-information }
  54. cpuinfo
  55. ;
  56. function readconstant(const orgname:string;const filepos:tfileposinfo):tconstsym;
  57. var
  58. hp : tconstsym;
  59. p : tnode;
  60. ps : pconstset;
  61. pd : pbestreal;
  62. pg : pguid;
  63. sp : pchar;
  64. storetokenpos : tfileposinfo;
  65. begin
  66. readconstant:=nil;
  67. if orgname='' then
  68. internalerror(9584582);
  69. hp:=nil;
  70. p:=comp_expr(true);
  71. storetokenpos:=akttokenpos;
  72. akttokenpos:=filepos;
  73. case p.nodetype of
  74. ordconstn:
  75. begin
  76. if is_constintnode(p) then
  77. hp:=tconstsym.create_ord_typed(orgname,constint,tordconstnode(p).value,tordconstnode(p).resulttype)
  78. else if is_constcharnode(p) then
  79. hp:=tconstsym.create_ord(orgname,constchar,tordconstnode(p).value)
  80. else if is_constboolnode(p) then
  81. hp:=tconstsym.create_ord(orgname,constbool,tordconstnode(p).value)
  82. else if is_constwidecharnode(p) then
  83. hp:=tconstsym.create_ord(orgname,constwchar,tordconstnode(p).value)
  84. else if p.resulttype.def.deftype=enumdef then
  85. hp:=tconstsym.create_ord_typed(orgname,constord,tordconstnode(p).value,p.resulttype)
  86. else if p.resulttype.def.deftype=pointerdef then
  87. hp:=tconstsym.create_ordptr_typed(orgname,constpointer,tordconstnode(p).value,p.resulttype)
  88. else internalerror(111);
  89. end;
  90. stringconstn:
  91. begin
  92. getmem(sp,tstringconstnode(p).len+1);
  93. move(tstringconstnode(p).value_str^,sp^,tstringconstnode(p).len+1);
  94. hp:=tconstsym.create_string(orgname,conststring,sp,tstringconstnode(p).len);
  95. end;
  96. realconstn :
  97. begin
  98. new(pd);
  99. pd^:=trealconstnode(p).value_real;
  100. hp:=tconstsym.create_ptr(orgname,constreal,pd);
  101. end;
  102. setconstn :
  103. begin
  104. new(ps);
  105. ps^:=tsetconstnode(p).value_set^;
  106. hp:=tconstsym.create_ptr_typed(orgname,constset,ps,p.resulttype);
  107. end;
  108. pointerconstn :
  109. begin
  110. hp:=tconstsym.create_ordptr_typed(orgname,constpointer,tpointerconstnode(p).value,p.resulttype);
  111. end;
  112. niln :
  113. begin
  114. hp:=tconstsym.create_ord_typed(orgname,constnil,0,p.resulttype);
  115. end;
  116. typen :
  117. begin
  118. if is_interface(p.resulttype.def) then
  119. begin
  120. if assigned(tobjectdef(p.resulttype.def).iidguid) then
  121. begin
  122. new(pg);
  123. pg^:=tobjectdef(p.resulttype.def).iidguid^;
  124. hp:=tconstsym.create_ptr(orgname,constguid,pg);
  125. end
  126. else
  127. Message1(parser_e_interface_has_no_guid,tobjectdef(p.resulttype.def).objrealname^);
  128. end
  129. else
  130. Message(cg_e_illegal_expression);
  131. end;
  132. else
  133. Message(cg_e_illegal_expression);
  134. end;
  135. akttokenpos:=storetokenpos;
  136. p.free;
  137. readconstant:=hp;
  138. end;
  139. procedure const_dec;
  140. var
  141. orgname : stringid;
  142. tt : ttype;
  143. sym : tsym;
  144. storetokenpos,filepos : tfileposinfo;
  145. old_block_type : tblock_type;
  146. skipequal : boolean;
  147. begin
  148. consume(_CONST);
  149. old_block_type:=block_type;
  150. block_type:=bt_const;
  151. repeat
  152. orgname:=orgpattern;
  153. filepos:=akttokenpos;
  154. consume(_ID);
  155. case token of
  156. _EQUAL:
  157. begin
  158. consume(_EQUAL);
  159. sym:=readconstant(orgname,filepos);
  160. if assigned(sym) then
  161. symtablestack.insert(sym);
  162. try_consume_hintdirective(sym.symoptions);
  163. consume(_SEMICOLON);
  164. end;
  165. _COLON:
  166. begin
  167. { set the blocktype first so a consume also supports a
  168. caret, to support const s : ^string = nil }
  169. block_type:=bt_type;
  170. consume(_COLON);
  171. ignore_equal:=true;
  172. read_type(tt,'');
  173. ignore_equal:=false;
  174. block_type:=bt_const;
  175. skipequal:=false;
  176. { create symbol }
  177. storetokenpos:=akttokenpos;
  178. akttokenpos:=filepos;
  179. sym:=ttypedconstsym.createtype(orgname,tt,(cs_typed_const_writable in aktlocalswitches));
  180. akttokenpos:=storetokenpos;
  181. symtablestack.insert(sym);
  182. insertconstdata(ttypedconstsym(sym));
  183. { procvar can have proc directives }
  184. if (tt.def.deftype=procvardef) then
  185. begin
  186. { support p : procedure;stdcall=nil; }
  187. if (token=_SEMICOLON) then
  188. begin
  189. consume(_SEMICOLON);
  190. if is_proc_directive(token) then
  191. parse_var_proc_directives(sym)
  192. else
  193. begin
  194. Message(parser_e_proc_directive_expected);
  195. skipequal:=true;
  196. end;
  197. end
  198. else
  199. { support p : procedure stdcall=nil; }
  200. begin
  201. if is_proc_directive(token) then
  202. parse_var_proc_directives(sym);
  203. end;
  204. { add default calling convention }
  205. handle_calling_convention(tabstractprocdef(tt.def));
  206. end;
  207. if not skipequal then
  208. begin
  209. { get init value }
  210. consume(_EQUAL);
  211. readtypedconst(tt,ttypedconstsym(sym),(cs_typed_const_writable in aktlocalswitches));
  212. try_consume_hintdirective(sym.symoptions);
  213. consume(_SEMICOLON);
  214. end;
  215. end;
  216. else
  217. { generate an error }
  218. consume(_EQUAL);
  219. end;
  220. until token<>_ID;
  221. block_type:=old_block_type;
  222. end;
  223. procedure label_dec;
  224. var
  225. hl : tasmlabel;
  226. begin
  227. consume(_LABEL);
  228. if not(cs_support_goto in aktmoduleswitches) then
  229. Message(sym_e_goto_and_label_not_supported);
  230. repeat
  231. if not(token in [_ID,_INTCONST]) then
  232. consume(_ID)
  233. else
  234. begin
  235. if (cs_create_smart in aktmoduleswitches) then
  236. begin
  237. objectlibrary.getdatalabel(hl);
  238. { we still want a warning if unused }
  239. hl.decrefs;
  240. end
  241. else
  242. objectlibrary.getlabel(hl);
  243. if token=_ID then
  244. symtablestack.insert(tlabelsym.create(orgpattern,hl))
  245. else
  246. symtablestack.insert(tlabelsym.create(pattern,hl));
  247. consume(token);
  248. end;
  249. if token<>_SEMICOLON then consume(_COMMA);
  250. until not(token in [_ID,_INTCONST]);
  251. consume(_SEMICOLON);
  252. end;
  253. { search in symtablestack used, but not defined type }
  254. procedure resolve_type_forward(p : tnamedindexitem;arg:pointer);
  255. var
  256. hpd,pd : tdef;
  257. stpos : tfileposinfo;
  258. again : boolean;
  259. srsym : tsym;
  260. srsymtable : tsymtable;
  261. begin
  262. { Check only typesyms or record/object fields }
  263. case tsym(p).typ of
  264. typesym :
  265. pd:=ttypesym(p).restype.def;
  266. varsym :
  267. if (tsym(p).owner.symtabletype in [objectsymtable,recordsymtable]) then
  268. pd:=tvarsym(p).vartype.def
  269. else
  270. exit;
  271. else
  272. exit;
  273. end;
  274. repeat
  275. again:=false;
  276. case pd.deftype of
  277. arraydef :
  278. begin
  279. { elementtype could also be defined using a forwarddef }
  280. pd:=tarraydef(pd).elementtype.def;
  281. again:=true;
  282. end;
  283. pointerdef,
  284. classrefdef :
  285. begin
  286. { classrefdef inherits from pointerdef }
  287. hpd:=tpointerdef(pd).pointertype.def;
  288. { still a forward def ? }
  289. if hpd.deftype=forwarddef then
  290. begin
  291. { try to resolve the forward }
  292. { get the correct position for it }
  293. stpos:=akttokenpos;
  294. akttokenpos:=tforwarddef(hpd).forwardpos;
  295. resolving_forward:=true;
  296. make_ref:=false;
  297. if not assigned(tforwarddef(hpd).tosymname) then
  298. internalerror(20021120);
  299. searchsym(tforwarddef(hpd).tosymname^,srsym,srsymtable);
  300. make_ref:=true;
  301. resolving_forward:=false;
  302. akttokenpos:=stpos;
  303. { we don't need the forwarddef anymore, dispose it }
  304. hpd.free;
  305. tpointerdef(pd).pointertype.def:=nil; { if error occurs }
  306. { was a type sym found ? }
  307. if assigned(srsym) and
  308. (srsym.typ=typesym) then
  309. begin
  310. tpointerdef(pd).pointertype.setsym(srsym);
  311. { avoid wrong unused warnings web bug 801 PM }
  312. inc(tstoredsym(srsym).refs);
  313. {$ifdef GDB}
  314. if (cs_debuginfo in aktmoduleswitches) and assigned(debuglist) and
  315. (tsym(p).owner.symtabletype in [globalsymtable,staticsymtable]) then
  316. begin
  317. ttypesym(p).isusedinstab := true;
  318. ttypesym(p).concatstabto(debuglist);
  319. end;
  320. {$endif GDB}
  321. { we need a class type for classrefdef }
  322. if (pd.deftype=classrefdef) and
  323. not(is_class(ttypesym(srsym).restype.def)) then
  324. Message1(type_e_class_type_expected,ttypesym(srsym).restype.def.typename);
  325. end
  326. else
  327. begin
  328. MessagePos1(tsym(p).fileinfo,sym_e_forward_type_not_resolved,tsym(p).realname);
  329. { try to recover }
  330. tpointerdef(pd).pointertype:=generrortype;
  331. end;
  332. end;
  333. end;
  334. recorddef :
  335. trecorddef(pd).symtable.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  336. objectdef :
  337. begin
  338. if not(m_fpc in aktmodeswitches) and
  339. (oo_is_forward in tobjectdef(pd).objectoptions) then
  340. begin
  341. { only give an error as the implementation may follow in an
  342. other type block which is allowed by FPC modes }
  343. MessagePos1(tsym(p).fileinfo,sym_e_forward_type_not_resolved,tsym(p).realname);
  344. end
  345. else
  346. begin
  347. { Check all fields of the object declaration, but don't
  348. check objectdefs in objects/records, because these
  349. can't exist (anonymous objects aren't allowed) }
  350. if not(tsym(p).owner.symtabletype in [objectsymtable,recordsymtable]) then
  351. tobjectdef(pd).symtable.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  352. end;
  353. end;
  354. end;
  355. until not again;
  356. end;
  357. { reads a type declaration to the symbol table }
  358. procedure type_dec;
  359. var
  360. typename,orgtypename : stringid;
  361. newtype : ttypesym;
  362. sym : tsym;
  363. srsymtable : tsymtable;
  364. tt : ttype;
  365. oldfilepos,
  366. defpos,storetokenpos : tfileposinfo;
  367. old_block_type : tblock_type;
  368. ch : tclassheader;
  369. unique,istyperenaming : boolean;
  370. begin
  371. old_block_type:=block_type;
  372. block_type:=bt_type;
  373. consume(_TYPE);
  374. typecanbeforward:=true;
  375. repeat
  376. typename:=pattern;
  377. orgtypename:=orgpattern;
  378. defpos:=akttokenpos;
  379. istyperenaming:=false;
  380. consume(_ID);
  381. consume(_EQUAL);
  382. { support 'ttype=type word' syntax }
  383. if token=_TYPE then
  384. begin
  385. Consume(_TYPE);
  386. unique:=true;
  387. end
  388. else
  389. unique:=false;
  390. { is the type already defined? }
  391. searchsym(typename,sym,srsymtable);
  392. newtype:=nil;
  393. { found a symbol with this name? }
  394. if assigned(sym) then
  395. begin
  396. if (sym.typ=typesym) then
  397. begin
  398. if ((token=_CLASS) or
  399. (token=_INTERFACE)) and
  400. (assigned(ttypesym(sym).restype.def)) and
  401. is_class_or_interface(ttypesym(sym).restype.def) and
  402. (oo_is_forward in tobjectdef(ttypesym(sym).restype.def).objectoptions) then
  403. begin
  404. { we can ignore the result }
  405. { the definition is modified }
  406. object_dec(orgtypename,tobjectdef(ttypesym(sym).restype.def));
  407. newtype:=ttypesym(sym);
  408. tt:=newtype.restype;
  409. end;
  410. message1(parser_h_type_redef,typename);
  411. end;
  412. end;
  413. { no old type reused ? Then insert this new type }
  414. if not assigned(newtype) then
  415. begin
  416. { insert the new type first with an errordef, so that
  417. referencing the type before it's really set it
  418. will give an error (PFV) }
  419. tt:=generrortype;
  420. storetokenpos:=akttokenpos;
  421. newtype:=ttypesym.create(orgtypename,tt);
  422. symtablestack.insert(newtype);
  423. akttokenpos:=defpos;
  424. akttokenpos:=storetokenpos;
  425. { read the type definition }
  426. read_type(tt,orgtypename);
  427. { update the definition of the type }
  428. newtype.restype:=tt;
  429. if assigned(tt.sym) then
  430. istyperenaming:=true
  431. else
  432. tt.sym:=newtype;
  433. if unique and assigned(tt.def) then
  434. begin
  435. tt.setdef(tstoreddef(tt.def).getcopy);
  436. include(tt.def.defoptions,df_unique);
  437. newtype.restype:=tt;
  438. end;
  439. if assigned(tt.def) and not assigned(tt.def.typesym) then
  440. tt.def.typesym:=newtype;
  441. { KAZ: handle TGUID declaration in system unit }
  442. if (cs_compilesystem in aktmoduleswitches) and not assigned(rec_tguid) and
  443. (typename='TGUID') and { name: TGUID and size=16 bytes that is 128 bits }
  444. assigned(tt.def) and (tt.def.deftype=recorddef) and (tt.def.size=16) then
  445. rec_tguid:=trecorddef(tt.def);
  446. end;
  447. if assigned(tt.def) then
  448. begin
  449. case tt.def.deftype of
  450. pointerdef :
  451. begin
  452. consume(_SEMICOLON);
  453. if try_to_consume(_FAR) then
  454. begin
  455. tpointerdef(tt.def).is_far:=true;
  456. consume(_SEMICOLON);
  457. end;
  458. end;
  459. procvardef :
  460. begin
  461. { in case of type renaming, don't parse proc directives }
  462. if istyperenaming then
  463. consume(_SEMICOLON)
  464. else
  465. begin
  466. if not is_proc_directive(token) then
  467. consume(_SEMICOLON);
  468. parse_var_proc_directives(tsym(newtype));
  469. end;
  470. end;
  471. objectdef,
  472. recorddef :
  473. begin
  474. try_consume_hintdirective(newtype.symoptions);
  475. consume(_SEMICOLON);
  476. end;
  477. else
  478. consume(_SEMICOLON);
  479. end;
  480. end;
  481. { Write tables if we are the typesym that defines
  482. this type. This will not be done for simple type renamings }
  483. if (tt.def.typesym=newtype) then
  484. begin
  485. { file position }
  486. oldfilepos:=aktfilepos;
  487. aktfilepos:=newtype.fileinfo;
  488. { generate persistent init/final tables when it's declared in the interface so it can
  489. be reused in other used }
  490. if current_module.in_interface and
  491. ((is_class(tt.def) and
  492. tobjectdef(tt.def).members_need_inittable) or
  493. tt.def.needs_inittable) then
  494. generate_inittable(newtype);
  495. { for objects we should write the vmt and interfaces.
  496. This need to be done after the rtti has been written, because
  497. it can contain a reference to that data (PFV)
  498. This is not for forward classes }
  499. if (tt.def.deftype=objectdef) and
  500. not(oo_is_forward in tobjectdef(tt.def).objectoptions) then
  501. begin
  502. ch:=cclassheader.create(tobjectdef(tt.def));
  503. { generate and check virtual methods, must be done
  504. before RTTI is written }
  505. ch.genvmt;
  506. { generate rtti info if published items are available }
  507. if (oo_can_have_published in tobjectdef(tt.def).objectoptions) then
  508. generate_rtti(newtype);
  509. if is_interface(tobjectdef(tt.def)) then
  510. ch.writeinterfaceids;
  511. if (oo_has_vmt in tobjectdef(tt.def).objectoptions) then
  512. ch.writevmt;
  513. ch.free;
  514. end;
  515. aktfilepos:=oldfilepos;
  516. end;
  517. until token<>_ID;
  518. typecanbeforward:=false;
  519. symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  520. block_type:=old_block_type;
  521. end;
  522. procedure var_dec;
  523. { parses variable declarations and inserts them in }
  524. { the top symbol table of symtablestack }
  525. begin
  526. consume(_VAR);
  527. read_var_decs(false,false,false);
  528. end;
  529. procedure threadvar_dec;
  530. { parses thread variable declarations and inserts them in }
  531. { the top symbol table of symtablestack }
  532. begin
  533. consume(_THREADVAR);
  534. if not(symtablestack.symtabletype in [staticsymtable,globalsymtable]) then
  535. message(parser_e_threadvars_only_sg);
  536. if not(cs_threading in aktmoduleswitches) and
  537. not(cs_compilesystem in aktmoduleswitches) then
  538. Comment(V_Error,'Threading is turned off');
  539. read_var_decs(false,false,true);
  540. end;
  541. procedure resourcestring_dec;
  542. var
  543. orgname : stringid;
  544. p : tnode;
  545. storetokenpos,filepos : tfileposinfo;
  546. old_block_type : tblock_type;
  547. sp : pchar;
  548. begin
  549. consume(_RESOURCESTRING);
  550. if not(symtablestack.symtabletype in [staticsymtable,globalsymtable]) then
  551. message(parser_e_resourcestring_only_sg);
  552. old_block_type:=block_type;
  553. block_type:=bt_const;
  554. repeat
  555. orgname:=orgpattern;
  556. filepos:=akttokenpos;
  557. consume(_ID);
  558. case token of
  559. _EQUAL:
  560. begin
  561. consume(_EQUAL);
  562. p:=comp_expr(true);
  563. storetokenpos:=akttokenpos;
  564. akttokenpos:=filepos;
  565. case p.nodetype of
  566. ordconstn:
  567. begin
  568. if is_constcharnode(p) then
  569. begin
  570. getmem(sp,2);
  571. sp[0]:=chr(tordconstnode(p).value);
  572. sp[1]:=#0;
  573. symtablestack.insert(tconstsym.create_string(orgname,constresourcestring,sp,1));
  574. end
  575. else
  576. Message(cg_e_illegal_expression);
  577. end;
  578. stringconstn:
  579. begin
  580. getmem(sp,tstringconstnode(p).len+1);
  581. move(tstringconstnode(p).value_str^,sp^,tstringconstnode(p).len+1);
  582. symtablestack.insert(tconstsym.create_string(orgname,constresourcestring,sp,tstringconstnode(p).len));
  583. end;
  584. else
  585. Message(cg_e_illegal_expression);
  586. end;
  587. akttokenpos:=storetokenpos;
  588. consume(_SEMICOLON);
  589. p.free;
  590. end;
  591. else consume(_EQUAL);
  592. end;
  593. until token<>_ID;
  594. block_type:=old_block_type;
  595. end;
  596. end.
  597. {
  598. $Log$
  599. Revision 1.69 2003-09-23 17:56:05 peter
  600. * locals and paras are allocated in the code generation
  601. * tvarsym.localloc contains the location of para/local when
  602. generating code for the current procedure
  603. Revision 1.68 2003/07/02 22:18:04 peter
  604. * paraloc splitted in callerparaloc,calleeparaloc
  605. * sparc calling convention updates
  606. Revision 1.67 2003/04/27 11:21:33 peter
  607. * aktprocdef renamed to current_procdef
  608. * procinfo renamed to current_procinfo
  609. * procinfo will now be stored in current_module so it can be
  610. cleaned up properly
  611. * gen_main_procsym changed to create_main_proc and release_main_proc
  612. to also generate a tprocinfo structure
  613. * fixed unit implicit initfinal
  614. Revision 1.66 2003/04/27 07:29:50 peter
  615. * current_procdef cleanup, current_procdef is now always nil when parsing
  616. a new procdef declaration
  617. * aktprocsym removed
  618. * lexlevel removed, use symtable.symtablelevel instead
  619. * implicit init/final code uses the normal genentry/genexit
  620. * funcret state checking updated for new funcret handling
  621. Revision 1.65 2003/04/01 16:17:15 peter
  622. * reset symbol for unique types
  623. Revision 1.64 2003/01/05 15:54:15 florian
  624. + added proper support of type = type <type>; for simple types
  625. Revision 1.63 2002/12/29 14:57:50 peter
  626. * unit loading changed to first register units and load them
  627. afterwards. This is needed to support uses xxx in yyy correctly
  628. * unit dependency check fixed
  629. Revision 1.62 2002/12/05 19:27:40 carl
  630. - remove lower in hint
  631. Revision 1.61 2002/11/25 18:43:32 carl
  632. - removed the invalid if <> checking (Delphi is strange on this)
  633. + implemented abstract warning on instance creation of class with
  634. abstract methods.
  635. * some error message cleanups
  636. Revision 1.60 2002/11/23 22:50:06 carl
  637. * some small speed optimizations
  638. + added several new warnings/hints
  639. Revision 1.59 2002/11/17 16:31:56 carl
  640. * memory optimization (3-4%) : cleanup of tai fields,
  641. cleanup of tdef and tsym fields.
  642. * make it work for m68k
  643. Revision 1.58 2002/11/15 16:29:30 peter
  644. * made tasmsymbol.refs private (merged)
  645. Revision 1.57 2002/10/20 15:34:16 peter
  646. * removed df_unique flag. It breaks code. For a good type=type <id>
  647. a def copy is required
  648. Revision 1.56 2002/10/19 15:09:25 peter
  649. + tobjectdef.members_need_inittable that is used to generate only the
  650. inittable when it is really used. This saves a lot of useless calls
  651. to fpc_finalize when destroying classes
  652. Revision 1.55 2002/10/14 19:45:02 peter
  653. * only allow threadvar when threading switch is defined
  654. Revision 1.54 2002/10/06 12:25:05 florian
  655. + proper support of type <id> = type <another id>;
  656. Revision 1.53 2002/08/25 19:25:19 peter
  657. * sym.insert_in_data removed
  658. * symtable.insertvardata/insertconstdata added
  659. * removed insert_in_data call from symtable.insert, it needs to be
  660. called separatly. This allows to deref the address calculation
  661. * procedures now calculate the parast addresses after the procedure
  662. directives are parsed. This fixes the cdecl parast problem
  663. * push_addr_param has an extra argument that specifies if cdecl is used
  664. or not
  665. Revision 1.52 2002/08/12 15:08:40 carl
  666. + stab register indexes for powerpc (moved from gdb to cpubase)
  667. + tprocessor enumeration moved to cpuinfo
  668. + linker in target_info is now a class
  669. * many many updates for m68k (will soon start to compile)
  670. - removed some ifdef or correct them for correct cpu
  671. Revision 1.51 2002/08/11 14:32:27 peter
  672. * renamed current_library to objectlibrary
  673. Revision 1.50 2002/08/11 13:24:12 peter
  674. * saving of asmsymbols in ppu supported
  675. * asmsymbollist global is removed and moved into a new class
  676. tasmlibrarydata that will hold the info of a .a file which
  677. corresponds with a single module. Added librarydata to tmodule
  678. to keep the library info stored for the module. In the future the
  679. objectfiles will also be stored to the tasmlibrarydata class
  680. * all getlabel/newasmsymbol and friends are moved to the new class
  681. Revision 1.49 2002/07/29 21:23:43 florian
  682. * more fixes for the ppc
  683. + wrappers for the tcnvnode.first_* stuff introduced
  684. Revision 1.48 2002/07/01 18:46:25 peter
  685. * internal linker
  686. * reorganized aasm layer
  687. Revision 1.47 2002/06/12 13:20:29 jonas
  688. * fix from Florian for init/final info of forward classes
  689. Revision 1.46 2002/05/18 13:34:12 peter
  690. * readded missing revisions
  691. Revision 1.45 2002/05/16 19:46:42 carl
  692. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  693. + try to fix temp allocation (still in ifdef)
  694. + generic constructor calls
  695. + start of tassembler / tmodulebase class cleanup
  696. Revision 1.43 2002/05/12 16:53:08 peter
  697. * moved entry and exitcode to ncgutil and cgobj
  698. * foreach gets extra argument for passing local data to the
  699. iterator function
  700. * -CR checks also class typecasts at runtime by changing them
  701. into as
  702. * fixed compiler to cycle with the -CR option
  703. * fixed stabs with elf writer, finally the global variables can
  704. be watched
  705. * removed a lot of routines from cga unit and replaced them by
  706. calls to cgobj
  707. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  708. u32bit then the other is typecasted also to u32bit without giving
  709. a rangecheck warning/error.
  710. * fixed pascal calling method with reversing also the high tree in
  711. the parast, detected by tcalcst3 test
  712. Revision 1.42 2002/04/19 15:46:02 peter
  713. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  714. in most cases and not written to the ppu
  715. * add mangeledname_prefix() routine to generate the prefix of
  716. manglednames depending on the current procedure, object and module
  717. * removed static procprefix since the mangledname is now build only
  718. on demand from tprocdef.mangledname
  719. Revision 1.41 2002/03/04 17:54:59 peter
  720. * allow oridinal labels again
  721. }