tcld.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  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.46 1999-09-27 23:45:01 peter
  466. * procinfo is now a pointer
  467. * support for result setting in sub procedure
  468. Revision 1.45 1999/09/17 17:14:12 peter
  469. * @procvar fixes for tp mode
  470. * @<id>:= gives now an error
  471. Revision 1.44 1999/09/11 19:47:26 florian
  472. * bug fix for @tobject.method, fixes bug 557, 605 and 606
  473. Revision 1.43 1999/09/11 09:08:34 florian
  474. * fixed bug 596
  475. * fixed some problems with procedure variables and procedures of object,
  476. especially in TP mode. Procedure of object doesn't apply only to classes,
  477. it is also allowed for objects !!
  478. Revision 1.42 1999/09/10 18:48:11 florian
  479. * some bug fixes (e.g. must_be_valid and procinfo^.funcret_is_valid)
  480. * most things for stored properties fixed
  481. Revision 1.41 1999/08/16 23:23:41 peter
  482. * arrayconstructor -> openarray type conversions for element types
  483. Revision 1.40 1999/08/13 21:33:17 peter
  484. * support for array constructors extended and more error checking
  485. Revision 1.39 1999/08/05 16:53:24 peter
  486. * V_Fatal=1, all other V_ are also increased
  487. * Check for local procedure when assigning procvar
  488. * fixed comment parsing because directives
  489. * oldtp mode directives better supported
  490. * added some messages to errore.msg
  491. Revision 1.38 1999/08/04 00:23:41 florian
  492. * renamed i386asm and i386base to cpuasm and cpubase
  493. Revision 1.37 1999/08/03 22:03:33 peter
  494. * moved bitmask constants to sets
  495. * some other type/const renamings
  496. Revision 1.36 1999/07/22 09:38:00 florian
  497. + resourcestring implemented
  498. + start of longstring support
  499. Revision 1.35 1999/06/17 13:19:59 pierre
  500. * merged from 0_99_12 branch
  501. Revision 1.34.2.1 1999/06/17 12:33:39 pierre
  502. * avoid warning with extdebug for arrayconstruct
  503. Revision 1.34 1999/06/01 19:26:39 peter
  504. * fixed bug 249
  505. Revision 1.33 1999/05/27 19:45:21 peter
  506. * removed oldasm
  507. * plabel -> pasmlabel
  508. * -a switches to source writing automaticly
  509. * assembler readers OOPed
  510. * asmsymbol automaticly external
  511. * jumptables and other label fixes for asm readers
  512. Revision 1.32 1999/05/23 18:42:22 florian
  513. * better error recovering in typed constants
  514. * some problems with arrays of const fixed, some problems
  515. due my previous
  516. - the location type of array constructor is now LOC_MEM
  517. - the pushing of high fixed
  518. - parameter copying fixed
  519. - zero temp. allocation removed
  520. * small problem in the assembler writers fixed:
  521. ref to nil wasn't written correctly
  522. Revision 1.31 1999/05/19 15:26:41 florian
  523. * if a non local variables isn't initialized the compiler doesn't write
  524. any longer "local var. seems not to be ..."
  525. Revision 1.30 1999/05/19 10:31:55 florian
  526. * two bugs reported by Romio (bugs 13) are fixed:
  527. - empty array constructors are now handled correctly (e.g. for sysutils.format)
  528. - comparsion of ansistrings was sometimes coded wrong
  529. Revision 1.29 1999/05/17 23:51:45 peter
  530. * with temp vars now use a reference with a persistant temp instead
  531. of setting datasize
  532. Revision 1.27 1999/05/12 00:20:02 peter
  533. * removed R_DEFAULT_SEG
  534. * uniform float names
  535. Revision 1.26 1999/05/06 09:05:36 peter
  536. * generic write_float and str_float
  537. * fixed constant float conversions
  538. Revision 1.25 1999/05/01 13:24:54 peter
  539. * merged nasm compiler
  540. * old asm moved to oldasm/
  541. Revision 1.24 1999/04/28 06:02:17 florian
  542. * changes of Bruessel:
  543. + message handler can now take an explicit self
  544. * typinfo fixed: sometimes the type names weren't written
  545. * the type checking for pointer comparisations and subtraction
  546. and are now more strict (was also buggy)
  547. * small bug fix to link.pas to support compiling on another
  548. drive
  549. * probable bug in popt386 fixed: call/jmp => push/jmp
  550. transformation didn't count correctly the jmp references
  551. + threadvar support
  552. * warning if ln/sqrt gets an invalid constant argument
  553. Revision 1.23 1999/04/21 21:57:33 pierre
  554. * previous log corrected
  555. Revision 1.22 1999/04/21 16:31:47 pierre
  556. * some wrong code in firstfuncret corrected
  557. Revision 1.21 1999/04/01 21:59:57 peter
  558. * type error for array constructor with array,record as argument
  559. Revision 1.20 1999/03/24 23:17:39 peter
  560. * fixed bugs 212,222,225,227,229,231,233
  561. Revision 1.19 1999/03/18 11:21:52 peter
  562. * convert only to s32bit if integer or enum
  563. Revision 1.18 1999/03/16 21:02:10 peter
  564. * all array of const enum/ord are converted to s32bit
  565. Revision 1.17 1999/03/10 13:24:23 pierre
  566. * array of const type to definition field
  567. Revision 1.16 1999/02/22 02:15:52 peter
  568. * updates for ag386bin
  569. Revision 1.15 1999/02/15 13:13:19 pierre
  570. * fix for bug0216
  571. Revision 1.14 1999/01/27 00:13:58 florian
  572. * "procedure of object"-stuff fixed
  573. Revision 1.13 1999/01/21 16:41:07 pierre
  574. * fix for constructor inside with statements
  575. Revision 1.12 1998/12/30 13:41:19 peter
  576. * released valuepara
  577. Revision 1.11 1998/11/18 17:45:28 peter
  578. * fixes for VALUEPARA
  579. Revision 1.10 1998/11/18 15:44:23 peter
  580. * VALUEPARA for tp7 compatible value parameters
  581. Revision 1.9 1998/11/17 00:36:49 peter
  582. * more ansistring fixes
  583. Revision 1.8 1998/11/10 10:09:18 peter
  584. * va_list -> array of const
  585. Revision 1.7 1998/11/05 14:26:48 peter
  586. * fixed variant warning with was sometimes said with sets
  587. Revision 1.6 1998/10/19 08:55:12 pierre
  588. * wrong stabs info corrected once again !!
  589. + variable vmt offset with vmt field only if required
  590. implemented now !!!
  591. Revision 1.5 1998/10/06 20:49:12 peter
  592. * m68k compiler compiles again
  593. Revision 1.4 1998/09/28 11:07:40 peter
  594. + floatdef support for array of const
  595. Revision 1.3 1998/09/27 10:16:27 florian
  596. * type casts pchar<->ansistring fixed
  597. * ansistring[..] calls does now an unique call
  598. Revision 1.2 1998/09/24 15:13:48 peter
  599. * fixed type node which was always set to void :(
  600. Revision 1.1 1998/09/23 20:42:24 peter
  601. * splitted pass_1
  602. }