fbdbg  3.0
FreeBASIC Debugger
fbdbg2_extract.bas
Go to the documentation of this file.
1 
6 
7 '============== extract
8 
9 Function name_extract(a As String) As String 'extract file name from full name
10  Dim i As Integer
11  For i=Len(a) To 1 Step -1
12  If a[i-1]=Asc(":") Or a[i-1]=Asc("\") Or a[i-1]=Asc("/") Then Exit For
13  Next
14  Return Mid(a,i+1)
15 End Function
16 Function Common_exist(ad As UInteger) As Integer
17  For i As Integer = 1 To vrbgbl
18  If vrb(i).adr=ad Then Return TRUE 'return true if a common still stored
19  Next
20  Return FALSE
21 End Function
22 Sub enum_check(idx As Integer)
23  For i As Integer =1 To udtmax-1
24  If udt(i).en Then 'enum
25  If udt(idx).nm=udt(i).nm Then 'same name
26  If udt(idx).ub-udt(idx).lb=udt(i).ub-udt(i).lb Then 'same number of elements
27  If cudt(udt(idx).ub).nm=cudt(udt(i).ub).nm Then 'same name for last element
28  If cudt(udt(idx).lb).nm=cudt(udt(i).lb).nm Then 'same name for first element
29  'enum are considered same
30  udt(idx).lb=udt(i).lb:udt(idx).ub=udt(i).ub
31  udt(idx).en=i
32  cudtnb=cudtnbsav
33  Exit Sub
34  EndIf
35  EndIf
36  EndIf
37  EndIf
38  EndIf
39  Next
40 End Sub
41 Function cutup_names(strg As String) As String
42  '"__ZN9TESTNAMES2XXE:S1
43  Dim As Integer p,d
44  Dim As String nm,strg2,nm2
45  p=InStr(strg,"_ZN")
46  strg2=Mid(strg,p+3,999)
47  p=Val(strg2)
48  If p>9 Then d=3 Else d=2
49  nm=Mid(strg2,d,p)
50  strg2=Mid(strg2,d+p)
51  p=Val(strg2)
52  If p>9 Then d=3 Else d=2
53  nm2=Mid(strg2,d,p)
54  Return "NS : "+nm+"."+nm2
55 End Function
56 Function cutup_scp(gv As Byte, ad As UInteger,dlldelta As Integer=0) As Integer
57  Dim msg As String
58 Select Case gv
59  Case Asc("S"),Asc("G") 'shared/common
60  If gv=Asc("G") Then If Common_exist(ad) Then Return 0 'to indicate that no needed to continue
61  msg=*__("Reached limit ")'+Str(VGBLMAX)
62  If vrbgbl=VGBLMAX Then simple_message("Init Globals",msg):Exit Function
63  vrbgbl+=1
64  vrb(vrbgbl).adr=ad
65  vrbptr=@vrbgbl
66  Select Case gv
67  Case Asc("S") 'shared
68  vrb(vrbgbl).mem=2
69  vrb(vrbgbl).adr+=dlldelta 'in case of relocation dll, all shared addresses are relocated 06/02/2013
70  Case Asc("G") 'common
71  vrb(vrbgbl).mem=6
72  End Select
73  Return 2
74  Case Else
75  If vrbloc=VARMAX Then simple_message("Init locals","Reached limit "+Str(VARMAX-3000)):Exit Function
76  vrbloc+=1
77  vrb(vrbloc).adr=ad
78  vrbptr=@vrbloc
79  proc(procnb+1).vr=vrbloc+1 'just to have the next beginning
80  Select Case gv
81  Case Asc("V") 'static
82  vrb(vrbloc).mem=3
83  Return 2
84  Case Asc("v") 'byref parameter
85  vrb(vrbloc).mem=4
86  Return 2
87  Case Asc("p") 'byval parameter
88  vrb(vrbloc).mem=5
89  Return 2
90  Case Else 'local
91  vrb(vrbloc).mem=1
92  Return 1
93  End Select
94 End Select
95 End Function
96 Sub cutup_enum(readl As String)
97 '.stabs "TENUM:T26=eESSAI:5,TEST08:8,TEST09:9,TEST10:10,FIN:99,;",128,0,0,0
98 Dim As Integer p,q
99 Dim As String tnm
100 p=InStr(readl,":")
101 tnm=Left(readl,p-1)
102 p+=2 'skip :T
103 q=InStr(readl,"=")
104 udtidx=Val(Mid(readl,p,q-p))
105 udtidx+=udtcpt:If udtidx>udtmax Then udtmax=udtidx
106 If udtmax > TYPEMAX Then simple_message("Storing ENUM="+tnm,"Max limit reached "+Str(TYPEMAX)):Exit Sub
107 udt(udtidx).nm=tnm 'enum name
108 
109 udt(udtidx).en=udtidx 'flag enum, in case of already treated use same previous cudt
110 udt(udtidx).lg=Len(Integer) 'same size as integer
111 'each cudt contains the value (typ) and the associated text (nm)
112 udt(udtidx).lb=cudtnb+1
113 p=q+2
114 cudtnbsav=cudtnb 'save value for restoring see enum_check
115 If InStr(readl,";")=0 Then
116  cudtnb+=1
117  cudt(cudtnb).nm="DUMMY"
118  cudt(cudtnb).val=0
119  simple_message("Storing ENUM="+tnm,"Data not correctly formated "):Exit Sub '28/04/2014
120 Else
121  While readl[p-1]<>Asc(";")
122  q=InStr(p,readl,":") 'text
123  If cudtnb>=CTYPEMAX Then simple_message("Storing ENUM="+tnm,"Max limit reached "+Str(CTYPEMAX)):Exit Sub '28/04/2014
124  cudtnb+=1
125  cudt(cudtnb).nm=Mid(readl,p,q-p)
126 
127  p=q+1
128  q=InStr(p,readl,",") 'value
129  cudt(cudtnb).val=Val(Mid(readl,p,q-p))
130  p=q+1
131 
132  Wend
133 EndIf
134 udt(udtidx).ub=cudtnb
135 enum_check(udtidx) 'eliminate duplicates
136 End Sub
137 Function cutup_array(gv As String,d As Integer,f As Byte) As Integer
138  Dim As Integer p=d,q,c
139 
140 If arrnb>ARRMAX Then simple_message("Max array reached","can't store"):Exit Function
141 arrnb+=1
142 
143 'While gv[p-1]=Asc("a")
144 While InStr(p,gv,"ar")
145  'GCC
146  'p+=4
147 
148  If InStr(gv,"=r(")Then
149  p=InStr(p,gv,";;")+2 'skip range =r(n,n);n;n;;
150  Else
151  p=InStr(p,gv,";")+1 'skip ar1;
152  End If
153 
154 
155  q=InStr(p,gv,";")
156  'END GCC
157  arr(arrnb).nlu(c).lb=Val(Mid(gv,p,q-p)) 'lbound
158 
159  p=q+1
160  q=InStr(p,gv,";")
161  arr(arrnb).nlu(c).ub=Val(Mid(gv,p,q-p))'ubound
162  '''arr(arrnb).nlu(c).nb=arr(arrnb).nlu(c).ub-arr(arrnb).nlu(c).lb+1 'dim
163  p=q+1
164  c+=1
165 Wend
166  arr(arrnb).dm=c 'nb dim
167 If f=TYDIM Then
168  vrb(*vrbptr).arr=@arr(arrnb)
169 Else
170  cudt(cudtnb).arr=@arr(arrnb)
171 End If
172 Return p
173 End Function
174 Sub cutup_2(gv As String,f As Byte)
175 Dim p As Integer=1,c As Integer,e As Integer,gv2 As String,pp As Integer
176 If InStr(gv,"=")=0 Then
177  c=Val(Mid(gv,p,9))
178  If c=udt(15).index Then c=15 '05/11/2013
179  If c>15 Then c+=udtcpt 'udt type so adding the decal
180  pp=0
181  If f=TYUDT Then
182  cudt(cudtnb).typ=c
183  cudt(cudtnb).pt=pp
184  cudt(cudtnb).arr=0 'by default not an array
185  Else
186  vrb(*vrbptr).typ=c
187  vrb(*vrbptr).pt=pp
188  vrb(*vrbptr).arr=0 'by default not an array
189  End If
190 Else
191  If InStr(gv,"=ar1") Then p=cutup_array(gv,InStr(gv,"=ar1")+1,f)
192  gv2=Mid(gv,p)
193  For p=0 To Len(gv2)-1
194  If gv2[p]=Asc("*") Then c+=1
195  If gv2[p]=Asc("=") Then e=p+1
196  Next
197  If c Then 'pointer
198  If InStr(gv2,"=f") Then 'proc
199  If InStr(gv2,"=f7") Then
200  pp=200+c 'sub
201  Else
202  pp=220+c 'function
203  EndIf
204  Else
205  pp=c
206  If gv2[e]=Asc("*")Then e+=1 '09/08/2013
207  End If
208  Else
209  pp=0
210  End If
211  c=Val(Mid(gv2,e+1))
212  If c=udt(15).index Then c=15 '05/11/2013
213  If c>15 Then c+=udtcpt
214  If f=TYUDT Then
215  cudt(cudtnb).pt=pp
216  cudt(cudtnb).typ=c
217  Else
218  vrb(*vrbptr).pt=pp
219  vrb(*vrbptr).typ=c
220  End If
221 EndIf
222 End Sub
223 Sub cutup_udt(readl As String)
224 Dim As Integer p,q,lgbits,flagdouble '31/07/2013
225 Dim As String tnm
226 p=InStr(readl,":")
227 
228 tnm=Left(readl,p-1)
229 If InStr(readl,":Tt") Then
230  p+=3 'skip :Tt
231 Else
232  p+=2 'skip :T GCC
233 EndIf
234 
235 q=InStr(readl,"=")
236 
237 udtidx=Val(Mid(readl,p,q-p))
238 If tnm="OBJECT" OrElse tnm="$fb_Object" Then udt(15).index=udtidx:Exit sub '05/11/2013
239 udtidx+=udtcpt:If udtidx>udtmax Then udtmax=udtidx
240 If udtmax > TYPEMAX-1 Then simple_message("Storing UDT","Max limit reached "+Str(TYPEMAX)):Exit Sub
241 udt(udtidx).nm=tnm
242 If left(tnm,4)="TMP$" Then Exit Sub 'gcc redim
243 p=q+2
244 q=p-1
245 While readl[q]<64
246  q+=1
247 Wend
248 q+=1
249 udt(udtidx).lg=Val(Mid(readl,p,q-p))
250 p=q
251 udt(udtidx).lb=cudtnb+1
252 while readl[p-1]<>Asc(";")
253  'dbg_prt("STORING CUDT "+readl)
254  If cudtnb = CTYPEMAX Then simple_message("Storing CUDT","Max limit reached "+Str(CTYPEMAX)):Exit Sub
255  cudtnb+=1
256 
257 
258 
259  q=InStr(p,readl,":")
260  cudt(cudtnb).nm=Mid(readl,p,q-p) 'variable name
261  p=q+1
262  q=InStr(p,readl,",")
263 
264  cutup_2(Mid(readl,p,q-p),TYUDT) 'variable type
265 
266  '11/05/2014 'new way for redim
267  If Left(udt(cudt(cudtnb).typ).nm,7)="FBARRAY" Then 'new way for redim array
268 
269  '.stabs "__FBARRAY1:Tt25=s32DATA:26=*1,0,32;PTR:27=*7,32,32;SIZE:1,64,32;ELEMENT_LEN:1,96,32;DIMENSIONS:1,128,32;DIMTB:28=ar1;0;0;29,160,96;;",128,0,0,0
270  '.stabs "TTEST2:Tt23=s40VVV:24=ar1;0;1;2,0,16;XXX:1,32,32;ZZZ:25,64,256;;",128,0,0,0
271  '.stabs "__FBARRAY1:Tt21=s32DATA:22=*23,0,32;PTR:30=*7,32,32;SIZE:1,64,32;ELEMENT_LEN:1,96,32;DIMENSIONS:1,128,32;DIMTB:31=ar1;0;0;29,160,96;;",128,0,0,0
272  '.stabs "TTEST:Tt20=s56AAA:3,0,8;BBB:21,32,256;CCC:32=ar1;1;2;10,320,128;;",128,0,0,0
273  '.stabs "__FBARRAY8:Tt18=s116DATA:19=*20,0,32;PTR:33=*7,32,32;SIZE:1,64,32;ELEMENT_LEN:1,96,32;DIMENSIONS:1,128,32;DIMTB:34=ar1;0;0;29,160,768;;",128,0,0,0
274  '.stabs "VTEST:18",128,0,0,-176
275  cudt(cudtnb).pt=cudt(udt(cudt(cudtnb).typ).lb).pt-1 'pointer always al least 1 so reduce by one
276  cudt(cudtnb).typ=cudt(udt(cudt(cudtnb).typ).lb).typ 'real type
277  cudt(cudtnb).arr=Cast(tarr Ptr,-1) 'defined as dyn arr
278 
279  'dbg_prt2("dyn array="+cudt(cudtnb).nm+" "+Str(cudt(cudtnb).typ)+" "+Str(cudt(cudtnb).pt)+" "+cudt(udt(cudt(cudtnb).typ).lb).nm)
280  EndIf
281  'end new redim
282 
283 
284  p=q+1
285  q=InStr(p,readl,",")
286  cudt(cudtnb).ofs=Val(Mid(readl,p,q-p)) 'bits offset / beginning
287  p=q+1
288  q=InStr(p,readl,";")
289  lgbits=Val(Mid(readl,p,q-p)) 'length in bits
290 
291  If cudt(cudtnb).typ<>4 And cudt(cudtnb).pt=0 And cudt(cudtnb).arr=0 Then 'not zstring, pointer,array !!!
292  If lgbits<>udt(cudt(cudtnb).typ).lg*8 Then 'bitfield
293  cudt(cudtnb).typ=TYPEMAX 'special type for bitfield
294  cudt(cudtnb).ofb=cudt(cudtnb).ofs-(cudt(cudtnb).ofs\8) * 8 ' bits mod byte
295  cudt(cudtnb).lg=lgbits 'length in bits
296  End If
297  End If
298  ''''''''''''''''''EndIf 'end change 17/04/2014
299  p=q+1
300  cudt(cudtnb).ofs=cudt(cudtnb).ofs\8 'offset bytes
301 Wend
302 udt(udtidx).ub=cudtnb
303 End Sub
304 Sub cutup_1(gv As String,ad As UInteger, dlldelta As Integer=0) '06/02/2013
305  Dim p As Integer
306  Static defaulttype As Integer '08/08/2013
307  Dim As String vname '13/08/2013
308  If gengcc Then
309  If InStr(gv,"long double:t")<>0 OrElse InStr(gv,"FBSTRING:t")<>0 Then '30/12/2013
310  defaulttype=0
311  ElseIf Left(gv,5)="int:t" OrElse InStr(gv,"_Decimal32:t")<>0 Then '30/12/2013
312  defaulttype=1
313  EndIf
314  Else
315  If InStr(gv,"pchar:t") Then 'last default type
316  defaulttype=0
317  ElseIf InStr(gv,"integer:t") Then
318  defaulttype=1
319  EndIf
320  EndIf
321  If defaulttype Then Exit Sub
322 
323  ''''' TO BE REACTIVATE If gengcc Then translate_gcc(gv)
324 
325  '=====================================================
326  vname=Left(gv,InStr(gv,":")+1)
327  p=InStr(vname,"$")
328  If p=0 Then 'no $ in the string
329  If InStr(vname,":t")<>0 Then
330  If UCase(Left(vname,InStr(vname,":")))<>Left(vname,InStr(vname,":")) Then
331  Exit Sub 'don't keep <lower case name>:t, keep <upper case name>:t => enum
332  EndIf
333  ElseIf InStr(vname,"_ZTSN")<>0 orelse InStr(vname,"_ZTVN")<>0 then
334  Exit Sub 'don't keep _ZTSN or _ZTVN (extra data for class) or with double underscore __Z
335  EndIf
336  If Left(vname,2)="_{" Then Exit Sub '_{fbdata}_<label name> 07/04/2014
337  If Left(vname,3)=".Lt" Then Exit Sub '.Ltxxxx used with data 07/04/2014
338  Else '$ in the string
339  If InStr(p+1,vname,"$") <>0 AndAlso InStr(vname,"$fb_Object")=0 Then '30/12/2013
340  Exit Sub 'don't keep TMP$xx$xx:
341  EndIf
342  '$9CABRIOLET:T(0,51)=s16$BASE:(0,48),0,128;;
343  If InStr(vname,":t")<>0 Then
344  If Left(vname,5)<>"$fb_O" andalso Left(vname,4)<>"TMP$" Then '01/09/2013 redim
345  Exit Sub
346  End If
347  EndIf
348  If InStr(vname,"$fb_RTTI") OrElse InStr(vname,"fb$result$") Then
349  Exit Sub 'don't keep
350  EndIf
351  If Left(vname,3)="vr$" OrElse Left(vname,4)="tmp$" Then
352  Exit Sub 'don't keep vr$xx: or tmp$xx$xx:
353  EndIf
354  'eliminate $ and eventually the number at the end of name ex udt$1 --> udt
355  If Left(vname,4)<>"TMP$" Then '01/09/2013 use with redim no need with 0.91
356  If p<>1 Then gv=Left(gv,p-1)+Mid(gv,InStr(gv,":")) '13/08/2013
357  EndIf
358  EndIf
359  '======================================================
360  If InStr(gv,";;") Then 'defined type or redim var
361  If InStr(gv,":T") Then 'GCC change ":Tt" in just ":T"
362  'UDT
363  cutup_udt(gv)
364  Else
365  'REDIM
366  If cutup_scp(gv[InStr(gv,":")],ad,dlldelta)=0 Then Exit Sub 'Scope / increase number and put adr 06/02/2013
367  'if common exists return 0 so exit sub
368  vrb(*vrbptr).nm=Left(gv,InStr(gv,":")-1) 'var or parameter
369 
370  '.stabs "VTEST:22=s32DATA:25=*23=24=*1,0,32;PTR:26=*23=24=*1,32,32;SIZE:1,64,32;ELEMENT_LEN:1,96,32;DIMENSIONS:1,128,32;dim1_ELEMENTS:1,160,32;dim1_LBOUND:1,192,32;
371  'dim1_UBOUND:1,224,32;;
372  'DATA:27=*dim1_20=*21,0,32;PTR:28=*dim1_20=*21,32,32;SIZE:1,64,32;ELEMENT_LEN:1,96,32;DIMENSIONS:1,128,32;dim1_ELEMENTS:1,160,32;
373  'dim1_LBOUND:1,192,32;dim1_UBOUND:1,224,32;;21",128,0,0,-168
374 
375 
376  p=InStr(gv,";;")+2 ' case dyn var including dyn array field...... 21/04/2014 to be removed when 0.91 is released
377  While InStr(p,gv,";;")<>0 '29/04/2014
378  p=InStr(p,gv,";;")+2
379  Wend
380 
381  cutup_2(Mid(gv,p),TYRDM) 'datatype
382  vrb(*vrbptr).arr=Cast(tarr Ptr,-1) 'redim array
383  EndIf
384  ElseIf InStr(gv,"=e") Then
385  'ENUM
386  cutup_enum(gv)
387  Else
388  'DIM
389  If InStr(gv,"FDBG_COMPIL_INFO") Then Exit Sub '25/04/2013
390  If gv[0]=Asc(":") Then Exit Sub 'no name, added by compiler don't take it
391  p=cutup_scp(gv[InStr(gv,":")],ad,dlldelta)'Scope / increase number and put adr 06/02/2013
392  If p=0 Then Exit Sub 'see redim
393  If InStr(gv,"_ZN") AndAlso InStr(gv,":") Then
394  vrb(*vrbptr).nm=cutup_names(gv) 'namespace
395  Else
396  vrb(*vrbptr).nm=Left(gv,InStr(gv,":")-1) 'var or parameter
397  'to avoid two lines in proc/var tree, case dim shared array and use of erase or u/lbound
398  If vrb(*vrbptr).mem=2 AndAlso vrb(*vrbptr).nm=vrb(*vrbptr-1).nm Then 'check also if shared 09/08/2013
399  *vrbptr-=1 'decrement pointed value, vrbgbl in this case 05/06/2013
400  Exit Sub
401  EndIf
402  End If
403  cutup_2(Mid(gv,InStr(gv,":")+p),TYDIM)
404  '11/05/2014 'new way for redim
405  If Left(udt(vrb(*vrbptr).typ).nm,7)="FBARRAY" Then 'new way for redim array
406 
407  '.stabs "__FBARRAY2:Tt23=s44DATA:24=*10,0,32;PTR:25=*7,32,32;SIZE:1,64,32;ELEMENT_LEN:1,96,32;DIMENSIONS:1,128,32;DIMTB:26=ar1;0;1;22,160,192;;",128,0,0,0
408  '.stabs "MYARRAY2:S23",38,0,0,_MYARRAY2
409  vrb(*vrbptr).pt=cudt(udt(vrb(*vrbptr).typ).lb).pt-1 'pointer always al least 1 so reduce by one
410  vrb(*vrbptr).typ=cudt(udt(vrb(*vrbptr).typ).lb).typ 'real type
411  vrb(*vrbptr).arr=Cast(tarr Ptr,-1) 'defined as dyn arr
412 
413  'dbg_prt2("dyn array="+vrb(*vrbptr).nm+" "+Str(vrb(*vrbptr).typ)+" "+Str(vrb(*vrbptr).pt)+" "+cudt(udt(vrb(*vrbptr).typ).lb).nm)
414  EndIf
415  'end new redim
416  EndIf
417 End Sub
418 Function cutup_op (op As String) As String
419 Select Case op
420 Case "aS"
421  Function = "Let "
422 Case "pl"
423  Function = "+"
424 Case "pL"
425  Function = "+="
426 Case "mi"
427  Function = "-"
428 Case "mI"
429  Function = "-="
430 Case "ml"
431  Function = "*"
432 Case "mL"
433  Function = "*="
434 Case "dv"
435  Function = "/"
436 Case "dV"
437  Function = "/="
438 Case "Dv"
439  Function = "\"
440 Case "DV"
441  Function = "\="
442 Case "rm"
443  Function = "mod"
444 Case "rM"
445  Function = "mod="
446 Case "an"
447  Function = "and"
448 Case "aN"
449  Function = "and="
450 Case "or"
451  Function = "or"
452 Case "oR"
453  Function = "or="
454 Case "aa"
455  Function = "andalso"
456 Case "aA"
457  Function = "andalso="
458 Case "oe"
459  Function = "orelse"
460 Case "oE"
461  Function = "orelse="
462 Case "eo"
463  Function = "xor"
464 Case "eO"
465  Function = "xor="
466 Case "ev"
467  Function = "eqv"
468 Case "eV"
469  Function = "eqv="
470 Case "im"
471  Function = "imp"
472 Case "iM"
473  Function = "imp="
474 Case "ls"
475  Function = "shl"
476 Case "lS"
477  Function = "shl="
478 Case "rs"
479  Function = "shr"
480  Case "rS"
481  Function = "shr="
482 Case "po"
483  Function = "^"
484 Case "pO"
485  Function = "^="
486 Case "ct"
487  Function = "&"
488 Case "cT"
489  Function = "&="
490  Case "eq"
491  Function = "eq"
492 Case "gt"
493  Function = "gt"
494 Case "lt"
495  Function = "lt"
496 Case "ne"
497  Function = "ne"
498 Case "ge"
499  Function = "ge"
500 Case "le"
501  Function = "le"
502 Case "nt"
503  Function = "not"
504  Case "ng"
505  Function = "neg"
506  Case"ps"
507  Function = "ps"
508  Case "ab"
509  Function = "ab"
510  Case "fx"
511  Function = "fix"
512 Case "fc"
513  Function = "frac"
514 Case "sg"
515  Function = "sgn"
516 Case "fl"
517  Function = "floor"
518 Case "nw"
519  Function = "new"
520 Case "na"
521  Function = "new []?"
522 Case "dl"
523  Function = "del"
524 Case "da"
525  Function = "del[]?"
526 Case "de"
527  Function = "."
528 Case "pt"
529  Function = "->"
530 Case "ad"
531  Function = "@"
532 Case "fR"
533  Function = "for"
534 Case "sT"
535  Function = "step"
536 Case "nX"
537  Function = "next"
538  Case "cv"
539  Function = "Cast"
540  Case "C1"
541  Function = "(Constructor)" '02/11/2014
542  Case "D1"
543  Function = "(Destructor)"
544 Case Else
545  Function = "Unknow"
546 End Select
547 End Function
548 Function parse_typeope(vchar As long) As String
549  'RPiR8vector2D or R8vector2DS0_ or R8FBSTRINGR8VECTOR2D
550  Dim As Long typ
551 
552  If vchar=Asc("P") Then
553  Return "*" 'pointer
554  Else
555  'l=long/m=unsigned long/n=__int128/o=unsigned __int128/e=long double, __float80
556  Select Case As Const vchar
557  Case Asc("i")
558  typ=1
559  Case Asc("a")
560  typ=2
561  Case Asc("h")
562  typ=3
563  'Case Asc("") 'Zstring
564  ' typ=4
565  Case Asc("s")
566  typ=5
567  Case Asc("t")
568  typ=6
569  Case Asc("v")
570  typ=7
571  Case Asc("j")
572  typ=8
573  Case Asc("x")
574  typ=9
575  Case Asc("y")
576  typ=10
577  Case Asc("f")
578  typ=11
579  Case Asc("d")
580  typ=12
581  'Case Asc("")'String
582  ' typ=13
583  'Case Asc("")'Fstring
584  ' typ=14
585  Case Else
586  typ=0
587  End Select
588  Return udt(typ).nm
589  EndIf
590 End Function
591 Function cutup_proc(fullname As String) As String '02/11/2014
592  Dim As Long p=3,lg,namecpt,ps
593  Dim As String strg,strg2,names(10),mainname,strg3
594 
595  lg=InStr(fullname,"@")
596  If lg=0 Then lg=InStr(fullname,":")
597  strg=Left(fullname,lg-1)
598 
599  If InStr(strg,"_Z")=0 Then Return strg
600 
601  If strg[2]=Asc("Z") Then p+=1 'add 1 case _ _ Z
602  If strg[p-1]=Asc("N") Then 'nested waiting "E"
603  mainname=""
604  p+=1
605  While Strg[p-1]<>Asc("E")
606  lg=ValInt(Mid(strg,p,2)) 'evaluate possible lenght of name eg 7NAMESPC
607  If lg Then 'name of namespace or udt
608  If lg>9 Then p+=1 '>9 --> 2 characters
609  strg3=Mid(strg,p+1,lg) 'extract name and keep it for later
610  ps=InStr(strg3,"__get__")
611  If ps Then
612  strg3=Left(strg3,ps-1)+" (Get property)"
613  Else
614  ps=InStr(strg3,"__set__")
615  If ps Then
616  strg3=Left(strg3,ps-1)+" (Set property)"
617  EndIf
618  EndIf
619  If mainname="" Then
620  mainname=strg3
621  strg2+=strg3
622  Else
623  mainname+="."+strg3
624  strg2+="."+strg3
625  EndIf
626  namecpt+=1
627  names(namecpt)=mainname
628  p+=1+lg'next name
629  Else 'operator
630  strg2+=" "+cutup_op(Mid(strg,p,2))+" " 'extract name of operator
631  p+=2
632  mainname=""
633  While Strg[p-1]<>Asc("E") 'more data eg FBSTRING,
634  lg=ValInt(Mid(strg,p,2))
635  If lg Then
636  If lg>9 Then p+=1
637  strg3=Mid(strg,p+1,lg) 'extract name and keep it for later
638  If strg3="FBSTRING" Then strg3="string"
639  If mainname="" Then
640  mainname=strg3
641  strg2+=strg3
642  Else
643  mainname+="."+strg3
644  strg2+="."+strg3
645  endif
646  namecpt+=1
647  names(namecpt)=mainname
648  p+=1+lg
649  Else
650  strg2+=parse_typeope(Asc(Mid(strg,p,1)))'mymodif
651  p+=1
652  EndIf
653  Wend
654 
655  EndIf
656  Wend
657  Else
658  strg2=cutup_op(Mid(strg,p,2))+" "
659  p+=2
660  EndIf
661 
662  If strg[p-1]=Asc("E") Then p+=1 'skip "E"
663 
664  'parameters
665  mainname=""
666  strg2+="("
667  While p<=Len(strg)
668  lg=ValInt(Mid(strg,p,2))
669  If lg Then
670  If lg>9 Then p+=1
671  strg3=Mid(strg,p+1,lg) 'extract name and keep it for later
672  If strg3="FBSTRING" Then strg3="String"
673  If mainname="" Then
674  mainname=strg3
675  strg2+=strg3
676  Else
677  mainname+="."+strg3
678  strg2+="."+strg3
679  EndIf
680  namecpt+=1
681  names(namecpt)=mainname
682  p+=1+lg
683  elseIf strg[p-1]=Asc("R") Then
684  If Right(strg2,1)<>"(" AndAlso Right(strg2,1)<>"," Then strg2+=","
685  p+=1
686  elseIf strg[p-1]=Asc("N") Then
687  If Right(strg2,1)<>"(" AndAlso Right(strg2,1)<>"," Then strg2+=","
688  mainname=""
689  p+=1
690  elseIf strg[p-1]=Asc("K") Then
691  If Right(strg2,1)<>"(" AndAlso Right(strg2,1)<>"," Then
692  strg2+=",const."
693  Else
694  strg2+="const.T"
695  EndIf
696  p+=1
697  elseIf strg[p-1]=Asc("E") Then
698  'If Right(strg2,1)<>"," Then strg2+=","
699  p+=1
700  ElseIf strg[p-1]=Asc("S") Then 'S0_ --> 'repeating the previous type
701  If Right(strg2,1)<>"(" AndAlso Right(strg2,1)<>"," Then strg2+=",":mainname=""
702  p+=1
703  If strg[p-1]=asc("_") Then
704  strg3=names(1)
705  p+=1
706  Else
707  strg3=names(strg[p-1]-46)
708  p+=2
709  EndIf
710  If mainname="" Then
711  mainname=strg3
712  strg2+=strg3
713  Else
714  mainname+="."+strg3
715  strg2+="."+strg3
716  EndIf
717  namecpt+=1
718  names(namecpt)=mainname
719  Else
720  If Right(strg2,1)="(" Then
721  strg2+=parse_typeope(Asc(Mid(strg,p,1)))
722  Else
723  strg2+=","+parse_typeope(Asc(Mid(strg,p,1)))
724  EndIf
725  p+=1
726  EndIf
727  Wend
728 
729  strg2+=")"
730  If Right(strg2,6)="(Void)" Then
731  strg2=Left(strg2,Len(strg2)-6)
732  EndIf
733 
734  Return strg2
735 End Function
736 Sub cutup_retval(prcnb As Integer,gv2 As String)
737  'example :f7 --> private sub / :F18=*19=f7" --> public sub ptr / :f18=*19=*1 --> private integer ptr ptr
738  Dim p As Integer,c As Integer,e As Integer
739  For p=0 To Len(gv2)-1
740  If gv2[p]=Asc("*") Then c+=1
741  If gv2[p]=Asc("=") Then e=p+1
742  Next
743  If c Then 'pointer
744  If InStr(gv2,"=f") OrElse InStr(gv2,"=F") Then
745  If InStr(gv2,"=f7") OrElse InStr(gv2,"=F7") Then
746  p=200+c 'sub
747  Else
748  p=220+c 'function
749  EndIf
750  Else
751  If gv2[e]=Asc("*")Then e+=1 '08/08/2013
752  p=c
753  End If
754  Else
755  p=0
756  End If
757  c=Val(Mid(gv2,e+1))
758  If c=udt(15).index Then c=15 '05/11/2013
759  If c>15 Then c+=udtcpt
760  proc(prcnb).pt=p
761  proc(prcnb).rv=c
762 End Sub
763 
764 Function check_source(sourcenm As String) As Integer ' check if source yet stored if not store it, in all cases return the index
765  Static As String fpath
766  If sourcenm="" Then Return -1
767  If Right(sourcenm,1)=SLASH Then fpath=sourcenm:Return -1
768  If instr(sourcenm,":")=0 Then sourcenm=fpath+sourcenm
769 
770  For i As Integer=0 To sourcenb
771  If source(i).fullname=sourcenm Then Return i 'found
772  Next
773  sourcenb+=1 'WARNING TO BE ADDED test source max
774  source(sourcenb).fullname=sourcenm
775  source(sourcenb).shortname=name_extract(sourcenm)
776  Return sourcenb
777 End Function
778 Function stabs_extract(nfile As String,adrdiff As uinteger) As Long 'return 1 if dwarf data for debuggee is found, if not return 0 07/11/2013
779  Dim As Integer counter,flagstd
780  Dim As String dissas_command,code,procnmt,fpath,fname
781  'Dim As Long flagnoread
782  Dim As Long srcprevnb=sourcenb,procnodll=TRUE,lastline,linen,temp
783  Dim As UInteger procadr,varadr,linea
784 
785  If Dir(ExePath2+SLASH+"objdump.exe")="" Then simple_message("Stabs extract","Error : objdump.exe must be in the directory of fbdebugger ("+ExePath2+SLASH+"objdump.exe)"):Return 0 '20/11/2013
786 
787  stff=FreeFile
788  dissas_command=""""""+ExePath2+SLASH+"objdump.exe"""+" -G " """"+nfile+""""""
789  counter=Open Pipe( dissas_command For Input As #stff)
790 
791  Do Until EOF(stff)
792  'If flagnoread=0 Then
793  Line Input #stff, stln
794  'Else
795  ' flagnoread=0
796  'EndIf
797  'dbg_prt2(stln)
798 
799  code=Mid(stln,8,5)
800  Select Case code
801  Case "SLINE" 'first position as most used
802  'Print "Ligne=";Valint(Mid(stln,22,6));" ";ValInt("&h"+Mid(stln,29,8))+procadr
803  linen=Valint(Mid(stln,22,6)):linea=ValInt("&h"+Mid(stln,29,8))+procadr
804  If procnodll Then 'And recupstab.nline>lastline Then
805  If linen Then '09/08/2013
806  If linen>lastline Then
807  'asm with just comment 25/06/2012
808  If linea<>rline(linenb).ad Then ' recupstab.ad+proc2<>rline(linenb).ad Then
809  linenb+=1
810  Else
811  ''''''''TODO reported after start WriteProcessMemory(dbghand,Cast(LPVOID,rline(linenb).ad),@rLine(linenb).sv,1,0)
812  EndIf
813  ' 25/06/2012
814  rline(linenb).ad=linea'recupstab.ad+proc2
815  '''''''''TODO reported after start ReadProcessMemory(dbghand,Cast(LPCVOID,rline(linenb).ad),@rLine(linenb).sv,1,0) 'sav 1 byte before writing &CC
816  If rLine(linenb).sv=-112 Then 'nop, address of looping (eg in a for/next loop correponding to the command next)
817  linenb-=1
818  ''' dbg_prt2("NUM LINE = NOP "+Str(recupstab.nline))'gcc only 25/08/2013
819  Else
820  rLine(linenb).nu=linen:rLine(linenb).pr=procnb
821  Print "ligne=";linen,rline(linenb).ad
822  ''''''''TODO reported after start WriteProcessMemory(dbghand,Cast(LPVOID,rline(linenb).ad),@breakcpu,1,0)
823  #Ifdef fulldbg_prt
824  dbg_prt("Line / adr : "+Str(linen)+" "+Hex(rline(linenb).ad))
825  dbg_prt("")
826  #EndIf
827  If linea-procadr Then lastline=linen 'recupstab.ad<>0 Then lastline=linen 'first proc line always coded 1 but ad=0
828  EndIf
829  Else
830  'dbg_prt2("NUM LINE NOT > LAST LINE")'14/08/2013
831  End If
832  Else
833  'dbg_prt2("NUM LINE = 0")'09/08/2013
834  EndIf
835  '12/01/2014''''''''''''''''Else
836  ''''''''''''''''dbg_prt2("STILL VERY FIRST LINE = "+Str(firstline))'09/08/2013
837  '12/01/2014'''''''''''EndIf
838  End If
839 
840 
841  Case "SO "
842  fname=Mid(stln,45)
843  Print "File=";fname;" xx ";left(stln,45)
844  temp=check_source(fname)
845  If temp<>-1 Then
846  sourceix=temp
847  Print "Current File=";source(sourceix).fullname
848  EndIf
849  Case "LSYM "
850  If Mid(stln,45,10)="integer:t1" Then
851  flagstd=1
852  ElseIf Mid(stln,45,8)="pchar:t1" Then
853  flagstd=0
854  ElseIf flagstd=0 Then
855  If InStr(stln,":Tt") then
856  Print "Udt=";Mid(stln,45,50)
857  cutup_1(Mid(stln,45),0)
858  Else
859  varadr=ValInt("&h"+Mid(stln,29,8))
860  Print "Local var=";Mid(stln,45);" ";varadr
861  cutup_1(Mid(stln,45),varadr)
862  endif
863  EndIf
864  Case "BINCL","SOL "
865  fname=Mid(stln,45)
866  Print"Include file=";fname
867  temp=check_source(fname)
868  If temp<>-1 Then
869  sourceix=temp
870  Print "Current File=";source(sourceix).fullname
871  EndIf
872 
873  Case "EINCL"
874  Case "FUN "
875 
876  If Mid(stln,45)="" Then ''End of proc
877  If procnodll Then
878  'If gengcc=1 Then proc1=recupstab.ad+proc2 'under gcc 36=224 or 224 not use 10/01/2014 TODO check with gengcc
879  'proc(procnb).fn=proc1:proc(procnb).db=proc2
880 
881  procadr=ValInt("&h"+Mid(stln,29,8))'11/05/2015
882  procadr+=proc(procnb).db
883  proc(procnb).fn=procadr
884  If procadr>procfn Then procfn=procadr+1 '24/01/2013 just to be sure to be above see gest_brk
885  Print "procfn=";procfn
886  'dbg_prt2("Procfn stab="+Hex(procfn))
887  EndIf
888  If proc(procnb).nu=rline(linenb).nu AndAlso linenb>2 Then 'for proc added by fbc (constructor, operator, ...) '11/05/2014 adding >2 to avoid case only one line ...
889  proc(procnb).nu=-1
890  For i As Integer =1 To linenb
891  'dbg_prt2("Proc db/fn inside for stab="+Hex(proc(procnb).db)+" "+Hex(proc(procnb).fn))
892  'dbg_prt2("Line Adr="+Hex(rline(i).ad)+" "+Str(rline(i).ad))
893  If rline(i).ad>=proc(procnb).db AndAlso rline(i).ad<=proc(procnb).fn Then
894  'dbg_prt2("Cancel breakpoint adr="+Hex(rline(i).ad)+" "+Str(rline(i).ad))
895  ''''' WARNING to be rewritten WriteProcessMemory(dbghand,Cast(LPVOID,rline(i).ad),@rLine(i).sv,1,0)
896  'nota rline(linenb).nu=-1
897  EndIf
898  Next
899  Else
900  'for GCC 16/08/2013''''''''''
901  If gengcc Then
902  If proc(procnb).rv=7 Then 'sub return void
903  rline(linenb).nu-=1 'decrement the number of the last line of the proc
904  proc(procnb).fn=rline(linenb).ad 'replace address because = next proc address
905  ''' dbg_prt2("SPECIAL GCC1 "+proc(procnb).nm+" "+Str(rline(linenb).nu)+" "+Str(rline(linenb).ad))
906  Else 'function
907  linenb-=1 'remove the last line (added by gcc but unexist)
908  If proc(procnb).nm<>"main" Then 'main = NO CHANGE
909  ''''' WARNING to be rewritten writeProcessMemory(dbghand,Cast(LPVOID,rline(linenb).ad),@rLine(linenb).sv,1,0) 'restore to avoid stop
910  rline(linenb).ad=rline(linenb+1).ad 'replace the address by these of the next one
911  rline(linenb).sv=rline(linenb+1).sv
912  proc(procnb).fn=rline(linenb).ad 'replace address because = next proc address
913  ''' dbg_prt2("SPECIAL GCC2 "+proc(procnb).nm+" "+Str(rline(linenb).ad))
914  Else
915  ''' dbg_prt2("SPECIAL GCC3")
916  EndIf
917  EndIf
918  EndIf
919  EndIf
920 
921 
922 
923 
924  exit Select 'end of proc
925  EndIf
926  'begin of proc
927  procadr=ValInt("&h"+Mid(stln,29,8))
928 
929  Print "Proc=";Mid(stln,45);" ";procadr
930 
931  procnodll=FALSE 'to jump some procs
932  procnmt=cutup_proc(Left(Mid(stln,45),InStr(Mid(stln,45),":"))) 'name of proc
933 
934  If procnmt="{MODLEVEL}" Then Exit Select
935  procnodll=TRUE
936  procnb+=1:proc(procnb).sr=sourceix
937  'GCC to remove @ in proc name ex test@0: --> test:
938  If InStr(procnmt,"@") Then '08/08/2013
939  proc(procnb).nm=Left(procnmt,InStr(procnmt,"@")-1)
940  Else
941  proc(procnb).nm=procnmt
942  End If
943  cutup_retval(procnb,Mid(stln,InStr(stln,":")+2,99))'skip :F --> public / :f --> private then return value .rv + pointer .pt
944  proc(procnb).db=procadr '11/01/2015
945  proc(procnb).st=1 'state no checked
946  proc(procnb).nu=Valint(Mid(stln,22,6)):lastline=0
947  proc(procnb+1).vr=proc(procnb).vr 'in case there is not param nor local var
948  Case "PSYM "
949  varadr=ValInt("&h"+Mid(stln,29,8))
950  Print "Param=";Mid(stln,45);" ";varadr
951  cutup_1(Mid(stln,45),varadr)
952  Case "STSYM","LCSYM"
953  varadr=ValInt("&h"+Mid(stln,29,8))
954  Print "Shared/Common/Static=";Mid(stln,45);" ";varadr
955  cutup_1(Mid(stln,45),varadr)
956  Case "LBRAC","RBRAC" 'not used but could be for scope
957  Case "MAIN "
958  procadr=ValInt("&h"+Mid(stln,29,8))
959  Print "Entry point (main)=";procadr
960  'Line Input #stff, stln 'skip stabd 68,0,1
961  procnodll=false
962  Case Else
963  Print "stabs unknow=";left(stln,45):':end
964  End Select
965  Loop
966  Close #stff
967  Return 1
968 End Function
969 Function display_pt(pt As Long)As String
970  If pt>220 Then Return String(.pt-220,"*")
971  If pt>200 Then Return String(.pt-200,"*")
972  Return String(.pt,"*")
973 End Function
974 Sub extract_begin(nfile As String)
975  vrbloc=VGBLMAX
976  proc(1).vr=VGBLMAX+1 'for the first stored proc
977  exepath2=ExePath
978  'If Dir(exepath2+"\*")="" Then
979  ' exepath2="D:\laurent divers\fb dev\En-cours\FBDEBUG NEW\tests fbdebugger"
980  'EndIf
981 
982  stabs_extract(nfile,123456)
983 
984 
985 
986  Print "STORED DATA"
987 Print "global=";vrbgbl
988 For i As Long =1 To vrbgbl
989  With vrb(i)
990  Print .nm;" ";.typ;" ";.adr;" ";display_pt(.pt)
991  End With
992 Next
993 Print:Print "local=";vrbloc
994 For i As Long =VGBLMAX+1 To vrbloc
995  With vrb(i)
996  Print .nm;" ";.typ;" ";.adr;" ";display_pt(.pt)
997  End With
998 Next
999 Print:Print "Proc";procnb
1000 For i As Long =1 To procnb
1001  With proc(i)
1002  Print i;" ";.nm;" ret=";udt(.rv).nm;" ";String(.pt,"*");" ";.vr;" ";proc(i+1).vr-1;" ";source(.sr).shortname;" nu=";.nu;':sleep
1003  If .nu=-1 Then Print " added by compiler" Else Print
1004  For j As Long =proc(i).vr To proc(i+1).vr-1
1005  With vrb(j)
1006  If .mem=4 OrElse .mem=5 Then Print "Param="; Else Print "Local=";
1007  Print j;" ";.nm;" ";.typ;" ";.adr;" ";display_pt(.pt)
1008  End With
1009  Next
1010  End With
1011 
1012  Print
1013  For j As Long=1 To linenb
1014  With rline(j)
1015  If .pr=i Then
1016  Print "nu=";.nu;" ad=";.ad
1017 ' If proc(.pr).nu=-1 Then Print " never reached added by compiler" Else Print
1018  EndIf
1019  End With
1020  Next
1021  Print "------------------------"':sleep
1022 Next
1023  ''''''''16/06/2014
1024  ''''''''proc(procnb).nm=procnmt 'proc(procnb).ad=proc2 keep it if needed
1025  ''''''''GCC to remove @ in proc name ex test@0: --> test:
1026  '''''''If InStr(procnmt,"@") Then '08/08/2013
1027  ''''''' proc(procnb).nm=Left(procnmt,InStr(procnmt,"@")-1)
1028  '''''''Else
1029  ''''''' proc(procnb).nm=procnmt
1030  '''''''End If
1031 
1032 End Sub
1033 Sub proc_load
1034  Dim As String prcname
1035  DIM AS GtkTreeIter tempiter
1036  If procnb=0 Then Exit Sub
1037 
1038  For i As Long =1 To procnb
1039  With proc(i)
1040  Print i;" ";.nm;" ret=";udt(.rv).nm;" ";String(.pt,"*");" ";.vr;" ";proc(i+1).vr-1;" ";source(.sr).shortname;" nu=";.nu;':sleep
1041  prcname=.nm+" ret="+udt(.rv).nm+" "+String(.pt,"*")+" "+source(.sr).shortname+" nu="+Str(.nu)
1042  gtk_tree_store_append( GTK_TREE_STORE(GUI.tstoreProcs), @tempiter, NULL)
1043  gtk_tree_store_set( GTK_TREE_STORE(GUI.tstoreProcs), @tempiter, 0, StrPtr(prcname), -1)
1044  proc(i).tv=@tempiter
1045  If .nu=-1 Then Print " added by compiler" Else Print
1046  For j As Long =proc(i).vr To proc(i+1).vr-1
1047  With vrb(j)
1048  If .mem=4 OrElse .mem=5 Then Print "Param="; Else Print "Local=";
1049  Print j;" ";.nm;" ";.typ;" ";.adr;" ";display_pt(.pt)
1050  End With
1051  Next
1052  End With
1053  Next
1054 End Sub
1055 
1056 
1057 
1058 
1059