Browse Source

+ dwarf: stringdefs

git-svn-id: trunk@2433 -
florian 19 years ago
parent
commit
231d2e01f0
1 changed files with 79 additions and 19 deletions
  1. 79 19
      compiler/dbgdwarf.pas

+ 79 - 19
compiler/dbgdwarf.pas

@@ -953,6 +953,84 @@ implementation
         end;
 
 
+      procedure append_dwarftag_stringdef(def:tstringdef);
+        var
+          slen : aint;
+          arr : tasmlabel;
+        begin
+          case def.string_typ of
+            st_shortstring:
+              begin
+                { fix length of openshortstring }
+                slen:=def.len;
+                if slen=0 then
+                  slen:=255;
+
+
+                { create a structure with two elements }
+                objectlibrary.getdatalabel(arr);
+                append_entry(DW_TAG_structure_type,true,[
+                  DW_AT_name,DW_FORM_string,'ShortString'#0,
+                  DW_AT_byte_size,DW_FORM_data1,2*sizeof(aint)
+                ]);
+                finish_entry;
+
+                { length entry }
+                append_entry(DW_TAG_member,false,[
+                  DW_AT_name,DW_FORM_string,'Length'#0,
+                  DW_AT_data_member_location,DW_FORM_block1,1+lengthuleb128(0)
+                  ]);
+                asmlist[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
+                asmlist[al_dwarf_info].concat(tai_const.create_uleb128bit(0));
+                append_labelentry_ref(DW_AT_type,def_dwarf_lab(u8inttype.def));
+                finish_entry;
+
+                { self entry }
+                append_entry(DW_TAG_member,false,[
+                  DW_AT_name,DW_FORM_string,'Data'#0,
+                  DW_AT_data_member_location,DW_FORM_block1,1+lengthuleb128(1)
+                  ]);
+                asmlist[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
+                asmlist[al_dwarf_info].concat(tai_const.create_uleb128bit(1));
+                append_labelentry_ref(DW_AT_type,arr);
+                finish_entry;
+
+                finish_children;
+
+                { now the data array }
+                asmlist[al_dwarf_info].concat(tai_symbol.create(arr,0));
+                append_entry(DW_TAG_array_type,true,[
+                  DW_AT_byte_size,DW_FORM_udata,def.size,
+                  DW_AT_stride_size,DW_FORM_udata,1*8
+                  ]);
+                append_labelentry_ref(DW_AT_type,def_dwarf_lab(cchartype.def));
+                finish_entry;
+                append_entry(DW_TAG_subrange_type,false,[
+                  DW_AT_lower_bound,DW_FORM_udata,0,
+                  DW_AT_upper_bound,DW_FORM_udata,slen
+                  ]);
+                append_labelentry_ref(DW_AT_type,def_dwarf_lab(u8inttype.def));
+                finish_entry;
+              end;
+            st_longstring:
+              begin
+              {
+                charst:=def_stab_number(cchartype.def);
+                bytest:=def_stab_number(u8inttype.def);
+                longst:=def_stab_number(u32inttype.def);
+                result:=def_stabstr_evaluate(def,'s$1length:$2,0,32;dummy:$6,32,8;st:ar$2;1;$3;$4,40,$5;;',
+                            [tostr(def.len+5),longst,tostr(def.len),charst,tostr(def.len*8),bytest]);
+              }
+             end;
+           st_ansistring:
+             { looks like a pchar }
+             append_dwarftag(list,cchartype.def);
+           st_widestring:
+             { looks like a pwidechar }
+             append_dwarftag(list,cwidechartype.def);
+          end;
+        end;
+
       procedure append_dwarftag_procvardef(def:tprocvardef);
 
         procedure doappend;
@@ -1031,10 +1109,8 @@ implementation
       begin
         list.concat(tai_symbol.create(def_dwarf_lab(def),0));
         case def.deftype of
-        {
           stringdef :
-            result:=stringdef_stabstr(tstringdef(def));
-        }
+            append_dwarftag_stringdef(tstringdef(def));
           enumdef :
             append_dwarftag_enumdef(tenumdef(def));
           orddef :
@@ -1122,10 +1198,6 @@ implementation
             end;
           arraydef :
             append_dwarftag_arraydef(tarraydef(def));
-        {
-          procdef :
-            result:=procdef_stabstr(tprocdef(def));
-        }
           procvardef :
             append_dwarftag_procvardef(tprocvardef(def));
           objectdef :
@@ -1344,18 +1416,6 @@ implementation
 
     procedure TDebugInfoDwarf.insertsym(list:taasmoutput;sym:tsym);
 
-        function fieldvarsym_stabstr(sym:tfieldvarsym):Pchar;
-          begin
-            {
-            result:=nil;
-            if (sym.owner.symtabletype=objectsymtable) and
-               (sp_static in sym.symoptions) then
-              result:=sym_stabstr_evaluate(sym,'"${ownername}__${name}:S$1",${N_LCSYM},0,${line},${mangledname}',
-                  [def_stab_number(sym.vartype.def)]);
-            }
-          end;
-
-
         procedure append_varsym(sym:tabstractnormalvarsym);
           var
             templist : taasmoutput;