tcld.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. {
  2. $Id$
  3. Copyright (c) 1993-98 by Florian Klaempfl
  4. Type checking and register allocation for load/assignment nodes
  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 tcld;
  19. interface
  20. uses
  21. tree;
  22. procedure firstload(var p : ptree);
  23. procedure firstassignment(var p : ptree);
  24. procedure firstfuncret(var p : ptree);
  25. procedure firstarrayconstructrange(var p:ptree);
  26. procedure firstarrayconstruct(var p : ptree);
  27. procedure firsttype(var p : ptree);
  28. implementation
  29. uses
  30. cobjects,verbose,globals,systems,
  31. symconst,symtable,aasm,types,
  32. hcodegen,htypechk,pass_1,
  33. tccnv,cpubase
  34. {$ifdef i386}
  35. ,tgeni386
  36. {$endif}
  37. ;
  38. {*****************************************************************************
  39. FirstLoad
  40. *****************************************************************************}
  41. procedure firstload(var p : ptree);
  42. var
  43. p1 : ptree;
  44. begin
  45. if (p^.symtable^.symtabletype=withsymtable) and
  46. (pwithsymtable(p^.symtable)^.direct_with) and
  47. (p^.symtableentry^.typ=varsym) then
  48. begin
  49. p1:=getcopy(ptree(pwithsymtable(p^.symtable)^.withrefnode));
  50. p1:=gensubscriptnode(pvarsym(p^.symtableentry),p1);
  51. putnode(p);
  52. p:=p1;
  53. firstpass(p);
  54. exit;
  55. end;
  56. p^.location.loc:=LOC_REFERENCE;
  57. p^.registers32:=0;
  58. p^.registersfpu:=0;
  59. {$ifdef SUPPORT_MMX}
  60. p^.registersmmx:=0;
  61. {$endif SUPPORT_MMX}
  62. if p^.symtableentry^.typ=funcretsym then
  63. begin
  64. p1:=genzeronode(funcretn);
  65. p1^.funcretprocinfo:=pprocinfo(pfuncretsym(p^.symtableentry)^.funcretprocinfo);
  66. p1^.retdef:=pfuncretsym(p^.symtableentry)^.funcretdef;
  67. firstpass(p1);
  68. putnode(p);
  69. p:=p1;
  70. exit;
  71. end;
  72. if p^.symtableentry^.typ=absolutesym then
  73. begin
  74. p^.resulttype:=pabsolutesym(p^.symtableentry)^.definition;
  75. if pabsolutesym(p^.symtableentry)^.abstyp=tovar then
  76. p^.symtableentry:=pabsolutesym(p^.symtableentry)^.ref;
  77. p^.symtable:=p^.symtableentry^.owner;
  78. p^.is_absolute:=true;
  79. end;
  80. case p^.symtableentry^.typ of
  81. absolutesym :;
  82. constsym:
  83. begin
  84. if pconstsym(p^.symtableentry)^.consttype=constresourcestring then
  85. begin
  86. p^.resulttype:=cansistringdef;
  87. p^.location.loc:=LOC_MEM;
  88. end
  89. else
  90. internalerror(22799);
  91. end;
  92. varsym :
  93. begin
  94. if not(p^.is_absolute) and (p^.resulttype=nil) then
  95. p^.resulttype:=pvarsym(p^.symtableentry)^.definition;
  96. if (p^.symtable^.symtabletype in [parasymtable,localsymtable]) and
  97. (lexlevel>p^.symtable^.symtablelevel) then
  98. begin
  99. { if the variable is in an other stackframe then we need
  100. a register to dereference }
  101. if (p^.symtable^.symtablelevel)>0 then
  102. begin
  103. p^.registers32:=1;
  104. { further, the variable can't be put into a register }
  105. {$ifdef INCLUDEOK}
  106. exclude(pvarsym(p^.symtableentry)^.varoptions,vo_regable);
  107. {$else}
  108. pvarsym(p^.symtableentry)^.varoptions:=pvarsym(p^.symtableentry)^.varoptions-[vo_regable];
  109. {$endif}
  110. end;
  111. end;
  112. if (pvarsym(p^.symtableentry)^.varspez=vs_const) then
  113. p^.location.loc:=LOC_MEM;
  114. { we need a register for call by reference parameters }
  115. if (pvarsym(p^.symtableentry)^.varspez=vs_var) or
  116. ((pvarsym(p^.symtableentry)^.varspez=vs_const) and
  117. push_addr_param(pvarsym(p^.symtableentry)^.definition)) or
  118. { call by value open arrays are also indirect addressed }
  119. is_open_array(pvarsym(p^.symtableentry)^.definition) then
  120. p^.registers32:=1;
  121. if p^.symtable^.symtabletype=withsymtable then
  122. inc(p^.registers32);
  123. if ([vo_is_thread_var,vo_is_dll_var]*pvarsym(p^.symtableentry)^.varoptions)<>[] then
  124. p^.registers32:=1;
  125. { a class variable is a pointer !!!
  126. yes, but we have to resolve the reference in an
  127. appropriate tree node (FK)
  128. if (pvarsym(p^.symtableentry)^.definition^.deftype=objectdef) and
  129. ((pobjectdef(pvarsym(p^.symtableentry)^.definition)^.options and oo_is_class)<>0) then
  130. p^.registers32:=1;
  131. }
  132. { count variable references }
  133. if must_be_valid and p^.is_first then
  134. begin
  135. if pvarsym(p^.symtableentry)^.varstate=vs_declared2 then
  136. if (assigned(pvarsym(p^.symtableentry)^.owner) and
  137. assigned(aktprocsym) and
  138. (pvarsym(p^.symtableentry)^.owner = aktprocsym^.definition^.localst)) then
  139. begin
  140. if p^.symtable^.symtabletype=localsymtable then
  141. CGMessage1(sym_n_uninitialized_local_variable,pvarsym(p^.symtableentry)^.name)
  142. else
  143. CGMessage1(sym_n_uninitialized_variable,pvarsym(p^.symtableentry)^.name);
  144. end;
  145. end;
  146. if count_ref then
  147. begin
  148. if (p^.is_first) then
  149. begin
  150. if pvarsym(p^.symtableentry)^.varstate=vs_declared2 then
  151. pvarsym(p^.symtableentry)^.varstate:=vs_used;
  152. p^.is_first:=false;
  153. end;
  154. end;
  155. { this will create problem with local var set by
  156. under_procedures
  157. if (assigned(pvarsym(p^.symtableentry)^.owner) and assigned(aktprocsym)
  158. and ((pvarsym(p^.symtableentry)^.owner = aktprocsym^.definition^.localst)
  159. or (pvarsym(p^.symtableentry)^.owner = aktprocsym^.definition^.localst))) then }
  160. if t_times<1 then
  161. inc(pvarsym(p^.symtableentry)^.refs)
  162. else
  163. inc(pvarsym(p^.symtableentry)^.refs,t_times);
  164. end;
  165. typedconstsym :
  166. if not p^.is_absolute then
  167. p^.resulttype:=ptypedconstsym(p^.symtableentry)^.definition;
  168. procsym :
  169. begin
  170. if assigned(pprocsym(p^.symtableentry)^.definition^.nextoverloaded) then
  171. CGMessage(parser_e_no_overloaded_procvars);
  172. p^.resulttype:=pprocsym(p^.symtableentry)^.definition;
  173. { if the owner of the procsym is a object, }
  174. { left must be set, if left isn't set }
  175. { it can be only self }
  176. { this code is only used in TP procvar mode }
  177. if not(assigned(p^.left)) and
  178. (pprocsym(p^.symtableentry)^.owner^.symtabletype=objectsymtable) then
  179. p^.left:=genselfnode(procinfo._class);
  180. { method pointer ? }
  181. if assigned(p^.left) then
  182. begin
  183. firstpass(p^.left);
  184. p^.registers32:=max(p^.registers32,p^.left^.registers32);
  185. p^.registersfpu:=max(p^.registersfpu,p^.left^.registersfpu);
  186. {$ifdef SUPPORT_MMX}
  187. p^.registersmmx:=max(p^.registersmmx,p^.left^.registersmmx);
  188. {$endif SUPPORT_MMX}
  189. end;
  190. end;
  191. else internalerror(3);
  192. end;
  193. end;
  194. {*****************************************************************************
  195. FirstAssignment
  196. *****************************************************************************}
  197. procedure firstassignment(var p : ptree);
  198. var
  199. store_valid : boolean;
  200. hp : ptree;
  201. begin
  202. store_valid:=must_be_valid;
  203. must_be_valid:=false;
  204. { must be made unique }
  205. set_unique(p^.left);
  206. { set we the function result? }
  207. set_funcret_is_valid(p^.left);
  208. firstpass(p^.left);
  209. if codegenerror then
  210. exit;
  211. { assignements to open arrays aren't allowed }
  212. if is_open_array(p^.left^.resulttype) then
  213. CGMessage(type_e_mismatch);
  214. { test if we can avoid copying string to temp
  215. as in s:=s+...; (PM) }
  216. {$ifdef dummyi386}
  217. if ((p^.right^.treetype=addn) or (p^.right^.treetype=subn)) and
  218. equal_trees(p^.left,p^.right^.left) and
  219. (ret_in_acc(p^.left^.resulttype)) and
  220. (not cs_rangechecking in aktmoduleswitches^) then
  221. begin
  222. disposetree(p^.right^.left);
  223. hp:=p^.right;
  224. p^.right:=p^.right^.right;
  225. if hp^.treetype=addn then
  226. p^.assigntyp:=at_plus
  227. else
  228. p^.assigntyp:=at_minus;
  229. putnode(hp);
  230. end;
  231. if p^.assigntyp<>at_normal then
  232. begin
  233. { for fpu type there is no faster way }
  234. if is_fpu(p^.left^.resulttype) then
  235. case p^.assigntyp of
  236. at_plus : p^.right:=gennode(addn,getcopy(p^.left),p^.right);
  237. at_minus : p^.right:=gennode(subn,getcopy(p^.left),p^.right);
  238. at_star : p^.right:=gennode(muln,getcopy(p^.left),p^.right);
  239. at_slash : p^.right:=gennode(slashn,getcopy(p^.left),p^.right);
  240. end;
  241. end;
  242. {$endif i386}
  243. must_be_valid:=true;
  244. firstpass(p^.right);
  245. must_be_valid:=store_valid;
  246. if codegenerror then
  247. exit;
  248. { some string functions don't need conversion, so treat them separatly }
  249. if is_shortstring(p^.left^.resulttype) and (assigned(p^.right^.resulttype)) then
  250. begin
  251. if not (is_shortstring(p^.right^.resulttype) or
  252. is_ansistring(p^.right^.resulttype) or
  253. is_char(p^.right^.resulttype)) then
  254. begin
  255. p^.right:=gentypeconvnode(p^.right,p^.left^.resulttype);
  256. firstpass(p^.right);
  257. if codegenerror then
  258. exit;
  259. end;
  260. { we call STRCOPY }
  261. procinfo.flags:=procinfo.flags or pi_do_call;
  262. hp:=p^.right;
  263. { test for s:=s+anything ... }
  264. { the problem is for
  265. s:=s+s+s;
  266. this is broken here !! }
  267. { while hp^.treetype=addn do hp:=hp^.left;
  268. if equal_trees(p^.left,hp) then
  269. begin
  270. p^.concat_string:=true;
  271. hp:=p^.right;
  272. while hp^.treetype=addn do
  273. begin
  274. hp^.use_strconcat:=true;
  275. hp:=hp^.left;
  276. end;
  277. end; }
  278. end
  279. else
  280. begin
  281. p^.right:=gentypeconvnode(p^.right,p^.left^.resulttype);
  282. firstpass(p^.right);
  283. if codegenerror then
  284. exit;
  285. end;
  286. { set assigned flag for varsyms }
  287. if (p^.left^.treetype=loadn) and
  288. (p^.left^.symtableentry^.typ=varsym) and
  289. (pvarsym(p^.left^.symtableentry)^.varstate=vs_declared) then
  290. pvarsym(p^.left^.symtableentry)^.varstate:=vs_assigned;
  291. { check if local proc/func is assigned to procvar }
  292. if p^.right^.resulttype^.deftype=procvardef then
  293. test_local_to_procvar(pprocvardef(p^.right^.resulttype),p^.left^.resulttype);
  294. p^.resulttype:=voiddef;
  295. {
  296. p^.registers32:=max(p^.left^.registers32,p^.right^.registers32);
  297. p^.registersfpu:=max(p^.left^.registersfpu,p^.right^.registersfpu);
  298. }
  299. p^.registers32:=p^.left^.registers32+p^.right^.registers32;
  300. p^.registersfpu:=max(p^.left^.registersfpu,p^.right^.registersfpu);
  301. {$ifdef SUPPORT_MMX}
  302. p^.registersmmx:=max(p^.left^.registersmmx,p^.right^.registersmmx);
  303. {$endif SUPPORT_MMX}
  304. end;
  305. {*****************************************************************************
  306. FirstFuncRet
  307. *****************************************************************************}
  308. procedure firstfuncret(var p : ptree);
  309. begin
  310. p^.resulttype:=p^.retdef;
  311. p^.location.loc:=LOC_REFERENCE;
  312. if ret_in_param(p^.retdef) or
  313. (@procinfo<>pprocinfo(p^.funcretprocinfo)) then
  314. p^.registers32:=1;
  315. { no claim if setting higher return value_str }
  316. if must_be_valid and
  317. (@procinfo=pprocinfo(p^.funcretprocinfo)) and
  318. not procinfo.funcret_is_valid then
  319. CGMessage(sym_w_function_result_not_set);
  320. {
  321. if count_ref then
  322. pprocinfo(p^.funcretprocinfo)^.funcret_is_valid:=true;
  323. }
  324. end;
  325. {*****************************************************************************
  326. FirstArrayConstructRange
  327. *****************************************************************************}
  328. procedure firstarrayconstructrange(var p:ptree);
  329. begin
  330. firstpass(p^.left);
  331. firstpass(p^.right);
  332. calcregisters(p,0,0,0);
  333. p^.resulttype:=p^.left^.resulttype;
  334. end;
  335. {*****************************************************************************
  336. FirstArrayConstruct
  337. *****************************************************************************}
  338. procedure firstarrayconstruct(var p : ptree);
  339. var
  340. pd : pdef;
  341. thp,
  342. chp,
  343. hp : ptree;
  344. len : longint;
  345. varia : boolean;
  346. begin
  347. { are we allowing array constructor? Then convert it to a set }
  348. if not allow_array_constructor then
  349. begin
  350. arrayconstructor_to_set(p);
  351. firstpass(p);
  352. exit;
  353. end;
  354. { only pass left tree, right tree contains next construct if any }
  355. pd:=p^.constructdef;
  356. len:=0;
  357. varia:=false;
  358. if assigned(p^.left) then
  359. begin
  360. hp:=p;
  361. while assigned(hp) do
  362. begin
  363. firstpass(hp^.left);
  364. if (not get_para_resulttype) and (not p^.novariaallowed) then
  365. begin
  366. case hp^.left^.resulttype^.deftype of
  367. enumdef :
  368. begin
  369. hp^.left:=gentypeconvnode(hp^.left,s32bitdef);
  370. firstpass(hp^.left);
  371. end;
  372. orddef :
  373. begin
  374. if is_integer(hp^.left^.resulttype) then
  375. begin
  376. hp^.left:=gentypeconvnode(hp^.left,s32bitdef);
  377. firstpass(hp^.left);
  378. end;
  379. end;
  380. floatdef :
  381. begin
  382. hp^.left:=gentypeconvnode(hp^.left,bestrealdef^);
  383. firstpass(hp^.left);
  384. end;
  385. stringdef :
  386. begin
  387. if p^.cargs then
  388. begin
  389. hp^.left:=gentypeconvnode(hp^.left,charpointerdef);
  390. firstpass(hp^.left);
  391. end;
  392. end;
  393. recorddef,
  394. arraydef :
  395. CGMessage(type_e_wrong_type_in_array_constructor);
  396. end;
  397. end;
  398. if (pd=nil) then
  399. pd:=hp^.left^.resulttype
  400. else
  401. begin
  402. if ((p^.novariaallowed) or (not varia)) and
  403. (not is_equal(pd,hp^.left^.resulttype)) then
  404. begin
  405. { if both should be equal try inserting a conversion }
  406. if p^.novariaallowed then
  407. begin
  408. hp^.left:=gentypeconvnode(hp^.left,pd);
  409. firstpass(hp^.left);
  410. end;
  411. varia:=true;
  412. end;
  413. end;
  414. inc(len);
  415. hp:=hp^.right;
  416. end;
  417. { swap the tree for cargs }
  418. if p^.cargs and (not p^.cargswap) then
  419. begin
  420. chp:=nil;
  421. hp:=p;
  422. while assigned(hp) do
  423. begin
  424. thp:=hp^.right;
  425. hp^.right:=chp;
  426. chp:=hp;
  427. hp:=thp;
  428. end;
  429. p:=chp;
  430. p^.cargs:=true;
  431. p^.cargswap:=true;
  432. end;
  433. end;
  434. calcregisters(p,0,0,0);
  435. { looks a little bit dangerous to me }
  436. { len-1 gives problems with is_open_array if len=0, }
  437. { is_open_array checks now for isconstructor (FK) }
  438. { skip if already done ! (PM) }
  439. if not assigned(p^.resulttype) or
  440. (p^.resulttype^.deftype<>arraydef) or
  441. not parraydef(p^.resulttype)^.IsConstructor or
  442. (parraydef(p^.resulttype)^.lowrange<>0) or
  443. (parraydef(p^.resulttype)^.highrange<>len-1) then
  444. p^.resulttype:=new(parraydef,init(0,len-1,s32bitdef));
  445. parraydef(p^.resulttype)^.definition:=pd;
  446. parraydef(p^.resulttype)^.IsConstructor:=true;
  447. parraydef(p^.resulttype)^.IsVariant:=varia;
  448. p^.location.loc:=LOC_MEM;
  449. end;
  450. {*****************************************************************************
  451. Type
  452. *****************************************************************************}
  453. procedure firsttype(var p : ptree);
  454. begin
  455. { do nothing, p^.resulttype is already set }
  456. end;
  457. end.
  458. {
  459. $Log$
  460. Revision 1.43 1999-09-11 09:08:34 florian
  461. * fixed bug 596
  462. * fixed some problems with procedure variables and procedures of object,
  463. especially in TP mode. Procedure of object doesn't apply only to classes,
  464. it is also allowed for objects !!
  465. Revision 1.42 1999/09/10 18:48:11 florian
  466. * some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid)
  467. * most things for stored properties fixed
  468. Revision 1.41 1999/08/16 23:23:41 peter
  469. * arrayconstructor -> openarray type conversions for element types
  470. Revision 1.40 1999/08/13 21:33:17 peter
  471. * support for array constructors extended and more error checking
  472. Revision 1.39 1999/08/05 16:53:24 peter
  473. * V_Fatal=1, all other V_ are also increased
  474. * Check for local procedure when assigning procvar
  475. * fixed comment parsing because directives
  476. * oldtp mode directives better supported
  477. * added some messages to errore.msg
  478. Revision 1.38 1999/08/04 00:23:41 florian
  479. * renamed i386asm and i386base to cpuasm and cpubase
  480. Revision 1.37 1999/08/03 22:03:33 peter
  481. * moved bitmask constants to sets
  482. * some other type/const renamings
  483. Revision 1.36 1999/07/22 09:38:00 florian
  484. + resourcestring implemented
  485. + start of longstring support
  486. Revision 1.35 1999/06/17 13:19:59 pierre
  487. * merged from 0_99_12 branch
  488. Revision 1.34.2.1 1999/06/17 12:33:39 pierre
  489. * avoid warning with extdebug for arrayconstruct
  490. Revision 1.34 1999/06/01 19:26:39 peter
  491. * fixed bug 249
  492. Revision 1.33 1999/05/27 19:45:21 peter
  493. * removed oldasm
  494. * plabel -> pasmlabel
  495. * -a switches to source writing automaticly
  496. * assembler readers OOPed
  497. * asmsymbol automaticly external
  498. * jumptables and other label fixes for asm readers
  499. Revision 1.32 1999/05/23 18:42:22 florian
  500. * better error recovering in typed constants
  501. * some problems with arrays of const fixed, some problems
  502. due my previous
  503. - the location type of array constructor is now LOC_MEM
  504. - the pushing of high fixed
  505. - parameter copying fixed
  506. - zero temp. allocation removed
  507. * small problem in the assembler writers fixed:
  508. ref to nil wasn't written correctly
  509. Revision 1.31 1999/05/19 15:26:41 florian
  510. * if a non local variables isn't initialized the compiler doesn't write
  511. any longer "local var. seems not to be ..."
  512. Revision 1.30 1999/05/19 10:31:55 florian
  513. * two bugs reported by Romio (bugs 13) are fixed:
  514. - empty array constructors are now handled correctly (e.g. for sysutils.format)
  515. - comparsion of ansistrings was sometimes coded wrong
  516. Revision 1.29 1999/05/17 23:51:45 peter
  517. * with temp vars now use a reference with a persistant temp instead
  518. of setting datasize
  519. Revision 1.27 1999/05/12 00:20:02 peter
  520. * removed R_DEFAULT_SEG
  521. * uniform float names
  522. Revision 1.26 1999/05/06 09:05:36 peter
  523. * generic write_float and str_float
  524. * fixed constant float conversions
  525. Revision 1.25 1999/05/01 13:24:54 peter
  526. * merged nasm compiler
  527. * old asm moved to oldasm/
  528. Revision 1.24 1999/04/28 06:02:17 florian
  529. * changes of Bruessel:
  530. + message handler can now take an explicit self
  531. * typinfo fixed: sometimes the type names weren't written
  532. * the type checking for pointer comparisations and subtraction
  533. and are now more strict (was also buggy)
  534. * small bug fix to link.pas to support compiling on another
  535. drive
  536. * probable bug in popt386 fixed: call/jmp => push/jmp
  537. transformation didn't count correctly the jmp references
  538. + threadvar support
  539. * warning if ln/sqrt gets an invalid constant argument
  540. Revision 1.23 1999/04/21 21:57:33 pierre
  541. * previous log corrected
  542. Revision 1.22 1999/04/21 16:31:47 pierre
  543. * some wrong code in firstfuncret corrected
  544. Revision 1.21 1999/04/01 21:59:57 peter
  545. * type error for array constructor with array,record as argument
  546. Revision 1.20 1999/03/24 23:17:39 peter
  547. * fixed bugs 212,222,225,227,229,231,233
  548. Revision 1.19 1999/03/18 11:21:52 peter
  549. * convert only to s32bit if integer or enum
  550. Revision 1.18 1999/03/16 21:02:10 peter
  551. * all array of const enum/ord are converted to s32bit
  552. Revision 1.17 1999/03/10 13:24:23 pierre
  553. * array of const type to definition field
  554. Revision 1.16 1999/02/22 02:15:52 peter
  555. * updates for ag386bin
  556. Revision 1.15 1999/02/15 13:13:19 pierre
  557. * fix for bug0216
  558. Revision 1.14 1999/01/27 00:13:58 florian
  559. * "procedure of object"-stuff fixed
  560. Revision 1.13 1999/01/21 16:41:07 pierre
  561. * fix for constructor inside with statements
  562. Revision 1.12 1998/12/30 13:41:19 peter
  563. * released valuepara
  564. Revision 1.11 1998/11/18 17:45:28 peter
  565. * fixes for VALUEPARA
  566. Revision 1.10 1998/11/18 15:44:23 peter
  567. * VALUEPARA for tp7 compatible value parameters
  568. Revision 1.9 1998/11/17 00:36:49 peter
  569. * more ansistring fixes
  570. Revision 1.8 1998/11/10 10:09:18 peter
  571. * va_list -> array of const
  572. Revision 1.7 1998/11/05 14:26:48 peter
  573. * fixed variant warning with was sometimes said with sets
  574. Revision 1.6 1998/10/19 08:55:12 pierre
  575. * wrong stabs info corrected once again !!
  576. + variable vmt offset with vmt field only if required
  577. implemented now !!!
  578. Revision 1.5 1998/10/06 20:49:12 peter
  579. * m68k compiler compiles again
  580. Revision 1.4 1998/09/28 11:07:40 peter
  581. + floatdef support for array of const
  582. Revision 1.3 1998/09/27 10:16:27 florian
  583. * type casts pchar<->ansistring fixed
  584. * ansistring[..] calls does now an unique call
  585. Revision 1.2 1998/09/24 15:13:48 peter
  586. * fixed type node which was always set to void :(
  587. Revision 1.1 1998/09/23 20:42:24 peter
  588. * splitted pass_1
  589. }