2
0

symsym.inc 73 KB

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