pdecl.pas 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871
  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 property_dec;
  35. procedure resourcestring_dec;
  36. implementation
  37. uses
  38. { common }
  39. cutils,cclasses,
  40. { global }
  41. globtype,tokens,verbose,
  42. systems,
  43. { aasm }
  44. aasmbase,aasmtai,fmodule,
  45. { symtable }
  46. symconst,symbase,symtype,symdef,symtable,paramgr,
  47. { pass 1 }
  48. nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nobj,
  49. { codegen }
  50. ncgutil,
  51. {$ifdef GDB}
  52. gdb,
  53. {$endif GDB}
  54. { parser }
  55. scanner,
  56. pbase,pexpr,ptype,ptconst,pdecsub,pdecvar,pdecobj,
  57. { cpu-information }
  58. cpuinfo
  59. ;
  60. function readconstant(const orgname:string;const filepos:tfileposinfo):tconstsym;
  61. var
  62. hp : tconstsym;
  63. p : tnode;
  64. ps : pconstset;
  65. pd : pbestreal;
  66. pg : pguid;
  67. sp : pchar;
  68. storetokenpos : tfileposinfo;
  69. begin
  70. readconstant:=nil;
  71. if orgname='' then
  72. internalerror(9584582);
  73. hp:=nil;
  74. p:=comp_expr(true);
  75. storetokenpos:=akttokenpos;
  76. akttokenpos:=filepos;
  77. case p.nodetype of
  78. ordconstn:
  79. begin
  80. if p.resulttype.def.deftype=pointerdef then
  81. hp:=tconstsym.create_ordptr(orgname,constpointer,tordconstnode(p).value,p.resulttype)
  82. else
  83. hp:=tconstsym.create_ord(orgname,constord,tordconstnode(p).value,p.resulttype);
  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,p.resulttype);
  96. end;
  97. setconstn :
  98. begin
  99. new(ps);
  100. ps^:=tsetconstnode(p).value_set^;
  101. hp:=tconstsym.create_ptr(orgname,constset,ps,p.resulttype);
  102. end;
  103. pointerconstn :
  104. begin
  105. hp:=tconstsym.create_ordptr(orgname,constpointer,tpointerconstnode(p).value,p.resulttype);
  106. end;
  107. niln :
  108. begin
  109. hp:=tconstsym.create_ord(orgname,constnil,0,p.resulttype);
  110. end;
  111. typen :
  112. begin
  113. if is_interface(p.resulttype.def) then
  114. begin
  115. if assigned(tobjectdef(p.resulttype.def).iidguid) then
  116. begin
  117. new(pg);
  118. pg^:=tobjectdef(p.resulttype.def).iidguid^;
  119. hp:=tconstsym.create_ptr(orgname,constguid,pg,p.resulttype);
  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,'',false);
  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. insertconstdata(ttypedconstsym(sym));
  178. { procvar can have proc directives, but not type references }
  179. if (tt.def.deftype=procvardef) and
  180. (tt.sym=nil) then
  181. begin
  182. { support p : procedure;stdcall=nil; }
  183. if try_to_consume(_SEMICOLON) then
  184. begin
  185. if is_proc_directive(token,true) then
  186. parse_var_proc_directives(sym)
  187. else
  188. begin
  189. Message(parser_e_proc_directive_expected);
  190. skipequal:=true;
  191. end;
  192. end
  193. else
  194. { support p : procedure stdcall=nil; }
  195. begin
  196. if is_proc_directive(token,true) then
  197. parse_var_proc_directives(sym);
  198. end;
  199. { add default calling convention }
  200. handle_calling_convention(tabstractprocdef(tt.def));
  201. calc_parast(tprocvardef(tt.def));
  202. end;
  203. if not skipequal then
  204. begin
  205. { get init value }
  206. consume(_EQUAL);
  207. readtypedconst(tt,ttypedconstsym(sym),(cs_typed_const_writable in aktlocalswitches));
  208. try_consume_hintdirective(sym.symoptions);
  209. consume(_SEMICOLON);
  210. end;
  211. end;
  212. else
  213. { generate an error }
  214. consume(_EQUAL);
  215. end;
  216. until token<>_ID;
  217. block_type:=old_block_type;
  218. end;
  219. procedure label_dec;
  220. var
  221. hl : tasmlabel;
  222. begin
  223. consume(_LABEL);
  224. if not(cs_support_goto in aktmoduleswitches) then
  225. Message(sym_e_goto_and_label_not_supported);
  226. repeat
  227. if not(token in [_ID,_INTCONST]) then
  228. consume(_ID)
  229. else
  230. begin
  231. objectlibrary.getlabel(hl);
  232. if token=_ID then
  233. symtablestack.insert(tlabelsym.create(orgpattern,hl))
  234. else
  235. symtablestack.insert(tlabelsym.create(pattern,hl));
  236. consume(token);
  237. end;
  238. if token<>_SEMICOLON then consume(_COMMA);
  239. until not(token in [_ID,_INTCONST]);
  240. consume(_SEMICOLON);
  241. end;
  242. { search in symtablestack used, but not defined type }
  243. procedure resolve_type_forward(p : tnamedindexitem;arg:pointer);
  244. var
  245. hpd,pd : tdef;
  246. stpos : tfileposinfo;
  247. again : boolean;
  248. srsym : tsym;
  249. srsymtable : tsymtable;
  250. {$ifdef gdb_notused}
  251. stab_str:Pchar;
  252. {$endif gdb_notused}
  253. begin
  254. { Check only typesyms or record/object fields }
  255. case tsym(p).typ of
  256. typesym :
  257. pd:=ttypesym(p).restype.def;
  258. varsym :
  259. if (tsym(p).owner.symtabletype in [objectsymtable,recordsymtable]) then
  260. pd:=tvarsym(p).vartype.def
  261. else
  262. exit;
  263. else
  264. exit;
  265. end;
  266. repeat
  267. again:=false;
  268. case pd.deftype of
  269. arraydef :
  270. begin
  271. { elementtype could also be defined using a forwarddef }
  272. pd:=tarraydef(pd).elementtype.def;
  273. again:=true;
  274. end;
  275. pointerdef,
  276. classrefdef :
  277. begin
  278. { classrefdef inherits from pointerdef }
  279. hpd:=tpointerdef(pd).pointertype.def;
  280. { still a forward def ? }
  281. if hpd.deftype=forwarddef then
  282. begin
  283. { try to resolve the forward }
  284. { get the correct position for it }
  285. stpos:=akttokenpos;
  286. akttokenpos:=tforwarddef(hpd).forwardpos;
  287. resolving_forward:=true;
  288. make_ref:=false;
  289. if not assigned(tforwarddef(hpd).tosymname) then
  290. internalerror(20021120);
  291. searchsym(tforwarddef(hpd).tosymname^,srsym,srsymtable);
  292. make_ref:=true;
  293. resolving_forward:=false;
  294. akttokenpos:=stpos;
  295. { we don't need the forwarddef anymore, dispose it }
  296. hpd.free;
  297. tpointerdef(pd).pointertype.def:=nil; { if error occurs }
  298. { was a type sym found ? }
  299. if assigned(srsym) and
  300. (srsym.typ=typesym) then
  301. begin
  302. tpointerdef(pd).pointertype.setsym(srsym);
  303. { avoid wrong unused warnings web bug 801 PM }
  304. inc(ttypesym(srsym).refs);
  305. {$ifdef GDB_UNUSED}
  306. if (cs_debuginfo in aktmoduleswitches) and assigned(debuglist) and
  307. (tsym(p).owner.symtabletype in [globalsymtable,staticsymtable]) then
  308. begin
  309. ttypesym(p).isusedinstab:=true;
  310. { ttypesym(p).concatstabto(debuglist);}
  311. {not stabs for forward defs }
  312. if not Ttypesym(p).isstabwritten then
  313. begin
  314. if Ttypesym(p).restype.def.typesym=p then
  315. Tstoreddef(Ttypesym(p).restype.def).concatstabto(debuglist)
  316. else
  317. begin
  318. stab_str:=Ttypesym(p).stabstring;
  319. if assigned(stab_str) then
  320. debuglist.concat(Tai_stabs.create(stab_str));
  321. Ttypesym(p).isstabwritten:=true;
  322. end;
  323. end;
  324. end;
  325. {$endif GDB_UNUSED}
  326. { we need a class type for classrefdef }
  327. if (pd.deftype=classrefdef) and
  328. not(is_class(ttypesym(srsym).restype.def)) then
  329. Message1(type_e_class_type_expected,ttypesym(srsym).restype.def.typename);
  330. end
  331. else
  332. begin
  333. MessagePos1(tsym(p).fileinfo,sym_e_forward_type_not_resolved,tsym(p).realname);
  334. { try to recover }
  335. tpointerdef(pd).pointertype:=generrortype;
  336. end;
  337. end;
  338. end;
  339. recorddef :
  340. trecorddef(pd).symtable.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  341. objectdef :
  342. begin
  343. if not(m_fpc in aktmodeswitches) and
  344. (oo_is_forward in tobjectdef(pd).objectoptions) then
  345. begin
  346. { only give an error as the implementation may follow in an
  347. other type block which is allowed by FPC modes }
  348. MessagePos1(tsym(p).fileinfo,sym_e_forward_type_not_resolved,tsym(p).realname);
  349. end
  350. else
  351. begin
  352. { Check all fields of the object declaration, but don't
  353. check objectdefs in objects/records, because these
  354. can't exist (anonymous objects aren't allowed) }
  355. if not(tsym(p).owner.symtabletype in [objectsymtable,recordsymtable]) then
  356. tobjectdef(pd).symtable.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  357. end;
  358. end;
  359. end;
  360. until not again;
  361. end;
  362. { reads a type declaration to the symbol table }
  363. procedure type_dec;
  364. var
  365. typename,orgtypename : stringid;
  366. newtype : ttypesym;
  367. sym : tsym;
  368. srsymtable : tsymtable;
  369. tt : ttype;
  370. oldfilepos,
  371. defpos,storetokenpos : tfileposinfo;
  372. old_block_type : tblock_type;
  373. ch : tclassheader;
  374. unique,istyperenaming : boolean;
  375. begin
  376. old_block_type:=block_type;
  377. block_type:=bt_type;
  378. consume(_TYPE);
  379. typecanbeforward:=true;
  380. repeat
  381. typename:=pattern;
  382. orgtypename:=orgpattern;
  383. defpos:=akttokenpos;
  384. istyperenaming:=false;
  385. consume(_ID);
  386. consume(_EQUAL);
  387. { support 'ttype=type word' syntax }
  388. unique:=try_to_consume(_TYPE);
  389. { is the type already defined? }
  390. searchsym(typename,sym,srsymtable);
  391. newtype:=nil;
  392. { found a symbol with this name? }
  393. if assigned(sym) then
  394. begin
  395. if (sym.typ=typesym) then
  396. begin
  397. if ((token=_CLASS) or
  398. (token=_INTERFACE)) and
  399. (assigned(ttypesym(sym).restype.def)) and
  400. is_class_or_interface(ttypesym(sym).restype.def) and
  401. (oo_is_forward in tobjectdef(ttypesym(sym).restype.def).objectoptions) then
  402. begin
  403. { we can ignore the result }
  404. { the definition is modified }
  405. object_dec(orgtypename,tobjectdef(ttypesym(sym).restype.def));
  406. newtype:=ttypesym(sym);
  407. tt:=newtype.restype;
  408. end
  409. else
  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,false);
  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,true) then
  467. consume(_SEMICOLON);
  468. parse_var_proc_directives(tsym(newtype));
  469. handle_calling_convention(tprocvardef(tt.def));
  470. calc_parast(tprocvardef(tt.def));
  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) then
  502. with Tobjectdef(tt.def) do
  503. begin
  504. if not(oo_is_forward in objectoptions) then
  505. begin
  506. ch:=cclassheader.create(tobjectdef(tt.def));
  507. { generate and check virtual methods, must be done
  508. before RTTI is written }
  509. ch.genvmt;
  510. { Generate RTTI for class }
  511. generate_rtti(newtype);
  512. if is_interface(tobjectdef(tt.def)) then
  513. ch.writeinterfaceids;
  514. if (oo_has_vmt in objectoptions) then
  515. ch.writevmt;
  516. ch.free;
  517. end;
  518. end
  519. else
  520. begin
  521. { Always generate RTTI info for all types. This is to have typeinfo() return
  522. the same pointer }
  523. generate_rtti(newtype);
  524. end;
  525. aktfilepos:=oldfilepos;
  526. end;
  527. until token<>_ID;
  528. typecanbeforward:=false;
  529. symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}resolve_type_forward,nil);
  530. block_type:=old_block_type;
  531. end;
  532. procedure var_dec;
  533. { parses variable declarations and inserts them in }
  534. { the top symbol table of symtablestack }
  535. begin
  536. consume(_VAR);
  537. read_var_decs(false,false,false);
  538. end;
  539. procedure property_dec;
  540. var
  541. old_block_type : tblock_type;
  542. begin
  543. consume(_PROPERTY);
  544. if not(symtablestack.symtabletype in [staticsymtable,globalsymtable]) then
  545. message(parser_e_resourcestring_only_sg);
  546. old_block_type:=block_type;
  547. block_type:=bt_const;
  548. repeat
  549. read_property_dec(nil);
  550. consume(_SEMICOLON);
  551. until token<>_ID;
  552. block_type:=old_block_type;
  553. end;
  554. procedure threadvar_dec;
  555. { parses thread variable declarations and inserts them in }
  556. { the top symbol table of symtablestack }
  557. begin
  558. consume(_THREADVAR);
  559. if not(symtablestack.symtabletype in [staticsymtable,globalsymtable]) then
  560. message(parser_e_threadvars_only_sg);
  561. read_var_decs(false,false,true);
  562. end;
  563. procedure resourcestring_dec;
  564. var
  565. orgname : stringid;
  566. p : tnode;
  567. storetokenpos,filepos : tfileposinfo;
  568. old_block_type : tblock_type;
  569. sp : pchar;
  570. begin
  571. consume(_RESOURCESTRING);
  572. if not(symtablestack.symtabletype in [staticsymtable,globalsymtable]) then
  573. message(parser_e_resourcestring_only_sg);
  574. old_block_type:=block_type;
  575. block_type:=bt_const;
  576. repeat
  577. orgname:=orgpattern;
  578. filepos:=akttokenpos;
  579. consume(_ID);
  580. case token of
  581. _EQUAL:
  582. begin
  583. consume(_EQUAL);
  584. p:=comp_expr(true);
  585. storetokenpos:=akttokenpos;
  586. akttokenpos:=filepos;
  587. case p.nodetype of
  588. ordconstn:
  589. begin
  590. if is_constcharnode(p) then
  591. begin
  592. getmem(sp,2);
  593. sp[0]:=chr(tordconstnode(p).value);
  594. sp[1]:=#0;
  595. symtablestack.insert(tconstsym.create_string(orgname,constresourcestring,sp,1));
  596. end
  597. else
  598. Message(cg_e_illegal_expression);
  599. end;
  600. stringconstn:
  601. with Tstringconstnode(p) do
  602. begin
  603. getmem(sp,len+1);
  604. move(value_str^,sp^,len+1);
  605. symtablestack.insert(tconstsym.create_string(orgname,constresourcestring,sp,len));
  606. end;
  607. else
  608. Message(cg_e_illegal_expression);
  609. end;
  610. akttokenpos:=storetokenpos;
  611. consume(_SEMICOLON);
  612. p.free;
  613. end;
  614. else consume(_EQUAL);
  615. end;
  616. until token<>_ID;
  617. block_type:=old_block_type;
  618. end;
  619. end.
  620. {
  621. $Log$
  622. Revision 1.85 2004-03-23 22:34:49 peter
  623. * constants ordinals now always have a type assigned
  624. * integer constants have the smallest type, unsigned prefered over
  625. signed
  626. Revision 1.84 2004/03/20 20:55:36 florian
  627. + implemented cdecl'd varargs on arm
  628. + -dCMEM supported by the compiler
  629. * label/goto asmsymbol type with -dextdebug fixed
  630. Revision 1.83 2004/03/08 22:07:47 peter
  631. * stabs updates to write stabs for def for all implictly used
  632. units
  633. Revision 1.82 2004/02/20 19:49:21 daniel
  634. * Message system uses open arrays internally
  635. * Bugfix for string handling in array constructor node
  636. * Micro code reductions in pdecl.pas
  637. Revision 1.81 2004/02/17 19:37:16 daniel
  638. * No longer treat threadvar is normakl var if threading off
  639. Revision 1.80 2004/02/17 17:38:11 daniel
  640. * Enable threadvars for all modes
  641. Revision 1.79 2004/02/12 15:54:03 peter
  642. * make extcycle is working again
  643. Revision 1.78 2004/02/11 19:59:06 peter
  644. * fix compilation without GDB
  645. Revision 1.77 2004/01/31 22:48:31 daniel
  646. * Fix stabs generation problem reported by Jonas
  647. Revision 1.76 2004/01/31 18:40:15 daniel
  648. * Last steps before removal of aasmtai dependency in symsym can be
  649. accomplished.
  650. Revision 1.75 2003/12/15 21:25:48 peter
  651. * reg allocations for imaginary register are now inserted just
  652. before reg allocation
  653. * tregister changed to enum to allow compile time check
  654. * fixed several tregister-tsuperregister errors
  655. Revision 1.74 2003/12/12 12:09:40 marco
  656. * always generate RTTI patch from peter
  657. Revision 1.73 2003/12/10 16:37:01 peter
  658. * global property support for fpc modes
  659. Revision 1.72 2003/11/12 15:48:48 peter
  660. * don't give redefinition warning for forward classes
  661. Revision 1.71 2003/10/03 14:45:09 peter
  662. * more proc directive for procvar fixes
  663. Revision 1.70 2003/10/02 21:13:09 peter
  664. * procvar directive parsing fixes
  665. Revision 1.69 2003/09/23 17:56:05 peter
  666. * locals and paras are allocated in the code generation
  667. * tvarsym.localloc contains the location of para/local when
  668. generating code for the current procedure
  669. Revision 1.68 2003/07/02 22:18:04 peter
  670. * paraloc splitted in callerparaloc,calleeparaloc
  671. * sparc calling convention updates
  672. Revision 1.67 2003/04/27 11:21:33 peter
  673. * aktprocdef renamed to current_procdef
  674. * procinfo renamed to current_procinfo
  675. * procinfo will now be stored in current_module so it can be
  676. cleaned up properly
  677. * gen_main_procsym changed to create_main_proc and release_main_proc
  678. to also generate a tprocinfo structure
  679. * fixed unit implicit initfinal
  680. Revision 1.66 2003/04/27 07:29:50 peter
  681. * current_procdef cleanup, current_procdef is now always nil when parsing
  682. a new procdef declaration
  683. * aktprocsym removed
  684. * lexlevel removed, use symtable.symtablelevel instead
  685. * implicit init/final code uses the normal genentry/genexit
  686. * funcret state checking updated for new funcret handling
  687. Revision 1.65 2003/04/01 16:17:15 peter
  688. * reset symbol for unique types
  689. Revision 1.64 2003/01/05 15:54:15 florian
  690. + added proper support of type = type <type>; for simple types
  691. Revision 1.63 2002/12/29 14:57:50 peter
  692. * unit loading changed to first register units and load them
  693. afterwards. This is needed to support uses xxx in yyy correctly
  694. * unit dependency check fixed
  695. Revision 1.62 2002/12/05 19:27:40 carl
  696. - remove lower in hint
  697. Revision 1.61 2002/11/25 18:43:32 carl
  698. - removed the invalid if <> checking (Delphi is strange on this)
  699. + implemented abstract warning on instance creation of class with
  700. abstract methods.
  701. * some error message cleanups
  702. Revision 1.60 2002/11/23 22:50:06 carl
  703. * some small speed optimizations
  704. + added several new warnings/hints
  705. Revision 1.59 2002/11/17 16:31:56 carl
  706. * memory optimization (3-4%) : cleanup of tai fields,
  707. cleanup of tdef and tsym fields.
  708. * make it work for m68k
  709. Revision 1.58 2002/11/15 16:29:30 peter
  710. * made tasmsymbol.refs private (merged)
  711. Revision 1.57 2002/10/20 15:34:16 peter
  712. * removed df_unique flag. It breaks code. For a good type=type <id>
  713. a def copy is required
  714. Revision 1.56 2002/10/19 15:09:25 peter
  715. + tobjectdef.members_need_inittable that is used to generate only the
  716. inittable when it is really used. This saves a lot of useless calls
  717. to fpc_finalize when destroying classes
  718. Revision 1.55 2002/10/14 19:45:02 peter
  719. * only allow threadvar when threading switch is defined
  720. Revision 1.54 2002/10/06 12:25:05 florian
  721. + proper support of type <id> = type <another id>;
  722. Revision 1.53 2002/08/25 19:25:19 peter
  723. * sym.insert_in_data removed
  724. * symtable.insertvardata/insertconstdata added
  725. * removed insert_in_data call from symtable.insert, it needs to be
  726. called separatly. This allows to deref the address calculation
  727. * procedures now calculate the parast addresses after the procedure
  728. directives are parsed. This fixes the cdecl parast problem
  729. * push_addr_param has an extra argument that specifies if cdecl is used
  730. or not
  731. Revision 1.52 2002/08/12 15:08:40 carl
  732. + stab register indexes for powerpc (moved from gdb to cpubase)
  733. + tprocessor enumeration moved to cpuinfo
  734. + linker in target_info is now a class
  735. * many many updates for m68k (will soon start to compile)
  736. - removed some ifdef or correct them for correct cpu
  737. Revision 1.51 2002/08/11 14:32:27 peter
  738. * renamed current_library to objectlibrary
  739. Revision 1.50 2002/08/11 13:24:12 peter
  740. * saving of asmsymbols in ppu supported
  741. * asmsymbollist global is removed and moved into a new class
  742. tasmlibrarydata that will hold the info of a .a file which
  743. corresponds with a single module. Added librarydata to tmodule
  744. to keep the library info stored for the module. In the future the
  745. objectfiles will also be stored to the tasmlibrarydata class
  746. * all getlabel/newasmsymbol and friends are moved to the new class
  747. Revision 1.49 2002/07/29 21:23:43 florian
  748. * more fixes for the ppc
  749. + wrappers for the tcnvnode.first_* stuff introduced
  750. Revision 1.48 2002/07/01 18:46:25 peter
  751. * internal linker
  752. * reorganized aasm layer
  753. Revision 1.47 2002/06/12 13:20:29 jonas
  754. * fix from Florian for init/final info of forward classes
  755. Revision 1.46 2002/05/18 13:34:12 peter
  756. * readded missing revisions
  757. Revision 1.45 2002/05/16 19:46:42 carl
  758. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  759. + try to fix temp allocation (still in ifdef)
  760. + generic constructor calls
  761. + start of tassembler / tmodulebase class cleanup
  762. Revision 1.43 2002/05/12 16:53:08 peter
  763. * moved entry and exitcode to ncgutil and cgobj
  764. * foreach gets extra argument for passing local data to the
  765. iterator function
  766. * -CR checks also class typecasts at runtime by changing them
  767. into as
  768. * fixed compiler to cycle with the -CR option
  769. * fixed stabs with elf writer, finally the global variables can
  770. be watched
  771. * removed a lot of routines from cga unit and replaced them by
  772. calls to cgobj
  773. * u32bit-s32bit updates for and,or,xor nodes. When one element is
  774. u32bit then the other is typecasted also to u32bit without giving
  775. a rangecheck warning/error.
  776. * fixed pascal calling method with reversing also the high tree in
  777. the parast, detected by tcalcst3 test
  778. Revision 1.42 2002/04/19 15:46:02 peter
  779. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  780. in most cases and not written to the ppu
  781. * add mangeledname_prefix() routine to generate the prefix of
  782. manglednames depending on the current procedure, object and module
  783. * removed static procprefix since the mangledname is now build only
  784. on demand from tprocdef.mangledname
  785. Revision 1.41 2002/03/04 17:54:59 peter
  786. * allow oridinal labels again
  787. }