symsym.inc 74 KB

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