mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 20:09:27 +02:00
* patch by Jeppe Johansen to be able to generate debug info if an rtl without variant support is used, resolves #18483
git-svn-id: trunk@17300 -
This commit is contained in:
parent
ae8a0c44bb
commit
4d19f6c532
@ -1000,6 +1000,8 @@ implementation
|
|||||||
loclist := tdynamicarray.Create(4096);
|
loclist := tdynamicarray.Create(4096);
|
||||||
|
|
||||||
AbbrevSearchTree:=AllocateNewAiSearchItem;
|
AbbrevSearchTree:=AllocateNewAiSearchItem;
|
||||||
|
|
||||||
|
vardatadef := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -2992,6 +2994,7 @@ implementation
|
|||||||
i : longint;
|
i : longint;
|
||||||
def: tdef;
|
def: tdef;
|
||||||
dbgname: string;
|
dbgname: string;
|
||||||
|
vardatatype: ttypesym;
|
||||||
begin
|
begin
|
||||||
current_module.flags:=current_module.flags or uf_has_dwarf_debuginfo;
|
current_module.flags:=current_module.flags or uf_has_dwarf_debuginfo;
|
||||||
storefilepos:=current_filepos;
|
storefilepos:=current_filepos;
|
||||||
@ -3006,7 +3009,9 @@ implementation
|
|||||||
FILEREC
|
FILEREC
|
||||||
TEXTREC
|
TEXTREC
|
||||||
}
|
}
|
||||||
vardatadef:=trecorddef(search_system_type('TVARDATA').typedef);
|
vardatatype:=try_search_system_type('TVARDATA');
|
||||||
|
if assigned(vardatatype) then
|
||||||
|
vardatadef:=trecorddef(vardatatype.typedef);
|
||||||
|
|
||||||
{ write start labels }
|
{ write start labels }
|
||||||
new_section(current_asmdata.asmlists[al_dwarf_info],sec_debug_info,'',0);
|
new_section(current_asmdata.asmlists[al_dwarf_info],sec_debug_info,'',0);
|
||||||
@ -3604,7 +3609,8 @@ implementation
|
|||||||
procedure TDebugInfoDwarf2.appenddef_variant(list:TAsmList;def: tvariantdef);
|
procedure TDebugInfoDwarf2.appenddef_variant(list:TAsmList;def: tvariantdef);
|
||||||
begin
|
begin
|
||||||
{ variants aren't known to dwarf2 but writting tvardata should be enough }
|
{ variants aren't known to dwarf2 but writting tvardata should be enough }
|
||||||
appenddef_record_named(list,trecorddef(vardatadef),'Variant');
|
if assigned(vardatadef) then
|
||||||
|
appenddef_record_named(list,trecorddef(vardatadef),'Variant');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TDebugInfoDwarf2.dwarf_version: Word;
|
function TDebugInfoDwarf2.dwarf_version: Word;
|
||||||
|
@ -104,6 +104,8 @@ interface
|
|||||||
procedure insertmoduleinfo;override;
|
procedure insertmoduleinfo;override;
|
||||||
procedure insertlineinfo(list:TAsmList);override;
|
procedure insertlineinfo(list:TAsmList);override;
|
||||||
procedure referencesections(list:TAsmList);override;
|
procedure referencesections(list:TAsmList);override;
|
||||||
|
|
||||||
|
constructor Create;override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -800,6 +802,9 @@ implementation
|
|||||||
var
|
var
|
||||||
ss : ansistring;
|
ss : ansistring;
|
||||||
begin
|
begin
|
||||||
|
if not assigned(vardatadef) then
|
||||||
|
exit;
|
||||||
|
|
||||||
ss:='s'+tostr(vardatadef.size);
|
ss:='s'+tostr(vardatadef.size);
|
||||||
vardatadef.symtable.SymList.ForEachCall(@field_add_stabstr,@ss);
|
vardatadef.symtable.SymList.ForEachCall(@field_add_stabstr,@ss);
|
||||||
ss[length(ss)]:=';';
|
ss[length(ss)]:=';';
|
||||||
@ -1502,6 +1507,7 @@ implementation
|
|||||||
stabstypelist : TAsmList;
|
stabstypelist : TAsmList;
|
||||||
storefilepos : tfileposinfo;
|
storefilepos : tfileposinfo;
|
||||||
i : longint;
|
i : longint;
|
||||||
|
vardatatype : ttypesym;
|
||||||
begin
|
begin
|
||||||
storefilepos:=current_filepos;
|
storefilepos:=current_filepos;
|
||||||
current_filepos:=current_module.mainfilepos;
|
current_filepos:=current_module.mainfilepos;
|
||||||
@ -1512,7 +1518,9 @@ implementation
|
|||||||
stabsvarlist:=TAsmList.create;
|
stabsvarlist:=TAsmList.create;
|
||||||
stabstypelist:=TAsmList.create;
|
stabstypelist:=TAsmList.create;
|
||||||
|
|
||||||
vardatadef:=trecorddef(search_system_type('TVARDATA').typedef);
|
vardatatype:=try_search_system_type('TVARDATA');
|
||||||
|
if assigned(vardatatype) then
|
||||||
|
vardatadef:=trecorddef(vardatatype.typedef);
|
||||||
|
|
||||||
{ include symbol that will be referenced from the main to be sure to
|
{ include symbol that will be referenced from the main to be sure to
|
||||||
include this debuginfo .o file }
|
include this debuginfo .o file }
|
||||||
@ -1709,6 +1717,11 @@ implementation
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
constructor TDebugInfoStabs.Create;
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
vardatadef:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
const
|
const
|
||||||
dbg_stabs_info : tdbginfo =
|
dbg_stabs_info : tdbginfo =
|
||||||
|
@ -225,6 +225,7 @@ interface
|
|||||||
function searchsym_in_class_by_msgint(classh:tobjectdef;msgid:longint;out srdef : tdef;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
function searchsym_in_class_by_msgint(classh:tobjectdef;msgid:longint;out srdef : tdef;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
||||||
function searchsym_in_class_by_msgstr(classh:tobjectdef;const s:string;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
function searchsym_in_class_by_msgstr(classh:tobjectdef;const s:string;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
||||||
function search_system_type(const s: TIDString): ttypesym;
|
function search_system_type(const s: TIDString): ttypesym;
|
||||||
|
function try_search_system_type(const s: TIDString): ttypesym;
|
||||||
function search_named_unit_globaltype(const unitname, typename: TIDString; throwerror: boolean): ttypesym;
|
function search_named_unit_globaltype(const unitname, typename: TIDString; throwerror: boolean): ttypesym;
|
||||||
function search_struct_member(pd : tabstractrecorddef;const s : string):tsym;
|
function search_struct_member(pd : tabstractrecorddef;const s : string):tsym;
|
||||||
function search_assignment_operator(from_def,to_def:Tdef;explicit:boolean):Tprocdef;
|
function search_assignment_operator(from_def,to_def:Tdef;explicit:boolean):Tprocdef;
|
||||||
@ -2400,6 +2401,22 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function try_search_system_type(const s: TIDString): ttypesym;
|
||||||
|
var
|
||||||
|
sym : tsym;
|
||||||
|
begin
|
||||||
|
sym:=tsym(systemunit.Find(s));
|
||||||
|
if not assigned(sym) then
|
||||||
|
result:=nil
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if sym.typ<>typesym then
|
||||||
|
cgmessage1(cg_f_unknown_system_type,s);
|
||||||
|
result:=ttypesym(sym);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
function search_named_unit_globaltype(const unitname, typename: TIDString; throwerror: boolean): ttypesym;
|
function search_named_unit_globaltype(const unitname, typename: TIDString; throwerror: boolean): ttypesym;
|
||||||
var
|
var
|
||||||
srsymtable: tsymtable;
|
srsymtable: tsymtable;
|
||||||
|
Loading…
Reference in New Issue
Block a user