tcld.pas 26 KB

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