|
@@ -194,6 +194,11 @@ interface
|
|
|
|
|
|
writing_def_dwarf : boolean;
|
|
writing_def_dwarf : boolean;
|
|
|
|
|
|
|
|
+ { use this defs to create info for variants and file handles }
|
|
|
|
+ vardatadef,
|
|
|
|
+ filerecdef,
|
|
|
|
+ textrecdef : tdef;
|
|
|
|
+
|
|
function append_entry(tag : tdwarf_tag;has_children : boolean;data : array of const) : longint;
|
|
function append_entry(tag : tdwarf_tag;has_children : boolean;data : array of const) : longint;
|
|
procedure append_labelentry(attr : tdwarf_attribute;sym : tasmsymbol);
|
|
procedure append_labelentry(attr : tdwarf_attribute;sym : tasmsymbol);
|
|
procedure append_labelentry_ref(attr : tdwarf_attribute;sym : tasmsymbol);
|
|
procedure append_labelentry_ref(attr : tdwarf_attribute;sym : tasmsymbol);
|
|
@@ -231,7 +236,7 @@ implementation
|
|
finput,
|
|
finput,
|
|
fmodule,
|
|
fmodule,
|
|
defutil,
|
|
defutil,
|
|
- symconst,symsym
|
|
|
|
|
|
+ symconst,symtable,symsym
|
|
;
|
|
;
|
|
|
|
|
|
const
|
|
const
|
|
@@ -645,8 +650,14 @@ implementation
|
|
end;
|
|
end;
|
|
uvoid :
|
|
uvoid :
|
|
begin
|
|
begin
|
|
- append_entry(DW_TAG_unspecified_type,false,[
|
|
|
|
- DW_AT_name,DW_FORM_string,'Void'#0]);
|
|
|
|
|
|
+ { gdb 6.4 doesn't support DW_TAG_unspecified_type so we
|
|
|
|
+ replace it with a unsigned type with size 0 (FK)
|
|
|
|
+ }
|
|
|
|
+ append_entry(DW_TAG_base_type,false,[
|
|
|
|
+ DW_AT_name,DW_FORM_string,'Void'#0,
|
|
|
|
+ DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
|
|
|
|
+ DW_AT_byte_size,DW_FORM_data1,0
|
|
|
|
+ ]);
|
|
finish_entry;
|
|
finish_entry;
|
|
end;
|
|
end;
|
|
uchar :
|
|
uchar :
|
|
@@ -882,21 +893,47 @@ implementation
|
|
pointerdef :
|
|
pointerdef :
|
|
begin
|
|
begin
|
|
append_entry(DW_TAG_pointer_type,false,[]);
|
|
append_entry(DW_TAG_pointer_type,false,[]);
|
|
- append_labelentry_ref(DW_AT_type,def_dwarf_lab(tpointerdef(def).pointertype.def));
|
|
|
|
|
|
+ if not(is_voidpointer(def)) then
|
|
|
|
+ append_labelentry_ref(DW_AT_type,def_dwarf_lab(tpointerdef(def).pointertype.def));
|
|
finish_entry;
|
|
finish_entry;
|
|
end;
|
|
end;
|
|
|
|
|
|
floatdef :
|
|
floatdef :
|
|
append_dwarftag_floatdef(tfloatdef(def));
|
|
append_dwarftag_floatdef(tfloatdef(def));
|
|
- {
|
|
|
|
filedef :
|
|
filedef :
|
|
- result:=filedef_stabstr(tfiledef(def));
|
|
|
|
- }
|
|
|
|
|
|
+ begin
|
|
|
|
+ { gdb 6.4 doesn't support files so far so we use some fake recorddef
|
|
|
|
+ { file recs. are less than 1k so using data2 is enough }
|
|
|
|
+ if assigned(def.typesym) then
|
|
|
|
+ append_entry(DW_TAG_file_type,false,[
|
|
|
|
+ DW_AT_name,DW_FORM_string,def.typesym.name+#0,
|
|
|
|
+ DW_AT_byte_size,DW_FORM_data2,def.size
|
|
|
|
+ ])
|
|
|
|
+ else
|
|
|
|
+ append_entry(DW_TAG_file_type,false,[
|
|
|
|
+ DW_AT_byte_size,DW_FORM_data2,def.size
|
|
|
|
+ ]);
|
|
|
|
+ if tfiledef(def).filetyp=ft_typed then
|
|
|
|
+ append_labelentry_ref(DW_AT_type,def_dwarf_lab(tfiledef(def).typedfiletype.def));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if assigned(def.typesym) then
|
|
|
|
+ append_entry(DW_TAG_structure_type,true,[
|
|
|
|
+ DW_AT_name,DW_FORM_string,def.typesym.name+#0,
|
|
|
|
+ DW_AT_byte_size,DW_FORM_udata,def.size
|
|
|
|
+ ])
|
|
|
|
+ else
|
|
|
|
+ append_entry(DW_TAG_structure_type,true,[
|
|
|
|
+ DW_AT_byte_size,DW_FORM_udata,def.size
|
|
|
|
+ ]);
|
|
|
|
+ finish_entry;
|
|
|
|
+ end;
|
|
recorddef :
|
|
recorddef :
|
|
append_dwarftag_recorddef(trecorddef(def));
|
|
append_dwarftag_recorddef(trecorddef(def));
|
|
- {
|
|
|
|
variantdef :
|
|
variantdef :
|
|
- result:=def_stabstr_evaluate(def,'formal${numberstring};',[]);
|
|
|
|
|
|
+ { variants aren't known to dwarf but writting tvardata should be enough }
|
|
|
|
+ append_dwarftag_recorddef(trecorddef(vardatadef));
|
|
|
|
+ {
|
|
classrefdef :
|
|
classrefdef :
|
|
result:=strpnew(def_stab_number(pvmttype.def));
|
|
result:=strpnew(def_stab_number(pvmttype.def));
|
|
}
|
|
}
|
|
@@ -1006,6 +1043,8 @@ implementation
|
|
end;
|
|
end;
|
|
recorddef :
|
|
recorddef :
|
|
trecorddef(def).symtable.foreach(@field_write_defs,list);
|
|
trecorddef(def).symtable.foreach(@field_write_defs,list);
|
|
|
|
+ variantdef :
|
|
|
|
+ trecorddef(vardatadef).symtable.foreach(@field_write_defs,list);
|
|
objectdef :
|
|
objectdef :
|
|
begin
|
|
begin
|
|
insertdef(list,vmtarraytype.def);
|
|
insertdef(list,vmtarraytype.def);
|
|
@@ -1462,7 +1501,7 @@ implementation
|
|
append_constsym(tconstsym(sym));
|
|
append_constsym(tconstsym(sym));
|
|
typesym :
|
|
typesym :
|
|
begin
|
|
begin
|
|
- append_entry(DW_TAG_pointer_type,false,[
|
|
|
|
|
|
+ append_entry(DW_TAG_typedef,false,[
|
|
DW_AT_name,DW_FORM_string,sym.name+#0
|
|
DW_AT_name,DW_FORM_string,sym.name+#0
|
|
]);
|
|
]);
|
|
append_labelentry_ref(DW_AT_type,def_dwarf_lab(ttypesym(sym).restype.def));
|
|
append_labelentry_ref(DW_AT_type,def_dwarf_lab(ttypesym(sym).restype.def));
|
|
@@ -1549,6 +1588,17 @@ implementation
|
|
|
|
|
|
|
|
|
|
procedure TDebugInfoDwarf.inserttypeinfo;
|
|
procedure TDebugInfoDwarf.inserttypeinfo;
|
|
|
|
+
|
|
|
|
+ function gettypedef(const s : string) : tdef;
|
|
|
|
+ var
|
|
|
|
+ srsym : tsym;
|
|
|
|
+ begin
|
|
|
|
+ srsym:=searchsymonlyin(systemunit,'TVARDATA');
|
|
|
|
+ if not(assigned(srsym)) then
|
|
|
|
+ internalerror(200602022);
|
|
|
|
+ result:=ttypesym(srsym).restype.def;
|
|
|
|
+ end;
|
|
|
|
+
|
|
var
|
|
var
|
|
storefilepos : tfileposinfo;
|
|
storefilepos : tfileposinfo;
|
|
lenstartlabel : tasmlabel;
|
|
lenstartlabel : tasmlabel;
|
|
@@ -1559,6 +1609,13 @@ implementation
|
|
currabbrevnumber:=0;
|
|
currabbrevnumber:=0;
|
|
writing_def_dwarf:=false;
|
|
writing_def_dwarf:=false;
|
|
|
|
|
|
|
|
+ vardatadef:=gettypedef('TVARDATA');
|
|
|
|
+
|
|
|
|
+ { not exported (FK)
|
|
|
|
+ filerecdef:=gettypedef('FILEREC');
|
|
|
|
+ textrecdef:=gettypedef('TEXTREC');
|
|
|
|
+ }
|
|
|
|
+
|
|
{ write start labels }
|
|
{ write start labels }
|
|
asmlist[al_dwarf_info].concat(tai_section.create(sec_debug_info,'',0));
|
|
asmlist[al_dwarf_info].concat(tai_section.create(sec_debug_info,'',0));
|
|
asmlist[al_dwarf_info].concat(tai_symbol.createname('.Ldebug_info0',AT_DATA,0));
|
|
asmlist[al_dwarf_info].concat(tai_symbol.createname('.Ldebug_info0',AT_DATA,0));
|