Răsfoiți Sursa

Merged revisions 6589,6591 via svnmerge from
svn+ssh://[email protected]/FPC/svn/fpc/trunk

........
r6589 | jonas | 2007-02-21 20:07:45 +0100 (Wed, 21 Feb 2007) | 3 lines

* fixed dwarf definition of longstring (avoids endless loop in
gdb when loading ref_def for longstring)

........
r6591 | jonas | 2007-02-21 20:26:09 +0100 (Wed, 21 Feb 2007) | 3 lines

* make sure the size of tinterfaceentry is correct, regardless of
the maxrecordalign setting of the target

........

git-svn-id: branches/fpc_2_3@6592 -

Jonas Maebe 18 ani în urmă
părinte
comite
3a4c28f3c9
2 a modificat fișierele cu 66 adăugiri și 64 ștergeri
  1. 62 62
      compiler/dbgdwarf.pas
  2. 4 2
      rtl/inc/objpash.inc

+ 62 - 62
compiler/dbgdwarf.pas

@@ -1321,76 +1321,76 @@ implementation
 
 
     procedure TDebugInfoDwarf.appenddef_string(def:tstringdef);
-      var
-        slen : aint;
-        arr : tasmlabel;
-      begin
-        case def.stringtype of
-          st_shortstring:
-            begin
-              { fix length of openshortstring }
-              slen:=def.len;
-              if slen=0 then
-                slen:=255;
 
-              { create a structure with two elements }
-              if not(tf_dwarf_only_local_labels in target_info.flags) then
-                current_asmdata.getdatalabel(arr)
-              else
-                current_asmdata.getaddrlabel(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;
+      procedure addnormalstringdef(const name: shortstring; lendef: tdef; maxlen: cardinal);
+        var
+          slen : aint;
+          arr : tasmlabel;
+        begin
+          { fix length of openshortstring }
+          slen:=def.len;
+          if slen=0 then
+            slen:=maxlen;
 
-              { 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)
-                ]);
-              current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
-              current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_uleb128bit(0));
-              append_labelentry_ref(DW_AT_type,def_dwarf_lab(u8inttype));
-              finish_entry;
+          { create a structure with two elements }
+          if not(tf_dwarf_only_local_labels in target_info.flags) then
+            current_asmdata.getdatalabel(arr)
+          else
+            current_asmdata.getaddrlabel(arr);
+          append_entry(DW_TAG_structure_type,true,[
+            DW_AT_name,DW_FORM_string,name+#0,
+            DW_AT_byte_size,DW_FORM_data1,2*sizeof(aint)
+            ]);
+          finish_entry;
 
-              { string data 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)
-                ]);
-              current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
-              current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_uleb128bit(1));
-              append_labelentry_ref(DW_AT_type,arr);
-              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)
+            ]);
+          current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
+          current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_uleb128bit(0));
+          append_labelentry_ref(DW_AT_type,def_dwarf_lab(lendef));
+          finish_entry;
+
+          { string data 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)
+            ]);
+          current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
+          current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_uleb128bit(lendef.size));
+          append_labelentry_ref(DW_AT_type,arr);
+          finish_entry;
 
-              finish_children;
+          finish_children;
 
-              { now the data array }
-              current_asmdata.asmlists[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));
-              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));
-              finish_entry;
-              finish_children;
+          { now the data array }
+          current_asmdata.asmlists[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));
+          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(lendef));
+          finish_entry;
+          finish_children;
+        end;
+
+      begin
+        case def.stringtype of
+          st_shortstring:
+            begin
+              addnormalstringdef('ShortString',u8inttype,255);
             end;
           st_longstring:
             begin
-            {
-              charst:=def_stab_number(cchartype);
-              bytest:=def_stab_number(u8inttype);
-              longst:=def_stab_number(u32inttype);
-              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]);
-            }
+              addnormalstringdef('LongString',u32inttype,$ffffffff);
            end;
          st_ansistring:
            begin

+ 4 - 2
rtl/inc/objpash.inc

@@ -124,7 +124,9 @@
          VTable      : Pointer;
          IOffset     : PtrInt;
          IIDStr      : pshortstring; { never nil. Com: upper(GuidToString(IID^)) }
-         IType       : tinterfaceentrytype;
+         case boolean of
+           true      : (IType       : tinterfaceentrytype);
+           false     : (__pad_dummy : pointer);
        end;
 
        pinterfacetable = ^tinterfacetable;
@@ -344,4 +346,4 @@
        end;
 
   var
-    DispCallByIDProc : pointer;
+    DispCallByIDProc : pointer;