pdecl.pas 30 KB

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