mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 12:59:24 +02:00
* Consistent use of struct_lab. Solves missing references to DBG2* symbols
while linking
This commit is contained in:
parent
2812915d4f
commit
ebfb446afd
@ -100,6 +100,9 @@ interface
|
||||
TDwarfHashSetItem = record
|
||||
HashSetItem: THashSetItem;
|
||||
lab, ref_lab: tasmsymbol;
|
||||
{ Label for the structure-part of types that contain a structure.
|
||||
(objects, records and such) For types encoded with an implicit
|
||||
reference, struct_lab differs from lab }
|
||||
struct_lab: tasmsymbol;
|
||||
end;
|
||||
PDwarfHashSetItem = ^TDwarfHashSetItem;
|
||||
@ -180,6 +183,7 @@ interface
|
||||
property use_64bit_headers: Boolean read _use_64bit_headers write set_use_64bit_headers;
|
||||
|
||||
function get_def_dwarf_labs(def:tdef): PDwarfHashSetItem;
|
||||
function need_struct_def_lab(def:tdef): Boolean;
|
||||
|
||||
procedure append_to_al_dwarf_info(Item:TLinkedListItem; size: integer; list: TAsmList = nil);
|
||||
procedure append_realconst_to_al_dwarf_info(Item: tai_realconst; list: TAsmList = nil);
|
||||
@ -265,12 +269,11 @@ interface
|
||||
private
|
||||
protected
|
||||
procedure appenddef_set_intern(list:TAsmList;def:tsetdef; force_tag_set: boolean);
|
||||
procedure append_object_struct(def: tobjectdef; const createlabel: boolean; const objectname: PShortString);
|
||||
procedure append_object_struct(def: tobjectdef; const objectname: PShortString);
|
||||
|
||||
procedure appenddef_file(list:TAsmList;def:tfiledef); override;
|
||||
procedure appenddef_formal(list:TAsmList;def:tformaldef); override;
|
||||
procedure appenddef_object(list:TAsmList;def:tobjectdef); override;
|
||||
procedure appenddef_record(list: TAsmList; def: trecorddef); override;
|
||||
procedure appenddef_set(list:TAsmList;def:tsetdef); override;
|
||||
procedure appenddef_undefined(list:TAsmList;def:tundefineddef); override;
|
||||
procedure appenddef_variant(list:TAsmList;def:tvariantdef); override;
|
||||
@ -707,7 +710,7 @@ implementation
|
||||
result^.HashSetItem.Data:=self;
|
||||
{ A record needs a label also, so it is possible to reference fields /
|
||||
methods in a property. }
|
||||
needstructdeflab:=is_implicit_pointer_object_type(def) or is_record(def);
|
||||
needstructdeflab:=need_struct_def_lab(def);
|
||||
if not(tf_dwarf_only_local_labels in target_info.flags) then
|
||||
begin
|
||||
if (ds_dwarf_dbg_info_written in def.defstates) then
|
||||
@ -717,7 +720,9 @@ implementation
|
||||
result^.lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBG',def.owner,symname(def.typesym, true)),AT_METADATA);
|
||||
result^.ref_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBGREF',def.owner,symname(def.typesym, true)),AT_METADATA);
|
||||
if needstructdeflab then
|
||||
result^.struct_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBG2',def.owner,symname(def.typesym, true)),AT_METADATA);
|
||||
result^.struct_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBG2',def.owner,symname(def.typesym, true)),AT_METADATA)
|
||||
else
|
||||
result^.struct_lab:=result^.lab;
|
||||
def.dbg_state:=dbg_state_written;
|
||||
end
|
||||
else
|
||||
@ -731,7 +736,9 @@ implementation
|
||||
result^.lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBG',def.owner,symname(def.typesym, true)),AB_GLOBAL,AT_METADATA,voidpointertype);
|
||||
result^.ref_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBGREF',def.owner,symname(def.typesym, true)),AB_GLOBAL,AT_METADATA,voidpointertype);
|
||||
if needstructdeflab then
|
||||
result^.struct_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBG2',def.owner,symname(def.typesym, true)),AB_GLOBAL,AT_METADATA,voidpointertype);
|
||||
result^.struct_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBG2',def.owner,symname(def.typesym, true)),AB_GLOBAL,AT_METADATA,voidpointertype)
|
||||
else
|
||||
result^.struct_lab:=result^.lab;
|
||||
include(def.defstates,ds_dwarf_dbg_info_written);
|
||||
end
|
||||
else
|
||||
@ -741,7 +748,9 @@ implementation
|
||||
current_asmdata.getglobaldatalabel(TAsmLabel(pointer(result^.lab)));
|
||||
current_asmdata.getglobaldatalabel(TAsmLabel(pointer(result^.ref_lab)));
|
||||
if needstructdeflab then
|
||||
current_asmdata.getglobaldatalabel(TAsmLabel(pointer(result^.struct_lab)));
|
||||
current_asmdata.getglobaldatalabel(TAsmLabel(pointer(result^.struct_lab)))
|
||||
else
|
||||
result^.struct_lab:=result^.lab;
|
||||
end;
|
||||
end;
|
||||
end
|
||||
@ -753,7 +762,9 @@ implementation
|
||||
current_asmdata.getaddrlabel(TAsmLabel(pointer(result^.lab)));
|
||||
current_asmdata.getaddrlabel(TAsmLabel(pointer(result^.ref_lab)));
|
||||
if needstructdeflab then
|
||||
current_asmdata.getaddrlabel(TAsmLabel(pointer(result^.struct_lab)));
|
||||
current_asmdata.getaddrlabel(TAsmLabel(pointer(result^.struct_lab)))
|
||||
else
|
||||
result^.struct_lab:=result^.lab;
|
||||
end;
|
||||
if def.dbg_state=dbg_state_used then
|
||||
deftowritelist.Add(def);
|
||||
@ -761,6 +772,18 @@ implementation
|
||||
end;
|
||||
end;
|
||||
|
||||
function TDebugInfoDwarf.need_struct_def_lab(def:tdef): Boolean;
|
||||
begin
|
||||
Result := (def.typ=objectdef) and
|
||||
(tobjectdef(def).objecttype in [
|
||||
odt_interfacecom,
|
||||
odt_interfacecorba,
|
||||
odt_dispinterface,
|
||||
odt_helper,
|
||||
odt_class,
|
||||
odt_objcclass]);
|
||||
end;
|
||||
|
||||
function TDebugInfoDwarf.is_fbreg(reg: tregister): boolean;
|
||||
begin
|
||||
{$if defined(i8086)}
|
||||
@ -1907,6 +1930,7 @@ implementation
|
||||
else
|
||||
internalerror(2013082001);
|
||||
end;
|
||||
ResetDwarfOffset;
|
||||
|
||||
{ On Darwin, dwarf info is not linked in the final binary,
|
||||
but kept in the individual object files. This allows for
|
||||
@ -4012,11 +4036,13 @@ implementation
|
||||
finish_entry;
|
||||
end;
|
||||
|
||||
procedure TDebugInfoDwarf2.append_object_struct(def: tobjectdef; const createlabel: boolean; const objectname: PShortString);
|
||||
procedure TDebugInfoDwarf2.append_object_struct(def: tobjectdef; const objectname: PShortString);
|
||||
|
||||
var
|
||||
lab: TAsmSymbol;
|
||||
createlabel: boolean;
|
||||
begin
|
||||
createlabel := need_struct_def_lab(def);
|
||||
if createlabel then
|
||||
begin
|
||||
lab := def_dwarf_class_struct_lab(def);
|
||||
@ -4051,10 +4077,7 @@ implementation
|
||||
append_const_to_al_dwarf_info(tai_const.create_uleb128bit(0));
|
||||
if (def.childof.dbg_state=dbg_state_unused) then
|
||||
def.childof.dbg_state:=dbg_state_used;
|
||||
if is_implicit_pointer_object_type(def) then
|
||||
append_labelentry_ref(DW_AT_type,def_dwarf_class_struct_lab(def.childof))
|
||||
else
|
||||
append_labelentry_ref(DW_AT_type,def_dwarf_lab(def.childof));
|
||||
append_labelentry_ref(DW_AT_type,def_dwarf_class_struct_lab(def.childof));
|
||||
finish_entry;
|
||||
end;
|
||||
if (oo_has_vmt in def.objectoptions) and
|
||||
@ -4096,7 +4119,7 @@ implementation
|
||||
case def.objecttype of
|
||||
odt_cppclass,
|
||||
odt_object:
|
||||
append_object_struct(def,false,def.objname);
|
||||
append_object_struct(def,def.objname);
|
||||
odt_interfacecom,
|
||||
odt_interfacecorba,
|
||||
odt_dispinterface,
|
||||
@ -4108,14 +4131,14 @@ implementation
|
||||
append_labelentry_ref(DW_AT_type,def_dwarf_class_struct_lab(def));
|
||||
finish_entry;
|
||||
|
||||
append_object_struct(def,true,def.objname);
|
||||
append_object_struct(def,def.objname);
|
||||
end;
|
||||
odt_objcclass:
|
||||
{ Objective-C class: same as regular class, except for
|
||||
a) Apple-specific tag that identifies it as an Objective-C class
|
||||
b) use extname^ instead of objname
|
||||
}
|
||||
append_object_struct(def,true,def.objextname);
|
||||
append_object_struct(def,def.objextname);
|
||||
odt_objcprotocol:
|
||||
begin
|
||||
append_entry(DW_TAG_pointer_type,false,[]);
|
||||
@ -4127,20 +4150,6 @@ implementation
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TDebugInfoDwarf2.appenddef_record(list: TAsmList; def: trecorddef);
|
||||
var
|
||||
lab: TAsmSymbol;
|
||||
begin
|
||||
lab := def_dwarf_class_struct_lab(def);
|
||||
if not(tf_dwarf_only_local_labels in target_info.flags) then
|
||||
current_asmdata.asmlists[al_dwarf_info].concat(tai_symbol.create_global(lab,0))
|
||||
else
|
||||
current_asmdata.asmlists[al_dwarf_info].concat(tai_symbol.create(lab,0));
|
||||
|
||||
ResetDwarfOffset;
|
||||
|
||||
inherited appenddef_record(list, def);
|
||||
end;
|
||||
|
||||
procedure TDebugInfoDwarf2.appenddef_set_intern(list:TAsmList;def: tsetdef; force_tag_set: boolean);
|
||||
var
|
||||
@ -4580,7 +4589,7 @@ implementation
|
||||
append_labelentry_ref(DW_AT_type,def_dwarf_class_struct_lab(def));
|
||||
finish_entry;
|
||||
|
||||
append_object_struct(def,true,def.objrealname);
|
||||
append_object_struct(def,def.objrealname);
|
||||
Exit;
|
||||
end;
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user