symsym.inc 76 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629
  1. {
  2. $Id$
  3. Copyright (c) 1993-98 by Florian Klaempfl, Pierre Muller
  4. Implementation for the symbols types of the symtable
  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. {****************************************************************************
  19. TSYM (base for all symtypes)
  20. ****************************************************************************}
  21. constructor tsym.init(const n : string);
  22. begin
  23. inherited initname(n);
  24. typ:=abstractsym;
  25. symoptions:=current_object_option;
  26. {$ifdef GDB}
  27. isstabwritten := false;
  28. {$endif GDB}
  29. fileinfo:=tokenpos;
  30. defref:=nil;
  31. lastwritten:=nil;
  32. refcount:=0;
  33. if (cs_browser in aktmoduleswitches) and make_ref then
  34. begin
  35. defref:=new(pref,init(defref,@tokenpos));
  36. inc(refcount);
  37. end;
  38. lastref:=defref;
  39. end;
  40. constructor tsym.load;
  41. begin
  42. inherited init;
  43. indexnr:=readword;
  44. setname(readstring);
  45. typ:=abstractsym;
  46. readsmallset(symoptions);
  47. readposinfo(fileinfo);
  48. lastref:=nil;
  49. defref:=nil;
  50. lastwritten:=nil;
  51. refcount:=0;
  52. {$ifdef GDB}
  53. isstabwritten := false;
  54. {$endif GDB}
  55. end;
  56. procedure tsym.load_references;
  57. var
  58. pos : tfileposinfo;
  59. move_last : boolean;
  60. begin
  61. move_last:=lastwritten=lastref;
  62. while (not current_ppu^.endofentry) do
  63. begin
  64. readposinfo(pos);
  65. inc(refcount);
  66. lastref:=new(pref,init(lastref,@pos));
  67. lastref^.is_written:=true;
  68. if refcount=1 then
  69. defref:=lastref;
  70. end;
  71. if move_last then
  72. lastwritten:=lastref;
  73. end;
  74. { big problem here :
  75. wrong refs were written because of
  76. interface parsing of other units PM
  77. moduleindex must be checked !! }
  78. function tsym.write_references : boolean;
  79. var
  80. ref : pref;
  81. symref_written,move_last : boolean;
  82. begin
  83. write_references:=false;
  84. if lastwritten=lastref then
  85. exit;
  86. { should we update lastref }
  87. move_last:=true;
  88. symref_written:=false;
  89. { write symbol refs }
  90. if assigned(lastwritten) then
  91. ref:=lastwritten
  92. else
  93. ref:=defref;
  94. while assigned(ref) do
  95. begin
  96. if ref^.moduleindex=current_module^.unit_index then
  97. begin
  98. { write address to this symbol }
  99. if not symref_written then
  100. begin
  101. writesymref(@self);
  102. symref_written:=true;
  103. end;
  104. writeposinfo(ref^.posinfo);
  105. ref^.is_written:=true;
  106. if move_last then
  107. lastwritten:=ref;
  108. end
  109. else if not ref^.is_written then
  110. move_last:=false
  111. else if move_last then
  112. lastwritten:=ref;
  113. ref:=ref^.nextref;
  114. end;
  115. if symref_written then
  116. current_ppu^.writeentry(ibsymref);
  117. write_references:=symref_written;
  118. end;
  119. {$ifdef BrowserLog}
  120. procedure tsym.add_to_browserlog;
  121. begin
  122. if assigned(defref) then
  123. begin
  124. browserlog.AddLog('***'+name+'***');
  125. browserlog.AddLogRefs(defref);
  126. end;
  127. end;
  128. {$endif BrowserLog}
  129. destructor tsym.done;
  130. begin
  131. if assigned(defref) then
  132. dispose(defref,done);
  133. inherited done;
  134. end;
  135. procedure tsym.write;
  136. begin
  137. writeword(indexnr);
  138. writestring(name);
  139. writesmallset(symoptions);
  140. writeposinfo(fileinfo);
  141. end;
  142. procedure tsym.deref;
  143. begin
  144. end;
  145. function tsym.mangledname : string;
  146. begin
  147. mangledname:=name;
  148. end;
  149. { for most symbol types there is nothing to do at all }
  150. procedure tsym.insert_in_data;
  151. begin
  152. end;
  153. {$ifdef GDB}
  154. function tsym.stabstring : pchar;
  155. begin
  156. stabstring:=strpnew('"'+name+'",'+tostr(N_LSYM)+',0,'+
  157. tostr(fileinfo.line)+',0');
  158. end;
  159. procedure tsym.concatstabto(asmlist : paasmoutput);
  160. var stab_str : pchar;
  161. begin
  162. if not isstabwritten then
  163. begin
  164. stab_str := stabstring;
  165. if asmlist = debuglist then do_count_dbx := true;
  166. { count_dbx(stab_str); moved to GDB.PAS }
  167. asmlist^.concat(new(pai_stabs,init(stab_str)));
  168. isstabwritten:=true;
  169. end;
  170. end;
  171. {$endif GDB}
  172. {****************************************************************************
  173. TLABELSYM
  174. ****************************************************************************}
  175. constructor tlabelsym.init(const n : string; l : pasmlabel);
  176. begin
  177. inherited init(n);
  178. typ:=labelsym;
  179. lab:=l;
  180. defined:=false;
  181. end;
  182. constructor tlabelsym.load;
  183. begin
  184. tsym.load;
  185. typ:=labelsym;
  186. { this is all dummy
  187. it is only used for local browsing }
  188. lab:=nil;
  189. defined:=true;
  190. end;
  191. destructor tlabelsym.done;
  192. begin
  193. inherited done;
  194. end;
  195. function tlabelsym.mangledname : string;
  196. begin
  197. mangledname:=lab^.name;
  198. end;
  199. procedure tlabelsym.write;
  200. begin
  201. if owner^.symtabletype in [unitsymtable,globalsymtable] then
  202. Message(sym_e_ill_label_decl)
  203. else
  204. begin
  205. tsym.write;
  206. current_ppu^.writeentry(iblabelsym);
  207. end;
  208. end;
  209. {****************************************************************************
  210. TUNITSYM
  211. ****************************************************************************}
  212. constructor tunitsym.init(const n : string;ref : punitsymtable);
  213. var
  214. old_make_ref : boolean;
  215. begin
  216. old_make_ref:=make_ref;
  217. make_ref:=false;
  218. inherited init(n);
  219. make_ref:=old_make_ref;
  220. typ:=unitsym;
  221. unitsymtable:=ref;
  222. prevsym:=ref^.unitsym;
  223. ref^.unitsym:=@self;
  224. refs:=0;
  225. end;
  226. constructor tunitsym.load;
  227. begin
  228. tsym.load;
  229. typ:=unitsym;
  230. unitsymtable:=punitsymtable(current_module^.globalsymtable);
  231. prevsym:=nil;
  232. end;
  233. { we need to remove it from the prevsym chain ! }
  234. destructor tunitsym.done;
  235. var pus,ppus : punitsym;
  236. begin
  237. if assigned(unitsymtable) then
  238. begin
  239. ppus:=nil;
  240. pus:=unitsymtable^.unitsym;
  241. if pus=@self then
  242. unitsymtable^.unitsym:=prevsym
  243. else while assigned(pus) do
  244. begin
  245. if pus=@self then
  246. begin
  247. ppus^.prevsym:=prevsym;
  248. break;
  249. end
  250. else
  251. begin
  252. ppus:=pus;
  253. pus:=ppus^.prevsym;
  254. end;
  255. end;
  256. end;
  257. prevsym:=nil;
  258. unitsymtable:=nil;
  259. inherited done;
  260. end;
  261. procedure tunitsym.write;
  262. begin
  263. tsym.write;
  264. current_ppu^.writeentry(ibunitsym);
  265. end;
  266. {$ifdef GDB}
  267. procedure tunitsym.concatstabto(asmlist : paasmoutput);
  268. begin
  269. {Nothing to write to stabs !}
  270. end;
  271. {$endif GDB}
  272. {****************************************************************************
  273. TPROCSYM
  274. ****************************************************************************}
  275. constructor tprocsym.init(const n : string);
  276. begin
  277. tsym.init(n);
  278. typ:=procsym;
  279. definition:=nil;
  280. owner:=nil;
  281. {$ifdef GDB}
  282. is_global := false;
  283. {$endif GDB}
  284. end;
  285. constructor tprocsym.load;
  286. begin
  287. tsym.load;
  288. typ:=procsym;
  289. definition:=pprocdef(readdefref);
  290. {$ifdef GDB}
  291. is_global := false;
  292. {$endif GDB}
  293. end;
  294. destructor tprocsym.done;
  295. begin
  296. { don't check if errors !! }
  297. if Errorcount=0 then
  298. check_forward;
  299. tsym.done;
  300. end;
  301. function tprocsym.mangledname : string;
  302. begin
  303. mangledname:=definition^.mangledname;
  304. end;
  305. function tprocsym.demangledname:string;
  306. begin
  307. demangledname:=name+definition^.demangled_paras;
  308. end;
  309. procedure tprocsym.write_parameter_lists;
  310. var
  311. p : pprocdef;
  312. begin
  313. p:=definition;
  314. while assigned(p) do
  315. begin
  316. { force the error to be printed }
  317. Verbose.Message1(sym_b_param_list,name+p^.demangled_paras);
  318. p:=p^.nextoverloaded;
  319. end;
  320. end;
  321. procedure tprocsym.check_forward;
  322. var
  323. pd : pprocdef;
  324. begin
  325. pd:=definition;
  326. while assigned(pd) do
  327. begin
  328. if pd^.forwarddef then
  329. begin
  330. if assigned(pd^._class) then
  331. MessagePos1(fileinfo,sym_e_forward_not_resolved,pd^._class^.objname^+'.'+demangledname)
  332. else
  333. MessagePos1(fileinfo,sym_e_forward_not_resolved,demangledname);
  334. { Turn futher error messages off }
  335. pd^.forwarddef:=false;
  336. end;
  337. pd:=pd^.nextoverloaded;
  338. end;
  339. end;
  340. procedure tprocsym.deref;
  341. var
  342. t : ttoken;
  343. last : pprocdef;
  344. begin
  345. resolvedef(pdef(definition));
  346. if (definition^.proctypeoption=potype_operator) then
  347. begin
  348. last:=definition;
  349. while assigned(last^.nextoverloaded) do
  350. last:=last^.nextoverloaded;
  351. for t:=first_overloaded to last_overloaded do
  352. if (name=overloaded_names[t]) then
  353. begin
  354. if assigned(overloaded_operators[t]) then
  355. last^.nextoverloaded:=overloaded_operators[t]^.definition;
  356. overloaded_operators[t]:=@self;
  357. end;
  358. end;
  359. end;
  360. procedure tprocsym.write;
  361. begin
  362. tsym.write;
  363. writedefref(pdef(definition));
  364. current_ppu^.writeentry(ibprocsym);
  365. end;
  366. procedure tprocsym.load_references;
  367. (*var
  368. prdef,prdef2 : pprocdef;
  369. b : byte; *)
  370. begin
  371. inherited load_references;
  372. (*prdef:=definition;
  373. done in tsymtable.load_browser (PM)
  374. { take care about operators !! }
  375. if (current_module^.flags and uf_has_browser) <>0 then
  376. while assigned(prdef) and (prdef^.owner=definition^.owner) do
  377. begin
  378. b:=current_ppu^.readentry;
  379. if b<>ibdefref then
  380. Message(unit_f_ppu_read_error);
  381. prdef2:=pprocdef(readdefref);
  382. resolvedef(prdef2);
  383. if prdef<>prdef2 then
  384. Message(unit_f_ppu_read_error);
  385. prdef^.load_references;
  386. prdef:=prdef^.nextoverloaded;
  387. end; *)
  388. end;
  389. function tprocsym.write_references : boolean;
  390. var
  391. prdef : pprocdef;
  392. begin
  393. write_references:=false;
  394. if not inherited write_references then
  395. exit;
  396. write_references:=true;
  397. prdef:=definition;
  398. while assigned(prdef) and (prdef^.owner=definition^.owner) do
  399. begin
  400. prdef^.write_references;
  401. prdef:=prdef^.nextoverloaded;
  402. end;
  403. end;
  404. {$ifdef BrowserLog}
  405. procedure tprocsym.add_to_browserlog;
  406. var
  407. prdef : pprocdef;
  408. begin
  409. inherited add_to_browserlog;
  410. prdef:=definition;
  411. while assigned(prdef) do
  412. begin
  413. pprocdef(prdef)^.add_to_browserlog;
  414. prdef:=pprocdef(prdef)^.nextoverloaded;
  415. end;
  416. end;
  417. {$endif BrowserLog}
  418. {$ifdef GDB}
  419. function tprocsym.stabstring : pchar;
  420. Var RetType : Char;
  421. Obj,Info : String;
  422. stabsstr : string;
  423. p : pchar;
  424. begin
  425. obj := name;
  426. info := '';
  427. if is_global then
  428. RetType := 'F'
  429. else
  430. RetType := 'f';
  431. if assigned(owner) then
  432. begin
  433. if (owner^.symtabletype = objectsymtable) then
  434. obj := owner^.name^+'__'+name;
  435. { this code was correct only as long as the local symboltable
  436. of the parent had the same name as the function
  437. but this is no true anymore !! PM
  438. if (owner^.symtabletype=localsymtable) and assigned(owner^.name) then
  439. info := ','+name+','+owner^.name^; }
  440. if (owner^.symtabletype=localsymtable) and assigned(owner^.defowner) and
  441. assigned(pprocdef(owner^.defowner)^.procsym) then
  442. info := ','+name+','+pprocdef(owner^.defowner)^.procsym^.name;
  443. end;
  444. stabsstr:=definition^.mangledname;
  445. getmem(p,length(stabsstr)+255);
  446. strpcopy(p,'"'+obj+':'+RetType
  447. +definition^.retdef^.numberstring+info+'",'+tostr(n_function)
  448. +',0,'+
  449. tostr(aktfilepos.line)
  450. +',');
  451. strpcopy(strend(p),stabsstr);
  452. stabstring:=strnew(p);
  453. freemem(p,length(stabsstr)+255);
  454. end;
  455. procedure tprocsym.concatstabto(asmlist : paasmoutput);
  456. begin
  457. if (pocall_internproc in definition^.proccalloptions) then exit;
  458. if not isstabwritten then
  459. asmlist^.concat(new(pai_stabs,init(stabstring)));
  460. isstabwritten := true;
  461. if assigned(definition^.parast) then
  462. definition^.parast^.concatstabto(asmlist);
  463. if assigned(definition^.localst) then
  464. definition^.localst^.concatstabto(asmlist);
  465. definition^.is_def_stab_written := true;
  466. end;
  467. {$endif GDB}
  468. {****************************************************************************
  469. TPROGRAMSYM
  470. ****************************************************************************}
  471. constructor tprogramsym.init(const n : string);
  472. begin
  473. inherited init(n);
  474. typ:=programsym;
  475. end;
  476. {****************************************************************************
  477. TERRORSYM
  478. ****************************************************************************}
  479. constructor terrorsym.init;
  480. begin
  481. inherited init('');
  482. typ:=errorsym;
  483. end;
  484. {****************************************************************************
  485. TPROPERTYSYM
  486. ****************************************************************************}
  487. constructor tpropertysym.init(const n : string);
  488. begin
  489. inherited init(n);
  490. typ:=propertysym;
  491. propoptions:=[];
  492. proptype:=nil;
  493. readaccessdef:=nil;
  494. writeaccessdef:=nil;
  495. readaccesssym:=nil;
  496. writeaccesssym:=nil;
  497. storedsym:=nil;
  498. storeddef:=nil;
  499. index:=0;
  500. default:=0;
  501. end;
  502. destructor tpropertysym.done;
  503. procedure disposepropsymlist(p:ppropsymlist);
  504. var
  505. hp : ppropsymlist;
  506. begin
  507. while assigned(p) do
  508. begin
  509. hp:=p;
  510. p:=p^.next;
  511. dispose(hp);
  512. end;
  513. end;
  514. begin
  515. disposepropsymlist(readaccesssym);
  516. disposepropsymlist(writeaccesssym);
  517. disposepropsymlist(storedsym);
  518. inherited done;
  519. end;
  520. constructor tpropertysym.load;
  521. function readpropsymlist:ppropsymlist;
  522. var
  523. root,last,p : ppropsymlist;
  524. sym : psym;
  525. begin
  526. root:=nil;
  527. last:=nil;
  528. repeat
  529. sym:=readsymref;
  530. if sym=nil then
  531. break;
  532. new(p);
  533. p^.sym:=sym;
  534. p^.next:=nil;
  535. if assigned(last) then
  536. last^.next:=p
  537. else
  538. root:=p;
  539. last:=p;
  540. until false;
  541. readpropsymlist:=root;
  542. end;
  543. begin
  544. inherited load;
  545. typ:=propertysym;
  546. proptype:=readdefref;
  547. readsmallset(propoptions);
  548. index:=readlong;
  549. default:=readlong;
  550. { the syms }
  551. readaccesssym:=readpropsymlist;
  552. writeaccesssym:=readpropsymlist;
  553. storedsym:=readpropsymlist;
  554. { now the defs }
  555. readaccessdef:=readdefref;
  556. writeaccessdef:=readdefref;
  557. storeddef:=readdefref;
  558. end;
  559. procedure tpropertysym.deref;
  560. procedure resolvepropsymlist(p:ppropsymlist);
  561. begin
  562. while assigned(p) do
  563. begin
  564. resolvesym(p^.sym);
  565. p:=p^.next;
  566. end;
  567. end;
  568. begin
  569. resolvedef(proptype);
  570. resolvedef(readaccessdef);
  571. resolvedef(writeaccessdef);
  572. resolvedef(storeddef);
  573. resolvepropsymlist(readaccesssym);
  574. resolvepropsymlist(writeaccesssym);
  575. resolvepropsymlist(storedsym);
  576. end;
  577. function tpropertysym.getsize : longint;
  578. begin
  579. getsize:=0;
  580. end;
  581. procedure tpropertysym.write;
  582. procedure writepropsymlist(p:ppropsymlist);
  583. begin
  584. while assigned(p) do
  585. begin
  586. writesymref(p^.sym);
  587. p:=p^.next;
  588. end;
  589. writesymref(nil);
  590. end;
  591. begin
  592. tsym.write;
  593. writedefref(proptype);
  594. writesmallset(propoptions);
  595. writelong(index);
  596. writelong(default);
  597. writepropsymlist(readaccesssym);
  598. writepropsymlist(writeaccesssym);
  599. writepropsymlist(storedsym);
  600. writedefref(readaccessdef);
  601. writedefref(writeaccessdef);
  602. writedefref(storeddef);
  603. current_ppu^.writeentry(ibpropertysym);
  604. end;
  605. {$ifdef GDB}
  606. function tpropertysym.stabstring : pchar;
  607. begin
  608. { !!!! don't know how to handle }
  609. stabstring:=strpnew('');
  610. end;
  611. procedure tpropertysym.concatstabto(asmlist : paasmoutput);
  612. begin
  613. { !!!! don't know how to handle }
  614. end;
  615. {$endif GDB}
  616. {****************************************************************************
  617. TFUNCRETSYM
  618. ****************************************************************************}
  619. constructor tfuncretsym.init(const n : string;approcinfo : pointer{pprocinfo});
  620. begin
  621. tsym.init(n);
  622. typ:=funcretsym;
  623. funcretprocinfo:=approcinfo;
  624. funcretdef:=pprocinfo(approcinfo)^.retdef;
  625. { address valid for ret in param only }
  626. { otherwise set by insert }
  627. address:=pprocinfo(approcinfo)^.retoffset;
  628. end;
  629. constructor tfuncretsym.load;
  630. begin
  631. tsym.load;
  632. funcretdef:=readdefref;
  633. address:=readlong;
  634. funcretprocinfo:=nil;
  635. typ:=funcretsym;
  636. end;
  637. procedure tfuncretsym.write;
  638. begin
  639. tsym.write;
  640. writedefref(funcretdef);
  641. writelong(address);
  642. current_ppu^.writeentry(ibfuncretsym);
  643. end;
  644. procedure tfuncretsym.deref;
  645. begin
  646. resolvedef(funcretdef);
  647. end;
  648. {$ifdef GDB}
  649. procedure tfuncretsym.concatstabto(asmlist : paasmoutput);
  650. begin
  651. { Nothing to do here, it is done in genexitcode }
  652. end;
  653. {$endif GDB}
  654. procedure tfuncretsym.insert_in_data;
  655. var
  656. l : longint;
  657. begin
  658. { if retoffset is already set then reuse it, this is needed
  659. when inserting the result variable }
  660. if procinfo^.retoffset<>0 then
  661. address:=procinfo^.retoffset
  662. else
  663. begin
  664. { allocate space in local if ret in acc or in fpu }
  665. if ret_in_acc(procinfo^.retdef) or (procinfo^.retdef^.deftype=floatdef) then
  666. begin
  667. l:=funcretdef^.size;
  668. inc(owner^.datasize,l);
  669. {$ifdef m68k}
  670. { word alignment required for motorola }
  671. if (l=1) then
  672. inc(owner^.datasize,1)
  673. else
  674. {$endif}
  675. if (l>=4) and ((owner^.datasize and 3)<>0) then
  676. inc(owner^.datasize,4-(owner^.datasize and 3))
  677. else if (l>=2) and ((owner^.datasize and 1)<>0) then
  678. inc(owner^.datasize,2-(owner^.datasize and 1));
  679. address:=owner^.datasize;
  680. procinfo^.retoffset:=-owner^.datasize;
  681. end;
  682. end;
  683. end;
  684. {****************************************************************************
  685. TABSOLUTESYM
  686. ****************************************************************************}
  687. constructor tabsolutesym.init(const n : string;p : pdef);
  688. begin
  689. inherited init(n,p);
  690. typ:=absolutesym;
  691. end;
  692. constructor tabsolutesym.load;
  693. begin
  694. tvarsym.load;
  695. typ:=absolutesym;
  696. ref:=nil;
  697. address:=0;
  698. asmname:=nil;
  699. abstyp:=absolutetyp(readbyte);
  700. absseg:=false;
  701. case abstyp of
  702. tovar :
  703. begin
  704. asmname:=stringdup(readstring);
  705. ref:=srsym;
  706. end;
  707. toasm :
  708. asmname:=stringdup(readstring);
  709. toaddr :
  710. begin
  711. address:=readlong;
  712. absseg:=boolean(readbyte);
  713. end;
  714. end;
  715. end;
  716. procedure tabsolutesym.write;
  717. var
  718. hvo : tvaroptions;
  719. begin
  720. { Note: This needs to write everything of tvarsym.write }
  721. tsym.write;
  722. writebyte(byte(varspez));
  723. if read_member then
  724. writelong(address);
  725. { write only definition or definitionsym }
  726. if assigned(definitionsym) then
  727. begin
  728. writedefref(nil);
  729. writesymref(definitionsym);
  730. end
  731. else
  732. begin
  733. writedefref(definition);
  734. writesymref(nil);
  735. end;
  736. hvo:=varoptions-[vo_regable];
  737. writesmallset(hvo);
  738. writebyte(byte(abstyp));
  739. case abstyp of
  740. tovar :
  741. writestring(ref^.name);
  742. toasm :
  743. writestring(asmname^);
  744. toaddr :
  745. begin
  746. writelong(address);
  747. writebyte(byte(absseg));
  748. end;
  749. end;
  750. current_ppu^.writeentry(ibabsolutesym);
  751. end;
  752. procedure tabsolutesym.deref;
  753. begin
  754. tvarsym.deref;
  755. if (abstyp=tovar) and (asmname<>nil) then
  756. begin
  757. { search previous loaded symtables }
  758. getsym(asmname^,false);
  759. if not(assigned(srsym)) then
  760. getsymonlyin(owner,asmname^);
  761. if not(assigned(srsym)) then
  762. srsym:=generrorsym;
  763. ref:=srsym;
  764. stringdispose(asmname);
  765. end;
  766. end;
  767. function tabsolutesym.mangledname : string;
  768. begin
  769. case abstyp of
  770. tovar :
  771. mangledname:=ref^.mangledname;
  772. toasm :
  773. mangledname:=asmname^;
  774. toaddr :
  775. mangledname:='$'+tostr(address);
  776. else
  777. internalerror(10002);
  778. end;
  779. end;
  780. procedure tabsolutesym.insert_in_data;
  781. begin
  782. end;
  783. {$ifdef GDB}
  784. procedure tabsolutesym.concatstabto(asmlist : paasmoutput);
  785. begin
  786. { I don't know how to handle this !! }
  787. end;
  788. {$endif GDB}
  789. {****************************************************************************
  790. TVARSYM
  791. ****************************************************************************}
  792. constructor tvarsym.init(const n : string;p : pdef);
  793. begin
  794. tsym.init(n);
  795. typ:=varsym;
  796. definition:=p;
  797. definitionsym:=nil;
  798. _mangledname:=nil;
  799. varspez:=vs_value;
  800. address:=0;
  801. islocalcopy:=false;
  802. localvarsym:=nil;
  803. refs:=0;
  804. varstate:=vs_used;
  805. varoptions:=[];
  806. { can we load the value into a register ? }
  807. if p^.is_intregable then
  808. {$ifdef INCLUDEOK}
  809. include(varoptions,vo_regable)
  810. {$else}
  811. varoptions:=varoptions+[vo_regable]
  812. {$endif}
  813. else
  814. {$ifdef INCLUDEOK}
  815. exclude(varoptions,vo_regable);
  816. {$else}
  817. varoptions:=varoptions-[vo_regable];
  818. {$endif}
  819. if p^.is_fpuregable then
  820. {$ifdef INCLUDEOK}
  821. include(varoptions,vo_fpuregable)
  822. {$else}
  823. varoptions:=varoptions+[vo_fpuregable]
  824. {$endif}
  825. else
  826. {$ifdef INCLUDEOK}
  827. exclude(varoptions,vo_regable);
  828. {$else}
  829. varoptions:=varoptions-[vo_fpuregable];
  830. {$endif}
  831. reg:=R_NO;
  832. end;
  833. constructor tvarsym.init_dll(const n : string;p : pdef);
  834. begin
  835. { The tvarsym is necessary for 0.99.5 (PFV) }
  836. tvarsym.init(n,p);
  837. {$ifdef INCLUDEOK}
  838. include(varoptions,vo_is_dll_var);
  839. {$else}
  840. varoptions:=varoptions+[vo_is_dll_var];
  841. {$endif}
  842. end;
  843. constructor tvarsym.init_C(const n,mangled : string;p : pdef);
  844. begin
  845. { The tvarsym is necessary for 0.99.5 (PFV) }
  846. tvarsym.init(n,p);
  847. {$ifdef INCLUDEOK}
  848. include(varoptions,vo_is_C_var);
  849. {$else}
  850. varoptions:=varoptions+[vo_is_C_var];
  851. {$endif}
  852. setmangledname(mangled);
  853. end;
  854. constructor tvarsym.initsym(const n : string;p : ptypesym);
  855. begin
  856. tvarsym.init(n,p^.definition);
  857. definitionsym:=p;
  858. end;
  859. constructor tvarsym.initsym_dll(const n : string;p : ptypesym);
  860. begin
  861. tvarsym.init_dll(n,p^.definition);
  862. definitionsym:=p;
  863. end;
  864. constructor tvarsym.initsym_C(const n,mangled : string;p : ptypesym);
  865. begin
  866. tvarsym.init_C(n,mangled,p^.definition);
  867. definitionsym:=p;
  868. end;
  869. constructor tvarsym.load;
  870. begin
  871. tsym.load;
  872. typ:=varsym;
  873. _mangledname:=nil;
  874. reg:=R_NO;
  875. refs := 0;
  876. varstate:=vs_used;
  877. varspez:=tvarspez(readbyte);
  878. if read_member then
  879. address:=readlong
  880. else
  881. address:=0;
  882. islocalcopy:=false;
  883. localvarsym:=nil;
  884. definition:=readdefref;
  885. definitionsym:=ptypesym(readsymref);
  886. readsmallset(varoptions);
  887. if (vo_is_C_var in varoptions) then
  888. setmangledname(readstring);
  889. end;
  890. destructor tvarsym.done;
  891. begin
  892. strdispose(_mangledname);
  893. inherited done;
  894. end;
  895. procedure tvarsym.deref;
  896. begin
  897. if assigned(definitionsym) then
  898. begin
  899. resolvesym(psym(definitionsym));
  900. definition:=definitionsym^.definition;
  901. end
  902. else
  903. resolvedef(definition);
  904. end;
  905. procedure tvarsym.write;
  906. var
  907. hvo : tvaroptions;
  908. begin
  909. tsym.write;
  910. writebyte(byte(varspez));
  911. if read_member then
  912. writelong(address);
  913. { write only definition or definitionsym }
  914. if assigned(definitionsym) then
  915. begin
  916. writedefref(nil);
  917. writesymref(definitionsym);
  918. end
  919. else
  920. begin
  921. writedefref(definition);
  922. writesymref(nil);
  923. end;
  924. { symbols which are load are never candidates for a register,
  925. turn off the regable }
  926. hvo:=varoptions-[vo_regable];
  927. writesmallset(hvo);
  928. if (vo_is_C_var in varoptions) then
  929. writestring(mangledname);
  930. current_ppu^.writeentry(ibvarsym);
  931. end;
  932. procedure tvarsym.setmangledname(const s : string);
  933. begin
  934. _mangledname:=strpnew(s);
  935. end;
  936. function tvarsym.mangledname : string;
  937. var
  938. prefix : string;
  939. begin
  940. if assigned(_mangledname) then
  941. begin
  942. mangledname:=strpas(_mangledname);
  943. exit;
  944. end;
  945. case owner^.symtabletype of
  946. staticsymtable :
  947. if (cs_create_smart in aktmoduleswitches) then
  948. prefix:='_'+owner^.name^+'$$$_'
  949. else
  950. prefix:='_';
  951. unitsymtable,
  952. globalsymtable :
  953. prefix:='U_'+owner^.name^+'_';
  954. else
  955. Message(sym_e_invalid_call_tvarsymmangledname);
  956. end;
  957. mangledname:=prefix+name;
  958. end;
  959. function tvarsym.getsize : longint;
  960. begin
  961. if assigned(definition) and (varspez=vs_value) and
  962. ((definition^.deftype<>arraydef) or (Parraydef(definition)^.highrange>=
  963. Parraydef(definition)^.lowrange)) then
  964. getsize:=definition^.size
  965. else
  966. getsize:=0;
  967. end;
  968. function tvarsym.getpushsize : longint;
  969. begin
  970. if assigned(definition) then
  971. begin
  972. case varspez of
  973. vs_var :
  974. getpushsize:=target_os.size_of_pointer;
  975. vs_value,
  976. vs_const :
  977. begin
  978. if push_addr_param(definition) then
  979. getpushsize:=target_os.size_of_pointer
  980. else
  981. getpushsize:=definition^.size;
  982. end;
  983. end;
  984. end
  985. else
  986. getpushsize:=0;
  987. end;
  988. function data_align(length : longint) : longint;
  989. begin
  990. (* this is useless under go32v2 at least
  991. because the section are only align to dword
  992. if length>8 then
  993. data_align:=16
  994. else if length>4 then
  995. data_align:=8
  996. else *)
  997. if length>2 then
  998. data_align:=4
  999. else
  1000. if length>1 then
  1001. data_align:=2
  1002. else
  1003. data_align:=1;
  1004. end;
  1005. procedure tvarsym.insert_in_data;
  1006. var
  1007. varalign,
  1008. l,ali,modulo : longint;
  1009. storefilepos : tfileposinfo;
  1010. begin
  1011. if (vo_is_external in varoptions) then
  1012. exit;
  1013. { handle static variables of objects especially }
  1014. if read_member and (owner^.symtabletype=objectsymtable) and
  1015. (sp_static in symoptions) then
  1016. begin
  1017. { the data filed is generated in parser.pas
  1018. with a tobject_FIELDNAME variable }
  1019. { this symbol can't be loaded to a register }
  1020. {$ifdef INCLUDEOK}
  1021. exclude(varoptions,vo_regable);
  1022. exclude(varoptions,vo_fpuregable);
  1023. {$else}
  1024. varoptions:=varoptions-[vo_regable,vo_fpuregable];
  1025. {$endif}
  1026. end
  1027. else
  1028. if not(read_member) then
  1029. begin
  1030. { made problems with parameters etc. ! (FK) }
  1031. { check for instance of an abstract object or class }
  1032. {
  1033. if (pvarsym(sym)^.definition^.deftype=objectdef) and
  1034. ((pobjectdef(pvarsym(sym)^.definition)^.options and oo_is_abstract)<>0) then
  1035. Message(sym_e_no_instance_of_abstract_object);
  1036. }
  1037. storefilepos:=aktfilepos;
  1038. aktfilepos:=tokenpos;
  1039. if (vo_is_thread_var in varoptions) then
  1040. l:=4
  1041. else
  1042. l:=getsize;
  1043. case owner^.symtabletype of
  1044. stt_exceptsymtable:
  1045. { can contain only one symbol, address calculated later }
  1046. ;
  1047. localsymtable :
  1048. begin
  1049. varstate:=vs_declared;
  1050. modulo:=owner^.datasize and 3;
  1051. {$ifdef m68k}
  1052. { word alignment required for motorola }
  1053. if (l=1) then
  1054. l:=2
  1055. else
  1056. {$endif}
  1057. if (l>=4) and (modulo<>0) then
  1058. inc(l,4-modulo)
  1059. else
  1060. if (l>=2) and ((modulo and 1)<>0) then
  1061. inc(l,2-(modulo and 1));
  1062. inc(owner^.datasize,l);
  1063. address:=owner^.datasize;
  1064. end;
  1065. staticsymtable :
  1066. begin
  1067. { enable unitialized warning for local symbols }
  1068. varstate:=vs_declared;
  1069. if (cs_create_smart in aktmoduleswitches) then
  1070. bsssegment^.concat(new(pai_cut,init));
  1071. ali:=data_align(l);
  1072. if ali>1 then
  1073. begin
  1074. modulo:=owner^.datasize mod ali;
  1075. if modulo>0 then
  1076. inc(owner^.datasize,ali-modulo);
  1077. end;
  1078. {$ifdef GDB}
  1079. if cs_debuginfo in aktmoduleswitches then
  1080. concatstabto(bsssegment);
  1081. {$endif GDB}
  1082. if (cs_create_smart in aktmoduleswitches) or
  1083. DLLSource or
  1084. (vo_is_C_var in varoptions) then
  1085. bsssegment^.concat(new(pai_datablock,init_global(mangledname,l)))
  1086. else
  1087. bsssegment^.concat(new(pai_datablock,init(mangledname,l)));
  1088. { increase datasize }
  1089. inc(owner^.datasize,l);
  1090. { this symbol can't be loaded to a register }
  1091. {$ifdef INCLUDEOK}
  1092. exclude(varoptions,vo_regable);
  1093. exclude(varoptions,vo_fpuregable);
  1094. {$else}
  1095. varoptions:=varoptions-[vo_regable,vo_fpuregable];
  1096. {$endif}
  1097. end;
  1098. globalsymtable :
  1099. begin
  1100. if (cs_create_smart in aktmoduleswitches) then
  1101. bsssegment^.concat(new(pai_cut,init));
  1102. ali:=data_align(l);
  1103. if ali>1 then
  1104. begin
  1105. modulo:=owner^.datasize mod ali;
  1106. if modulo>0 then
  1107. inc(owner^.datasize,ali-modulo);
  1108. end;
  1109. {$ifdef GDB}
  1110. if cs_debuginfo in aktmoduleswitches then
  1111. concatstabto(bsssegment);
  1112. {$endif GDB}
  1113. bsssegment^.concat(new(pai_datablock,init_global(mangledname,l)));
  1114. inc(owner^.datasize,l);
  1115. { this symbol can't be loaded to a register }
  1116. {$ifdef INCLUDEOK}
  1117. exclude(varoptions,vo_regable);
  1118. exclude(varoptions,vo_fpuregable);
  1119. {$else}
  1120. varoptions:=varoptions-[vo_regable,vo_fpuregable];
  1121. {$endif}
  1122. end;
  1123. recordsymtable,
  1124. objectsymtable :
  1125. begin
  1126. { this symbol can't be loaded to a register }
  1127. {$ifdef INCLUDEOK}
  1128. exclude(varoptions,vo_regable);
  1129. exclude(varoptions,vo_fpuregable);
  1130. {$else}
  1131. varoptions:=varoptions-[vo_regable,vo_fpuregable];
  1132. {$endif}
  1133. { get the alignment size }
  1134. if (aktpackrecords=packrecord_C) then
  1135. begin
  1136. varalign:=definition^.alignment;
  1137. if varalign=0 then
  1138. begin
  1139. if (owner^.dataalignment<4) then
  1140. begin
  1141. if (l>=4) then
  1142. owner^.dataalignment:=4
  1143. else
  1144. if (owner^.dataalignment<2) and (l>=2) then
  1145. owner^.dataalignment:=2;
  1146. end;
  1147. end;
  1148. end
  1149. else
  1150. varalign:=0;
  1151. { align record and object fields }
  1152. if (l=1) or (varalign=1) or (owner^.dataalignment=1) then
  1153. begin
  1154. address:=owner^.datasize;
  1155. inc(owner^.datasize,l)
  1156. end
  1157. else
  1158. if (l=2) or (varalign=2) or (owner^.dataalignment=2) then
  1159. begin
  1160. owner^.datasize:=(owner^.datasize+1) and (not 1);
  1161. address:=owner^.datasize;
  1162. inc(owner^.datasize,l)
  1163. end
  1164. else
  1165. if (l<=4) or (varalign=4) or (owner^.dataalignment=4) then
  1166. begin
  1167. owner^.datasize:=(owner^.datasize+3) and (not 3);
  1168. address:=owner^.datasize;
  1169. inc(owner^.datasize,l);
  1170. end
  1171. else
  1172. if (l<=8) or (owner^.dataalignment=8) then
  1173. begin
  1174. owner^.datasize:=(owner^.datasize+7) and (not 7);
  1175. address:=owner^.datasize;
  1176. inc(owner^.datasize,l);
  1177. end
  1178. else
  1179. if (l<=16) or (owner^.dataalignment=16) then
  1180. begin
  1181. owner^.datasize:=(owner^.datasize+15) and (not 15);
  1182. address:=owner^.datasize;
  1183. inc(owner^.datasize,l);
  1184. end
  1185. else
  1186. if (l<=32) or (owner^.dataalignment=32) then
  1187. begin
  1188. owner^.datasize:=(owner^.datasize+31) and (not 31);
  1189. address:=owner^.datasize;
  1190. inc(owner^.datasize,l);
  1191. end;
  1192. end;
  1193. parasymtable :
  1194. begin
  1195. { here we need the size of a push instead of the
  1196. size of the data }
  1197. l:=getpushsize;
  1198. address:=owner^.datasize;
  1199. owner^.datasize:=align(owner^.datasize+l,target_os.stackalignment);
  1200. end
  1201. else
  1202. begin
  1203. modulo:=owner^.datasize and 3 ;
  1204. if (l>=4) and (modulo<>0) then
  1205. inc(owner^.datasize,4-modulo)
  1206. else
  1207. if (l>=2) and ((modulo and 1)<>0) then
  1208. inc(owner^.datasize);
  1209. address:=owner^.datasize;
  1210. inc(owner^.datasize,l);
  1211. end;
  1212. end;
  1213. aktfilepos:=storefilepos;
  1214. end;
  1215. end;
  1216. {$ifdef GDB}
  1217. function tvarsym.stabstring : pchar;
  1218. var
  1219. st : string[2];
  1220. begin
  1221. if (definition^.deftype=objectdef) and
  1222. pobjectdef(definition)^.is_class then
  1223. st:='*'
  1224. else
  1225. st:='';
  1226. if (owner^.symtabletype = objectsymtable) and
  1227. (sp_static in symoptions) then
  1228. begin
  1229. if (cs_gdb_gsym in aktglobalswitches) then st := 'G'+st else st := 'S'+st;
  1230. {$ifndef Delphi}
  1231. stabstring := strpnew('"'+owner^.name^+'__'+name+':'+st+
  1232. +definition^.numberstring+'",'+
  1233. tostr(N_LCSYM)+',0,'+tostr(fileinfo.line)+','+mangledname);
  1234. {$endif}
  1235. end
  1236. else if (owner^.symtabletype = globalsymtable) or
  1237. (owner^.symtabletype = unitsymtable) then
  1238. begin
  1239. { Here we used S instead of
  1240. because with G GDB doesn't look at the address field
  1241. but searches the same name or with a leading underscore
  1242. but these names don't exist in pascal !}
  1243. if (cs_gdb_gsym in aktglobalswitches) then st := 'G'+st else st := 'S'+st;
  1244. stabstring := strpnew('"'+name+':'+st
  1245. +definition^.numberstring+'",'+
  1246. tostr(N_LCSYM)+',0,'+tostr(fileinfo.line)+','+mangledname);
  1247. end
  1248. else if owner^.symtabletype = staticsymtable then
  1249. begin
  1250. stabstring := strpnew('"'+name+':S'+st
  1251. +definition^.numberstring+'",'+
  1252. tostr(N_LCSYM)+',0,'+tostr(fileinfo.line)+','+mangledname);
  1253. end
  1254. else if (owner^.symtabletype=parasymtable) then
  1255. begin
  1256. case varspez of
  1257. vs_var : st := 'v'+st;
  1258. vs_value,
  1259. vs_const : if push_addr_param(definition) then
  1260. st := 'v'+st { should be 'i' but 'i' doesn't work }
  1261. else
  1262. st := 'p'+st;
  1263. end;
  1264. stabstring := strpnew('"'+name+':'+st
  1265. +definition^.numberstring+'",'+
  1266. tostr(N_PSYM)+',0,'+tostr(fileinfo.line)+','+
  1267. tostr(address+owner^.address_fixup));
  1268. {offset to ebp => will not work if the framepointer is esp
  1269. so some optimizing will make things harder to debug }
  1270. end
  1271. else if (owner^.symtabletype=localsymtable) then
  1272. {$ifdef i386}
  1273. if reg<>R_NO then
  1274. begin
  1275. { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "eip", "ps", "cs", "ss", "ds", "es", "fs", "gs", }
  1276. { this is the register order for GDB}
  1277. stabstring:=strpnew('"'+name+':r'+st
  1278. +definition^.numberstring+'",'+
  1279. tostr(N_RSYM)+',0,'+
  1280. tostr(fileinfo.line)+','+tostr(GDB_i386index[reg]));
  1281. end
  1282. else
  1283. {$endif i386}
  1284. { I don't know if this will work (PM) }
  1285. if (vo_is_C_var in varoptions) then
  1286. stabstring := strpnew('"'+name+':S'+st
  1287. +definition^.numberstring+'",'+
  1288. tostr(N_LCSYM)+',0,'+tostr(fileinfo.line)+','+mangledname)
  1289. else
  1290. stabstring := strpnew('"'+name+':'+st
  1291. +definition^.numberstring+'",'+
  1292. tostr(N_LSYM)+',0,'+tostr(fileinfo.line)+',-'+tostr(address))
  1293. else
  1294. stabstring := inherited stabstring;
  1295. end;
  1296. procedure tvarsym.concatstabto(asmlist : paasmoutput);
  1297. {$ifdef i386}
  1298. var stab_str : pchar;
  1299. {$endif i386}
  1300. begin
  1301. inherited concatstabto(asmlist);
  1302. {$ifdef i386}
  1303. if (owner^.symtabletype=parasymtable) and
  1304. (reg<>R_NO) then
  1305. begin
  1306. { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "eip", "ps", "cs", "ss", "ds", "es", "fs", "gs", }
  1307. { this is the register order for GDB}
  1308. stab_str:=strpnew('"'+name+':r'
  1309. +definition^.numberstring+'",'+
  1310. tostr(N_RSYM)+',0,'+
  1311. tostr(fileinfo.line)+','+tostr(GDB_i386index[reg]));
  1312. asmlist^.concat(new(pai_stabs,init(stab_str)));
  1313. end;
  1314. {$endif i386}
  1315. end;
  1316. {$endif GDB}
  1317. {****************************************************************************
  1318. TTYPEDCONSTSYM
  1319. *****************************************************************************}
  1320. constructor ttypedconstsym.init(const n : string;p : pdef;really_const : boolean);
  1321. begin
  1322. tsym.init(n);
  1323. typ:=typedconstsym;
  1324. definition:=p;
  1325. definitionsym:=nil;
  1326. is_really_const:=really_const;
  1327. prefix:=stringdup(procprefix);
  1328. end;
  1329. constructor ttypedconstsym.initsym(const n : string;p : ptypesym;really_const : boolean);
  1330. begin
  1331. ttypedconstsym.init(n,p^.definition,really_const);
  1332. definitionsym:=p;
  1333. end;
  1334. constructor ttypedconstsym.load;
  1335. begin
  1336. tsym.load;
  1337. typ:=typedconstsym;
  1338. definition:=readdefref;
  1339. definitionsym:=ptypesym(readsymref);
  1340. prefix:=stringdup(readstring);
  1341. is_really_const:=boolean(readbyte);
  1342. end;
  1343. destructor ttypedconstsym.done;
  1344. begin
  1345. stringdispose(prefix);
  1346. tsym.done;
  1347. end;
  1348. function ttypedconstsym.mangledname : string;
  1349. begin
  1350. mangledname:='TC_'+prefix^+'_'+name;
  1351. end;
  1352. function ttypedconstsym.getsize : longint;
  1353. begin
  1354. if assigned(definition) then
  1355. getsize:=definition^.size
  1356. else
  1357. getsize:=0;
  1358. end;
  1359. procedure ttypedconstsym.deref;
  1360. begin
  1361. if assigned(definitionsym) then
  1362. begin
  1363. resolvesym(psym(definitionsym));
  1364. definition:=definitionsym^.definition;
  1365. end
  1366. else
  1367. resolvedef(definition);
  1368. end;
  1369. procedure ttypedconstsym.write;
  1370. begin
  1371. tsym.write;
  1372. { write only definition or definitionsym }
  1373. if assigned(definitionsym) then
  1374. begin
  1375. writedefref(nil);
  1376. writesymref(definitionsym);
  1377. end
  1378. else
  1379. begin
  1380. writedefref(definition);
  1381. writesymref(nil);
  1382. end;
  1383. writestring(prefix^);
  1384. writebyte(byte(is_really_const));
  1385. current_ppu^.writeentry(ibtypedconstsym);
  1386. end;
  1387. procedure ttypedconstsym.insert_in_data;
  1388. var
  1389. curconstsegment : paasmoutput;
  1390. l,ali,modulo : longint;
  1391. storefilepos : tfileposinfo;
  1392. begin
  1393. storefilepos:=aktfilepos;
  1394. aktfilepos:=tokenpos;
  1395. if is_really_const then
  1396. curconstsegment:=consts
  1397. else
  1398. curconstsegment:=datasegment;
  1399. if (cs_create_smart in aktmoduleswitches) then
  1400. curconstsegment^.concat(new(pai_cut,init));
  1401. l:=getsize;
  1402. ali:=data_align(l);
  1403. if ali>1 then
  1404. begin
  1405. curconstsegment^.concat(new(pai_align,init(ali)));
  1406. modulo:=owner^.datasize mod ali;
  1407. if modulo>0 then
  1408. inc(owner^.datasize,ali-modulo);
  1409. end;
  1410. { Why was there no owner size update here ??? }
  1411. inc(owner^.datasize,l);
  1412. {$ifdef GDB}
  1413. if cs_debuginfo in aktmoduleswitches then
  1414. concatstabto(curconstsegment);
  1415. {$endif GDB}
  1416. if owner^.symtabletype=globalsymtable then
  1417. begin
  1418. curconstsegment^.concat(new(pai_symbol,initname_global(mangledname,getsize)));
  1419. end
  1420. else
  1421. if owner^.symtabletype<>unitsymtable then
  1422. begin
  1423. if (cs_create_smart in aktmoduleswitches) or
  1424. DLLSource then
  1425. curconstsegment^.concat(new(pai_symbol,initname_global(mangledname,getsize)))
  1426. else
  1427. curconstsegment^.concat(new(pai_symbol,initname(mangledname,getsize)));
  1428. end;
  1429. aktfilepos:=storefilepos;
  1430. end;
  1431. {$ifdef GDB}
  1432. function ttypedconstsym.stabstring : pchar;
  1433. var
  1434. st : char;
  1435. begin
  1436. if (cs_gdb_gsym in aktglobalswitches) and (owner^.symtabletype in [unitsymtable,globalsymtable]) then
  1437. st := 'G'
  1438. else
  1439. st := 'S';
  1440. stabstring := strpnew('"'+name+':'+st+
  1441. definition^.numberstring+'",'+tostr(n_STSYM)+',0,'+
  1442. tostr(fileinfo.line)+','+mangledname);
  1443. end;
  1444. {$endif GDB}
  1445. {****************************************************************************
  1446. TCONSTSYM
  1447. ****************************************************************************}
  1448. constructor tconstsym.init(const n : string;t : tconsttype;v : longint);
  1449. begin
  1450. inherited init(n);
  1451. typ:=constsym;
  1452. consttype:=t;
  1453. value:=v;
  1454. ResStrIndex:=0;
  1455. definition:=nil;
  1456. len:=0;
  1457. end;
  1458. constructor tconstsym.init_def(const n : string;t : tconsttype;v : longint;def : pdef);
  1459. begin
  1460. inherited init(n);
  1461. typ:=constsym;
  1462. consttype:=t;
  1463. value:=v;
  1464. definition:=def;
  1465. len:=0;
  1466. end;
  1467. constructor tconstsym.init_string(const n : string;t : tconsttype;str:pchar;l:longint);
  1468. begin
  1469. inherited init(n);
  1470. typ:=constsym;
  1471. consttype:=t;
  1472. value:=longint(str);
  1473. definition:=nil;
  1474. len:=l;
  1475. if t=constresourcestring then
  1476. ResStrIndex:=registerresourcestring(name,pchar(value),len);
  1477. end;
  1478. constructor tconstsym.load;
  1479. var
  1480. pd : pbestreal;
  1481. ps : pnormalset;
  1482. begin
  1483. tsym.load;
  1484. typ:=constsym;
  1485. consttype:=tconsttype(readbyte);
  1486. case consttype of
  1487. constint,
  1488. constbool,
  1489. constchar :
  1490. value:=readlong;
  1491. constpointer,
  1492. constord :
  1493. begin
  1494. definition:=readdefref;
  1495. value:=readlong;
  1496. end;
  1497. conststring,constresourcestring :
  1498. begin
  1499. len:=readlong;
  1500. getmem(pchar(value),len+1);
  1501. current_ppu^.getdata(pchar(value)^,len);
  1502. if consttype=constresourcestring then
  1503. ResStrIndex:=readlong;
  1504. end;
  1505. constreal :
  1506. begin
  1507. new(pd);
  1508. pd^:=readreal;
  1509. value:=longint(pd);
  1510. end;
  1511. constset :
  1512. begin
  1513. definition:=readdefref;
  1514. new(ps);
  1515. readnormalset(ps^);
  1516. value:=longint(ps);
  1517. end;
  1518. constnil : ;
  1519. else
  1520. Message1(unit_f_ppu_invalid_entry,tostr(ord(consttype)));
  1521. end;
  1522. end;
  1523. destructor tconstsym.done;
  1524. begin
  1525. case consttype of
  1526. conststring :
  1527. freemem(pchar(value),len+1);
  1528. constreal :
  1529. dispose(pbestreal(value));
  1530. constset :
  1531. dispose(pnormalset(value));
  1532. end;
  1533. inherited done;
  1534. end;
  1535. function tconstsym.mangledname : string;
  1536. begin
  1537. mangledname:=name;
  1538. end;
  1539. procedure tconstsym.deref;
  1540. begin
  1541. if consttype in [constord,constpointer,constset] then
  1542. resolvedef(pdef(definition));
  1543. end;
  1544. procedure tconstsym.write;
  1545. begin
  1546. tsym.write;
  1547. writebyte(byte(consttype));
  1548. case consttype of
  1549. constnil : ;
  1550. constint,
  1551. constbool,
  1552. constchar :
  1553. writelong(value);
  1554. constpointer,
  1555. constord :
  1556. begin
  1557. writedefref(definition);
  1558. writelong(value);
  1559. end;
  1560. conststring,constresourcestring :
  1561. begin
  1562. writelong(len);
  1563. current_ppu^.putdata(pchar(value)^,len);
  1564. if consttype=constresourcestring then
  1565. writelong(ResStrIndex);
  1566. end;
  1567. constreal :
  1568. writereal(pbestreal(value)^);
  1569. constset :
  1570. begin
  1571. writedefref(definition);
  1572. writenormalset(pointer(value)^);
  1573. end;
  1574. else
  1575. internalerror(13);
  1576. end;
  1577. current_ppu^.writeentry(ibconstsym);
  1578. end;
  1579. {$ifdef GDB}
  1580. function tconstsym.stabstring : pchar;
  1581. var st : string;
  1582. begin
  1583. {even GDB v4.16 only now 'i' 'r' and 'e' !!!}
  1584. case consttype of
  1585. conststring : begin
  1586. { I had to remove ibm2ascii !! }
  1587. st := pstring(value)^;
  1588. {st := ibm2ascii(pstring(value)^);}
  1589. st := 's'''+st+'''';
  1590. end;
  1591. constbool,
  1592. constint,
  1593. constpointer,
  1594. constord,
  1595. constchar : st := 'i'+tostr(value);
  1596. constreal : begin
  1597. system.str(pbestreal(value)^,st);
  1598. st := 'r'+st;
  1599. end;
  1600. { if we don't know just put zero !! }
  1601. else st:='i0';
  1602. {***SETCONST}
  1603. {constset:;} {*** I don't know what to do with a set.}
  1604. { sets are not recognized by GDB}
  1605. {***}
  1606. end;
  1607. stabstring := strpnew('"'+name+':c='+st+'",'+tostr(N_function)+',0,'+
  1608. tostr(fileinfo.line)+',0');
  1609. end;
  1610. procedure tconstsym.concatstabto(asmlist : paasmoutput);
  1611. begin
  1612. if consttype <> conststring then
  1613. inherited concatstabto(asmlist);
  1614. end;
  1615. {$endif GDB}
  1616. {****************************************************************************
  1617. TENUMSYM
  1618. ****************************************************************************}
  1619. constructor tenumsym.init(const n : string;def : penumdef;v : longint);
  1620. begin
  1621. tsym.init(n);
  1622. typ:=enumsym;
  1623. definition:=def;
  1624. value:=v;
  1625. if def^.min>v then
  1626. def^.setmin(v);
  1627. if def^.max<v then
  1628. def^.setmax(v);
  1629. order;
  1630. end;
  1631. constructor tenumsym.load;
  1632. begin
  1633. tsym.load;
  1634. typ:=enumsym;
  1635. definition:=penumdef(readdefref);
  1636. value:=readlong;
  1637. nextenum := Nil;
  1638. end;
  1639. procedure tenumsym.deref;
  1640. begin
  1641. resolvedef(pdef(definition));
  1642. order;
  1643. end;
  1644. procedure tenumsym.order;
  1645. var
  1646. sym : penumsym;
  1647. begin
  1648. sym := definition^.firstenum;
  1649. if sym = nil then
  1650. begin
  1651. definition^.firstenum := @self;
  1652. nextenum := nil;
  1653. exit;
  1654. end;
  1655. { reorder the symbols in increasing value }
  1656. if value < sym^.value then
  1657. begin
  1658. nextenum := sym;
  1659. definition^.firstenum := @self;
  1660. end
  1661. else
  1662. begin
  1663. while (sym^.value <= value) and assigned(sym^.nextenum) do
  1664. sym := sym^.nextenum;
  1665. nextenum := sym^.nextenum;
  1666. sym^.nextenum := @self;
  1667. end;
  1668. end;
  1669. procedure tenumsym.write;
  1670. begin
  1671. tsym.write;
  1672. writedefref(definition);
  1673. writelong(value);
  1674. current_ppu^.writeentry(ibenumsym);
  1675. end;
  1676. {$ifdef GDB}
  1677. procedure tenumsym.concatstabto(asmlist : paasmoutput);
  1678. begin
  1679. {enum elements have no stab !}
  1680. end;
  1681. {$EndIf GDB}
  1682. {****************************************************************************
  1683. TTYPESYM
  1684. ****************************************************************************}
  1685. constructor ttypesym.init(const n : string;d : pdef);
  1686. begin
  1687. tsym.init(n);
  1688. typ:=typesym;
  1689. definition:=d;
  1690. {$ifdef GDB}
  1691. isusedinstab := false;
  1692. {$endif GDB}
  1693. if assigned(definition) then
  1694. begin
  1695. if not(assigned(definition^.sym)) then
  1696. begin
  1697. definition^.sym:=@self;
  1698. synonym:=nil;
  1699. {$ifdef INCLUDEOK}
  1700. include(symoptions,sp_primary_typesym);
  1701. {$else}
  1702. symoptions:=symoptions+[sp_primary_typesym];
  1703. {$endif}
  1704. end
  1705. else
  1706. begin
  1707. synonym:=definition^.sym^.synonym;
  1708. definition^.sym^.synonym:=@self;
  1709. end;
  1710. end;
  1711. end;
  1712. constructor ttypesym.load;
  1713. begin
  1714. tsym.load;
  1715. typ:=typesym;
  1716. synonym:=nil;
  1717. {$ifdef GDB}
  1718. isusedinstab := false;
  1719. {$endif GDB}
  1720. definition:=readdefref;
  1721. end;
  1722. destructor ttypesym.done;
  1723. var prevsym : ptypesym;
  1724. begin
  1725. if assigned(definition) then
  1726. begin
  1727. prevsym:=definition^.sym;
  1728. if prevsym=@self then
  1729. definition^.sym:=synonym;
  1730. while assigned(prevsym) do
  1731. begin
  1732. if (prevsym^.synonym=@self) then
  1733. begin
  1734. prevsym^.synonym:=synonym;
  1735. break;
  1736. end;
  1737. prevsym:=prevsym^.synonym;
  1738. end;
  1739. end;
  1740. synonym:=nil;
  1741. definition:=nil;
  1742. inherited done;
  1743. end;
  1744. procedure ttypesym.deref;
  1745. begin
  1746. resolvedef(definition);
  1747. if assigned(definition) then
  1748. begin
  1749. if (sp_primary_typesym in symoptions) then
  1750. begin
  1751. if definition^.sym<>@self then
  1752. synonym:=definition^.sym;
  1753. definition^.sym:=@self;
  1754. end
  1755. else
  1756. begin
  1757. if assigned(definition^.sym) then
  1758. begin
  1759. synonym:=definition^.sym^.synonym;
  1760. if definition^.sym<>@self then
  1761. definition^.sym^.synonym:=@self;
  1762. end
  1763. else
  1764. definition^.sym:=@self;
  1765. end;
  1766. if (definition^.deftype=recorddef) and assigned(precorddef(definition)^.symtable) and
  1767. (definition^.sym=@self) then
  1768. precorddef(definition)^.symtable^.name:=stringdup('record '+name);
  1769. end;
  1770. end;
  1771. procedure ttypesym.write;
  1772. begin
  1773. tsym.write;
  1774. writedefref(definition);
  1775. current_ppu^.writeentry(ibtypesym);
  1776. end;
  1777. procedure ttypesym.load_references;
  1778. begin
  1779. inherited load_references;
  1780. if (definition^.deftype=recorddef) then
  1781. precorddef(definition)^.symtable^.load_browser;
  1782. if (definition^.deftype=objectdef) then
  1783. pobjectdef(definition)^.symtable^.load_browser;
  1784. end;
  1785. function ttypesym.write_references : boolean;
  1786. begin
  1787. if not inherited write_references then
  1788. { write address of this symbol if record or object
  1789. even if no real refs are there
  1790. because we need it for the symtable }
  1791. if (definition^.deftype=recorddef) or
  1792. (definition^.deftype=objectdef) then
  1793. begin
  1794. writesymref(@self);
  1795. current_ppu^.writeentry(ibsymref);
  1796. end;
  1797. write_references:=true;
  1798. if (definition^.deftype=recorddef) then
  1799. precorddef(definition)^.symtable^.write_browser;
  1800. if (definition^.deftype=objectdef) then
  1801. pobjectdef(definition)^.symtable^.write_browser;
  1802. end;
  1803. {$ifdef BrowserLog}
  1804. procedure ttypesym.add_to_browserlog;
  1805. begin
  1806. inherited add_to_browserlog;
  1807. if (definition^.deftype=recorddef) then
  1808. precorddef(definition)^.symtable^.writebrowserlog;
  1809. if (definition^.deftype=objectdef) then
  1810. pobjectdef(definition)^.symtable^.writebrowserlog;
  1811. end;
  1812. {$endif BrowserLog}
  1813. {$ifdef GDB}
  1814. function ttypesym.stabstring : pchar;
  1815. var stabchar : string[2];
  1816. short : string;
  1817. begin
  1818. if definition^.deftype in tagtypes then
  1819. stabchar := 'Tt'
  1820. else
  1821. stabchar := 't';
  1822. short := '"'+name+':'+stabchar+definition^.numberstring
  1823. +'",'+tostr(N_LSYM)+',0,'+tostr(fileinfo.line)+',0';
  1824. stabstring := strpnew(short);
  1825. end;
  1826. procedure ttypesym.concatstabto(asmlist : paasmoutput);
  1827. begin
  1828. {not stabs for forward defs }
  1829. if assigned(definition) then
  1830. if (definition^.sym = @self) then
  1831. definition^.concatstabto(asmlist)
  1832. else
  1833. inherited concatstabto(asmlist);
  1834. end;
  1835. {$endif GDB}
  1836. {****************************************************************************
  1837. TSYSSYM
  1838. ****************************************************************************}
  1839. constructor tsyssym.init(const n : string;l : longint);
  1840. begin
  1841. inherited init(n);
  1842. typ:=syssym;
  1843. number:=l;
  1844. end;
  1845. constructor tsyssym.load;
  1846. begin
  1847. tsym.load;
  1848. typ:=syssym;
  1849. number:=readlong;
  1850. end;
  1851. destructor tsyssym.done;
  1852. begin
  1853. inherited done;
  1854. end;
  1855. procedure tsyssym.write;
  1856. begin
  1857. tsym.write;
  1858. writelong(number);
  1859. current_ppu^.writeentry(ibsyssym);
  1860. end;
  1861. {$ifdef GDB}
  1862. procedure tsyssym.concatstabto(asmlist : paasmoutput);
  1863. begin
  1864. end;
  1865. {$endif GDB}
  1866. {****************************************************************************
  1867. TMACROSYM
  1868. ****************************************************************************}
  1869. constructor tmacrosym.init(const n : string);
  1870. begin
  1871. inherited init(n);
  1872. typ:=macrosym;
  1873. defined:=true;
  1874. defined_at_startup:=false;
  1875. is_used:=false;
  1876. buftext:=nil;
  1877. buflen:=0;
  1878. end;
  1879. destructor tmacrosym.done;
  1880. begin
  1881. if assigned(buftext) then
  1882. freemem(buftext,buflen);
  1883. inherited done;
  1884. end;
  1885. {
  1886. $Log$
  1887. Revision 1.121 1999-10-01 08:02:48 peter
  1888. * forward type declaration rewritten
  1889. Revision 1.120 1999/09/27 23:44:58 peter
  1890. * procinfo is now a pointer
  1891. * support for result setting in sub procedure
  1892. Revision 1.119 1999/09/26 21:30:22 peter
  1893. + constant pointer support which can happend with typecasting like
  1894. const p=pointer(1)
  1895. * better procvar parsing in typed consts
  1896. Revision 1.118 1999/09/20 16:39:03 peter
  1897. * cs_create_smart instead of cs_smartlink
  1898. * -CX is create smartlink
  1899. * -CD is create dynamic, but does nothing atm.
  1900. Revision 1.117 1999/08/31 15:42:24 pierre
  1901. + tmacrosym is_used and defined_at_startup boolean fields added
  1902. Revision 1.116 1999/08/24 22:38:55 michael
  1903. * more resourcestring changes
  1904. Revision 1.115 1999/08/23 11:45:42 michael
  1905. * Hopefully final attempt at resourcestrings
  1906. Revision 1.114 1999/08/15 21:57:58 michael
  1907. Changes for resource strings
  1908. Revision 1.113 1999/08/14 00:39:00 peter
  1909. * hack to support property with record fields
  1910. Revision 1.112 1999/08/13 14:24:20 pierre
  1911. + stabs for classes and classref working,
  1912. a class still needs an ^ to get that content of it,
  1913. but the class fields inside a class don't result into an
  1914. infinite loop anymore!
  1915. Revision 1.111 1999/08/10 12:36:31 pierre
  1916. * use of procsym field for correct gdb info in local procedures
  1917. * exported DLL vars made global to be able to use DLLTOOL with themz
  1918. Revision 1.110 1999/08/07 14:21:03 florian
  1919. * some small problems fixed
  1920. Revision 1.109 1999/08/07 13:24:34 daniel
  1921. * Fixed open arrays
  1922. Revision 1.108 1999/08/05 16:53:17 peter
  1923. * V_Fatal=1, all other V_ are also increased
  1924. * Check for local procedure when assigning procvar
  1925. * fixed comment parsing because directives
  1926. * oldtp mode directives better supported
  1927. * added some messages to errore.msg
  1928. Revision 1.107 1999/08/04 13:45:30 florian
  1929. + floating point register variables !!
  1930. * pairegalloc is now generated for register variables
  1931. Revision 1.106 1999/08/03 22:03:19 peter
  1932. * moved bitmask constants to sets
  1933. * some other type/const renamings
  1934. Revision 1.105 1999/07/29 20:54:10 peter
  1935. * write .size also
  1936. Revision 1.104 1999/07/27 23:42:21 peter
  1937. * indirect type referencing is now allowed
  1938. Revision 1.103 1999/07/24 15:12:59 michael
  1939. changes for resourcestrings
  1940. Revision 1.102 1999/07/24 13:36:23 michael
  1941. * Fixed resourcestring writing to units
  1942. Revision 1.101 1999/07/23 20:59:23 peter
  1943. * more C packing fixes
  1944. Revision 1.100 1999/07/23 16:05:32 peter
  1945. * alignment is now saved in the symtable
  1946. * C alignment added for records
  1947. * PPU version increased to solve .12 <-> .13 probs
  1948. Revision 1.99 1999/07/23 11:33:23 peter
  1949. * removed oldppu from propertysym
  1950. Revision 1.98 1999/07/22 09:37:55 florian
  1951. + resourcestring implemented
  1952. + start of longstring support
  1953. Revision 1.97 1999/07/05 12:13:25 florian
  1954. * property reading from PPU fixed (new PPU format), it uses now writesym...
  1955. Revision 1.96 1999/06/28 10:49:48 pierre
  1956. merged from 0-99-12 branch
  1957. Revision 1.94.2.2 1999/06/28 10:32:29 pierre
  1958. * fixes bug453
  1959. Revision 1.94.2.1 1999/06/22 16:26:45 pierre
  1960. * local browser stuff corrected
  1961. Revision 1.94 1999/06/03 16:25:05 pierre
  1962. * local Cvar stabs corrected
  1963. Revision 1.93 1999/05/27 19:45:06 peter
  1964. * removed oldasm
  1965. * plabel -> pasmlabel
  1966. * -a switches to source writing automaticly
  1967. * assembler readers OOPed
  1968. * asmsymbol automaticly external
  1969. * jumptables and other label fixes for asm readers
  1970. Revision 1.92 1999/05/21 13:55:21 peter
  1971. * NEWLAB for label as symbol
  1972. Revision 1.91 1999/05/20 22:22:44 pierre
  1973. + added synonym filed for ttypesym
  1974. allows a clean disposal of tdefs and related ttypesyms
  1975. Revision 1.90 1999/05/17 13:11:40 pierre
  1976. * unitsym security stuff
  1977. Revision 1.89 1999/05/13 21:59:45 peter
  1978. * removed oldppu code
  1979. * warning if objpas is loaded from uses
  1980. * first things for new deref writing
  1981. Revision 1.88 1999/05/10 09:01:43 peter
  1982. * small message fixes
  1983. Revision 1.87 1999/05/08 19:52:38 peter
  1984. + MessagePos() which is enhanced Message() function but also gets the
  1985. position info
  1986. * Removed comp warnings
  1987. Revision 1.86 1999/05/07 00:06:22 pierre
  1988. + added aligmnent of data for typed consts
  1989. for var it is done by AS or LD or in ag386bin for direct object output
  1990. Revision 1.85 1999/05/04 21:45:07 florian
  1991. * changes to compile it with Delphi 4.0
  1992. Revision 1.84 1999/05/04 16:05:13 pierre
  1993. * fix for unitsym problem
  1994. Revision 1.83 1999/04/28 06:02:13 florian
  1995. * changes of Bruessel:
  1996. + message handler can now take an explicit self
  1997. * typinfo fixed: sometimes the type names weren't written
  1998. * the type checking for pointer comparisations and subtraction
  1999. and are now more strict (was also buggy)
  2000. * small bug fix to link.pas to support compiling on another
  2001. drive
  2002. * probable bug in popt386 fixed: call/jmp => push/jmp
  2003. transformation didn't count correctly the jmp references
  2004. + threadvar support
  2005. * warning if ln/sqrt gets an invalid constant argument
  2006. Revision 1.82 1999/04/26 13:31:52 peter
  2007. * release storenumber,double_checksum
  2008. Revision 1.81 1999/04/25 22:38:39 pierre
  2009. + added is_really_const booleanfield for typedconstsym
  2010. for Delphi in $J- mode (not yet implemented !)
  2011. Revision 1.80 1999/04/21 09:43:54 peter
  2012. * storenumber works
  2013. * fixed some typos in double_checksum
  2014. + incompatible types type1 and type2 message (with storenumber)
  2015. Revision 1.79 1999/04/17 13:16:21 peter
  2016. * fixes for storenumber
  2017. Revision 1.78 1999/04/14 09:15:02 peter
  2018. * first things to store the symbol/def number in the ppu
  2019. Revision 1.77 1999/04/08 10:11:32 pierre
  2020. + enable uninitilized warnings for static symbols
  2021. Revision 1.76 1999/03/31 13:55:21 peter
  2022. * assembler inlining working for ag386bin
  2023. Revision 1.75 1999/03/24 23:17:27 peter
  2024. * fixed bugs 212,222,225,227,229,231,233
  2025. Revision 1.74 1999/02/23 18:29:27 pierre
  2026. * win32 compilation error fix
  2027. + some work for local browser (not cl=omplete yet)
  2028. Revision 1.73 1999/02/22 13:07:09 pierre
  2029. + -b and -bl options work !
  2030. + cs_local_browser ($L+) is disabled if cs_browser ($Y+)
  2031. is not enabled when quitting global section
  2032. * local vars and procedures are not yet stored into PPU
  2033. Revision 1.72 1999/02/08 09:51:22 pierre
  2034. * gdb info for local functions was wrong
  2035. Revision 1.71 1999/01/23 23:29:41 florian
  2036. * first running version of the new code generator
  2037. * when compiling exceptions under Linux fixed
  2038. Revision 1.70 1999/01/21 22:10:48 peter
  2039. * fixed array of const
  2040. * generic platform independent high() support
  2041. Revision 1.69 1999/01/20 10:20:20 peter
  2042. * don't make localvar copies for assembler procedures
  2043. Revision 1.68 1999/01/12 14:25:36 peter
  2044. + BrowserLog for browser.log generation
  2045. + BrowserCol for browser info in TCollections
  2046. * released all other UseBrowser
  2047. Revision 1.67 1998/12/30 22:15:54 peter
  2048. + farpointer type
  2049. * absolutesym now also stores if its far
  2050. Revision 1.66 1998/12/30 13:41:14 peter
  2051. * released valuepara
  2052. Revision 1.65 1998/12/26 15:35:44 peter
  2053. + read/write of constnil
  2054. Revision 1.64 1998/12/08 10:18:15 peter
  2055. + -gh for heaptrc unit
  2056. Revision 1.63 1998/11/28 16:20:56 peter
  2057. + support for dll variables
  2058. Revision 1.62 1998/11/27 14:50:48 peter
  2059. + open strings, $P switch support
  2060. Revision 1.61 1998/11/18 15:44:18 peter
  2061. * VALUEPARA for tp7 compatible value parameters
  2062. Revision 1.60 1998/11/16 10:13:51 peter
  2063. * label defines are checked at the end of the proc
  2064. Revision 1.59 1998/11/13 12:09:11 peter
  2065. * unused label is now a warning
  2066. Revision 1.58 1998/11/10 10:50:57 pierre
  2067. * temporary fix for long mangled procsym names
  2068. Revision 1.57 1998/11/05 23:39:31 peter
  2069. + typedconst.getsize
  2070. Revision 1.56 1998/10/28 18:26:18 pierre
  2071. * removed some erros after other errors (introduced by useexcept)
  2072. * stabs works again correctly (for how long !)
  2073. Revision 1.55 1998/10/20 08:07:00 pierre
  2074. * several memory corruptions due to double freemem solved
  2075. => never use p^.loc.location:=p^.left^.loc.location;
  2076. + finally I added now by default
  2077. that ra386dir translates global and unit symbols
  2078. + added a first field in tsymtable and
  2079. a nextsym field in tsym
  2080. (this allows to obtain ordered type info for
  2081. records and objects in gdb !)
  2082. Revision 1.54 1998/10/19 08:55:07 pierre
  2083. * wrong stabs info corrected once again !!
  2084. + variable vmt offset with vmt field only if required
  2085. implemented now !!!
  2086. Revision 1.53 1998/10/16 08:51:53 peter
  2087. + target_os.stackalignment
  2088. + stack can be aligned at 2 or 4 byte boundaries
  2089. Revision 1.52 1998/10/08 17:17:32 pierre
  2090. * current_module old scanner tagged as invalid if unit is recompiled
  2091. + added ppheap for better info on tracegetmem of heaptrc
  2092. (adds line column and file index)
  2093. * several memory leaks removed ith help of heaptrc !!
  2094. Revision 1.51 1998/10/08 13:48:50 peter
  2095. * fixed memory leaks for do nothing source
  2096. * fixed unit interdependency
  2097. Revision 1.50 1998/10/06 17:16:56 pierre
  2098. * some memory leaks fixed (thanks to Peter for heaptrc !)
  2099. Revision 1.49 1998/10/01 09:22:55 peter
  2100. * fixed value openarray
  2101. * ungettemp of arrayconstruct
  2102. Revision 1.48 1998/09/26 17:45:44 peter
  2103. + idtoken and only one token table
  2104. Revision 1.47 1998/09/24 15:11:17 peter
  2105. * fixed enum for not GDB
  2106. Revision 1.46 1998/09/23 15:39:13 pierre
  2107. * browser bugfixes
  2108. was adding a reference when looking for the symbol
  2109. if -bSYM_NAME was used
  2110. Revision 1.45 1998/09/21 08:45:24 pierre
  2111. + added vmt_offset in tobjectdef.write for fututre use
  2112. (first steps to have objects without vmt if no virtual !!)
  2113. + added fpu_used field for tabstractprocdef :
  2114. sets this level to 2 if the functions return with value in FPU
  2115. (is then set to correct value at parsing of implementation)
  2116. THIS MIGHT refuse some code with FPU expression too complex
  2117. that were accepted before and even in some cases
  2118. that don't overflow in fact
  2119. ( like if f : float; is a forward that finally in implementation
  2120. only uses one fpu register !!)
  2121. Nevertheless I think that it will improve security on
  2122. FPU operations !!
  2123. * most other changes only for UseBrowser code
  2124. (added symtable references for record and objects)
  2125. local switch for refs to args and local of each function
  2126. (static symtable still missing)
  2127. UseBrowser still not stable and probably broken by
  2128. the definition hash array !!
  2129. Revision 1.44 1998/09/18 16:03:47 florian
  2130. * some changes to compile with Delphi
  2131. Revision 1.43 1998/09/18 08:01:38 pierre
  2132. + improvement on the usebrowser part
  2133. (does not work correctly for now)
  2134. Revision 1.42 1998/09/07 19:33:25 florian
  2135. + some stuff for property rtti added:
  2136. - NameIndex of the TPropInfo record is now written correctly
  2137. - the DEFAULT/NODEFAULT keyword is supported now
  2138. - the default value and the storedsym/def are now written to
  2139. the PPU fiel
  2140. Revision 1.41 1998/09/07 18:46:12 peter
  2141. * update smartlinking, uses getdatalabel
  2142. * renamed ptree.value vars to value_str,value_real,value_set
  2143. Revision 1.40 1998/09/07 17:37:04 florian
  2144. * first fixes for published properties
  2145. Revision 1.39 1998/09/05 22:11:02 florian
  2146. + switch -vb
  2147. * while/repeat loops accept now also word/longbool conditions
  2148. * makebooltojump did an invalid ungetregister32, fixed
  2149. Revision 1.38 1998/09/01 12:53:26 peter
  2150. + aktpackenum
  2151. Revision 1.37 1998/09/01 07:54:25 pierre
  2152. * UseBrowser a little updated (might still be buggy !!)
  2153. * bug in psub.pas in function specifier removed
  2154. * stdcall allowed in interface and in implementation
  2155. (FPC will not yet complain if it is missing in either part
  2156. because stdcall is only a dummy !!)
  2157. Revision 1.36 1998/08/25 13:09:26 pierre
  2158. * corrected mangling sheme :
  2159. cvar add Cprefix to the mixed case name whereas
  2160. export or public use direct name
  2161. Revision 1.35 1998/08/25 12:42:46 pierre
  2162. * CDECL changed to CVAR for variables
  2163. specifications are read in structures also
  2164. + started adding GPC compatibility mode ( option -Sp)
  2165. * names changed to lowercase
  2166. Revision 1.34 1998/08/21 14:08:53 pierre
  2167. + TEST_FUNCRET now default (old code removed)
  2168. works also for m68k (at least compiles)
  2169. Revision 1.33 1998/08/20 12:53:27 peter
  2170. * object_options are always written for object syms
  2171. Revision 1.32 1998/08/20 09:26:46 pierre
  2172. + funcret setting in underproc testing
  2173. compile with _dTEST_FUNCRET
  2174. Revision 1.31 1998/08/17 10:10:12 peter
  2175. - removed OLDPPU
  2176. Revision 1.30 1998/08/13 10:57:29 peter
  2177. * constant sets are now written correctly to the ppufile
  2178. Revision 1.29 1998/08/11 15:31:42 peter
  2179. * write extended to ppu file
  2180. * new version 0.99.7
  2181. Revision 1.28 1998/08/11 14:07:27 peter
  2182. * fixed pushing of high value for openarray
  2183. Revision 1.27 1998/08/10 14:50:31 peter
  2184. + localswitches, moduleswitches, globalswitches splitting
  2185. Revision 1.26 1998/08/10 10:18:35 peter
  2186. + Compiler,Comphook unit which are the new interface units to the
  2187. compiler
  2188. Revision 1.25 1998/07/30 11:18:19 florian
  2189. + first implementation of try ... except on .. do end;
  2190. * limitiation of 65535 bytes parameters for cdecl removed
  2191. Revision 1.24 1998/07/20 18:40:16 florian
  2192. * handling of ansi string constants should now work
  2193. Revision 1.23 1998/07/14 21:37:24 peter
  2194. * fixed packrecords as discussed at the alias
  2195. Revision 1.22 1998/07/14 14:47:08 peter
  2196. * released NEWINPUT
  2197. Revision 1.21 1998/07/13 21:17:38 florian
  2198. * changed to compile with TP
  2199. Revision 1.20 1998/07/10 00:00:05 peter
  2200. * fixed ttypesym bug finally
  2201. * fileinfo in the symtable and better using for unused vars
  2202. Revision 1.19 1998/07/07 17:40:39 peter
  2203. * packrecords 4 works
  2204. * word aligning of parameters
  2205. Revision 1.18 1998/07/07 11:20:15 peter
  2206. + NEWINPUT for a better inputfile and scanner object
  2207. Revision 1.17 1998/06/24 14:48:40 peter
  2208. * ifdef newppu -> ifndef oldppu
  2209. Revision 1.16 1998/06/19 15:40:42 peter
  2210. * removed cosntructor/constructor warning and 0.99.5 recompiles it again
  2211. Revision 1.15 1998/06/17 14:10:18 peter
  2212. * small os2 fixes
  2213. * fixed interdependent units with newppu (remake3 under linux works now)
  2214. Revision 1.14 1998/06/16 08:56:34 peter
  2215. + targetcpu
  2216. * cleaner pmodules for newppu
  2217. Revision 1.13 1998/06/15 15:38:10 pierre
  2218. * small bug in systems.pas corrected
  2219. + operators in different units better hanlded
  2220. Revision 1.12 1998/06/15 14:23:44 daniel
  2221. * Reverted my changes.
  2222. Revision 1.10 1998/06/13 00:10:18 peter
  2223. * working browser and newppu
  2224. * some small fixes against crashes which occured in bp7 (but not in
  2225. fpc?!)
  2226. Revision 1.9 1998/06/12 16:15:35 pierre
  2227. * external name 'C_var';
  2228. export name 'intern_C_var';
  2229. cdecl;
  2230. cdecl;external;
  2231. are now supported only with -Sv switch
  2232. Revision 1.8 1998/06/11 10:11:59 peter
  2233. * -gb works again
  2234. Revision 1.7 1998/06/09 16:01:51 pierre
  2235. + added procedure directive parsing for procvars
  2236. (accepted are popstack cdecl and pascal)
  2237. + added C vars with the following syntax
  2238. var C calias 'true_c_name';(can be followed by external)
  2239. reason is that you must add the Cprefix
  2240. which is target dependent
  2241. Revision 1.6 1998/06/08 22:59:53 peter
  2242. * smartlinking works for win32
  2243. * some defines to exclude some compiler parts
  2244. Revision 1.5 1998/06/04 23:52:02 peter
  2245. * m68k compiles
  2246. + .def file creation moved to gendef.pas so it could also be used
  2247. for win32
  2248. Revision 1.4 1998/06/04 09:55:46 pierre
  2249. * demangled name of procsym reworked to become independant of the mangling scheme
  2250. Revision 1.3 1998/06/03 22:14:20 florian
  2251. * problem with sizes of classes fixed (if the anchestor was declared
  2252. forward, the compiler doesn't update the child classes size)
  2253. Revision 1.2 1998/05/28 14:40:29 peter
  2254. * fixes for newppu, remake3 works now with it
  2255. Revision 1.1 1998/05/27 19:45:09 peter
  2256. * symtable.pas splitted into includefiles
  2257. * symtable adapted for $ifndef OLDPPU
  2258. }