tcld.pas 25 KB

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