mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-11 12:58:11 +02:00
* Do not use sym.realname but sym.name in the mangledname for the Dwarf-3 debuginfo. This makes it possible to mix Dwarf-2 and Dwarf-3 debug info into one executable.
git-svn-id: trunk@28576 -
This commit is contained in:
parent
98332db7fe
commit
030885727e
@ -375,7 +375,7 @@ interface
|
||||
procedure appendsym_property(list:TAsmList;sym:tpropertysym);override;
|
||||
|
||||
function symdebugname(sym:tsym): String; virtual;
|
||||
function symname(sym:tsym): String; virtual;
|
||||
function symname(sym: tsym; manglename: boolean): String; virtual;
|
||||
procedure append_visibility(vis: tvisibility);
|
||||
|
||||
procedure enum_membersyms_callback(p:TObject;arg:pointer);
|
||||
@ -931,10 +931,10 @@ implementation
|
||||
begin
|
||||
if not assigned(def.typesym) then
|
||||
internalerror(200610011);
|
||||
def.dwarf_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBG',def.owner,symname(def.typesym)),AT_DATA);
|
||||
def.dwarf_ref_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBGREF',def.owner,symname(def.typesym)),AT_DATA);
|
||||
def.dwarf_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBG',def.owner,symname(def.typesym, true)),AT_DATA);
|
||||
def.dwarf_ref_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBGREF',def.owner,symname(def.typesym, true)),AT_DATA);
|
||||
if is_class_or_interface_or_dispinterface(def) or is_objectpascal_helper(def) then
|
||||
tobjectdef(def).dwarf_struct_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBG2',def.owner,symname(def.typesym)),AT_DATA);
|
||||
tobjectdef(def).dwarf_struct_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBG2',def.owner,symname(def.typesym, true)),AT_DATA);
|
||||
def.dbg_state:=dbg_state_written;
|
||||
end
|
||||
else
|
||||
@ -945,10 +945,10 @@ implementation
|
||||
(def.owner.symtabletype=globalsymtable) and
|
||||
(def.owner.iscurrentunit) then
|
||||
begin
|
||||
def.dwarf_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBG',def.owner,symname(def.typesym)),AB_GLOBAL,AT_DATA);
|
||||
def.dwarf_ref_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBGREF',def.owner,symname(def.typesym)),AB_GLOBAL,AT_DATA);
|
||||
def.dwarf_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBG',def.owner,symname(def.typesym, true)),AB_GLOBAL,AT_DATA);
|
||||
def.dwarf_ref_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBGREF',def.owner,symname(def.typesym, true)),AB_GLOBAL,AT_DATA);
|
||||
if is_class_or_interface_or_dispinterface(def) or is_objectpascal_helper(def) then
|
||||
tobjectdef(def).dwarf_struct_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBG2',def.owner,symname(def.typesym)),AB_GLOBAL,AT_DATA);
|
||||
tobjectdef(def).dwarf_struct_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBG2',def.owner,symname(def.typesym, true)),AB_GLOBAL,AT_DATA);
|
||||
include(def.defstates,ds_dwarf_dbg_info_written);
|
||||
end
|
||||
else
|
||||
@ -1371,7 +1371,7 @@ implementation
|
||||
{ base type such as byte/shortint/word/... }
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_base_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_encoding,DW_FORM_data1,sign,
|
||||
DW_AT_byte_size,DW_FORM_data1,fullbytesize])
|
||||
else
|
||||
@ -1385,7 +1385,7 @@ implementation
|
||||
{ to be always clipped to s32bit for some reason }
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_subrange_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_lower_bound,signform,int64(def.low),
|
||||
DW_AT_upper_bound,signform,int64(def.high)
|
||||
])
|
||||
@ -1544,7 +1544,7 @@ implementation
|
||||
if assigned(def.typesym) then
|
||||
begin
|
||||
append_entry(DW_TAG_base_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_encoding,DW_FORM_data1,DW_ATE_float,
|
||||
DW_AT_byte_size,DW_FORM_data1,def.size
|
||||
]);
|
||||
@ -1569,7 +1569,7 @@ implementation
|
||||
{ we should use DW_ATE_signed_fixed, however it isn't supported yet by GDB (FK) }
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_base_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_encoding,DW_FORM_data1,DW_ATE_signed,
|
||||
DW_AT_byte_size,DW_FORM_data1,8
|
||||
])
|
||||
@ -1581,7 +1581,7 @@ implementation
|
||||
s64comp:
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_base_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_encoding,DW_FORM_data1,DW_ATE_signed,
|
||||
DW_AT_byte_size,DW_FORM_data1,8
|
||||
])
|
||||
@ -1604,7 +1604,7 @@ implementation
|
||||
begin
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_enumeration_type,true,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_byte_size,DW_FORM_data1,def.size
|
||||
])
|
||||
else
|
||||
@ -1625,7 +1625,7 @@ implementation
|
||||
if hp.value>def.maxval then
|
||||
break;
|
||||
append_entry(DW_TAG_enumerator,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(hp)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(hp, false)+#0,
|
||||
DW_AT_const_value,DW_FORM_data4,hp.value
|
||||
]);
|
||||
finish_entry;
|
||||
@ -1668,7 +1668,7 @@ implementation
|
||||
{ no known size, no known upper bound }
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_array_type,true,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0
|
||||
])
|
||||
else
|
||||
append_entry(DW_TAG_array_type,true,[]);
|
||||
@ -1685,7 +1685,7 @@ implementation
|
||||
size:=def.size;
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_array_type,true,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_byte_size,DW_FORM_udata,size
|
||||
])
|
||||
else
|
||||
@ -1867,7 +1867,7 @@ implementation
|
||||
begin
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_subroutine_type,true,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_prototyped,DW_FORM_flag,true
|
||||
])
|
||||
else
|
||||
@ -1882,7 +1882,7 @@ implementation
|
||||
for i:=0 to def.paras.count-1 do
|
||||
begin
|
||||
append_entry(DW_TAG_formal_parameter,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(tsym(def.paras[i]))+#0
|
||||
DW_AT_name,DW_FORM_string,symname(tsym(def.paras[i]), false)+#0
|
||||
]);
|
||||
append_labelentry_ref(DW_AT_type,def_dwarf_lab(tparavarsym(def.paras[i]).vardef));
|
||||
finish_entry;
|
||||
@ -2017,7 +2017,7 @@ implementation
|
||||
begin
|
||||
current_asmdata.getaddrlabel(TAsmLabel(pointer(labsym)));
|
||||
append_entry(DW_TAG_typedef,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0
|
||||
]);
|
||||
append_labelentry_ref(DW_AT_type,labsym);
|
||||
finish_entry;
|
||||
@ -2114,7 +2114,7 @@ implementation
|
||||
current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Procdef '+def.fullprocname(true))));
|
||||
if not is_objc_class_or_protocol(def.struct) then
|
||||
append_entry(DW_TAG_subprogram,true,
|
||||
[DW_AT_name,DW_FORM_string,symname(def.procsym)+#0
|
||||
[DW_AT_name,DW_FORM_string,symname(def.procsym, false)+#0
|
||||
{ data continues below }
|
||||
{ problem: base reg isn't known here
|
||||
DW_AT_frame_base,DW_FORM_block1,1
|
||||
@ -2318,7 +2318,7 @@ implementation
|
||||
|
||||
procedure TDebugInfoDwarf.appendsym_var(list:TAsmList;sym:tabstractnormalvarsym);
|
||||
begin
|
||||
appendsym_var_with_name_type_offset(list,sym,symname(sym),sym.vardef,0,[]);
|
||||
appendsym_var_with_name_type_offset(list,sym,symname(sym, false),sym.vardef,0,[]);
|
||||
end;
|
||||
|
||||
|
||||
@ -2554,7 +2554,7 @@ implementation
|
||||
|
||||
procedure TDebugInfoDwarf.appendsym_fieldvar(list:TAsmList;sym: tfieldvarsym);
|
||||
begin
|
||||
appendsym_fieldvar_with_name_offset(list,sym,symname(sym),sym.vardef,0);
|
||||
appendsym_fieldvar_with_name_offset(list,sym,symname(sym, false),sym.vardef,0);
|
||||
end;
|
||||
|
||||
|
||||
@ -2601,7 +2601,7 @@ implementation
|
||||
if (target_info.endian=endian_little) then
|
||||
bitoffset:=(fieldnatsize*8)-bitoffset-sym.vardef.packedbitsize;
|
||||
append_entry(DW_TAG_member,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(sym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(sym, false)+#0,
|
||||
{ gcc also generates both a bit and byte size attribute }
|
||||
{ we don't support ordinals >= 256 bits }
|
||||
DW_AT_byte_size,DW_FORM_data1,fieldnatsize,
|
||||
@ -2642,7 +2642,7 @@ implementation
|
||||
|
||||
if ismember then
|
||||
append_entry(DW_TAG_member,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(sym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(sym, false)+#0,
|
||||
{ The DW_AT_declaration tag is invalid according to the DWARF specifications.
|
||||
But gcc adds this to static const members and gdb checks
|
||||
for this flag. So we have to set it also.
|
||||
@ -2652,7 +2652,7 @@ implementation
|
||||
])
|
||||
else
|
||||
append_entry(DW_TAG_variable,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(sym)+#0
|
||||
DW_AT_name,DW_FORM_string,symname(sym, false)+#0
|
||||
]);
|
||||
{ for string constants, constdef isn't set because they have no real type }
|
||||
case sym.consttyp of
|
||||
@ -2821,10 +2821,10 @@ implementation
|
||||
begin
|
||||
if (tosym.typ=fieldvarsym) then
|
||||
internalerror(2009031404);
|
||||
appendsym_var_with_name_type_offset(list,tabstractnormalvarsym(tosym),symname(sym),sym.propdef,offset,[])
|
||||
appendsym_var_with_name_type_offset(list,tabstractnormalvarsym(tosym),symname(sym, false),sym.propdef,offset,[])
|
||||
end
|
||||
else
|
||||
appendsym_fieldvar_with_name_offset(list,tfieldvarsym(tosym),symname(sym),sym.propdef,offset)
|
||||
appendsym_fieldvar_with_name_offset(list,tfieldvarsym(tosym),symname(sym, false),sym.propdef,offset)
|
||||
end;
|
||||
|
||||
|
||||
@ -2883,7 +2883,7 @@ implementation
|
||||
flags:=[];
|
||||
if (sym.owner.symtabletype=localsymtable) then
|
||||
include(flags,dvf_force_local_var);
|
||||
appendsym_var_with_name_type_offset(list,tabstractnormalvarsym(tosym),symname(sym),tabstractvarsym(sym).vardef,offset,flags);
|
||||
appendsym_var_with_name_type_offset(list,tabstractnormalvarsym(tosym),symname(sym, false),tabstractvarsym(sym).vardef,offset,flags);
|
||||
end;
|
||||
templist.free;
|
||||
exit;
|
||||
@ -2893,7 +2893,7 @@ implementation
|
||||
end;
|
||||
|
||||
append_entry(DW_TAG_variable,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(sym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(sym, false)+#0,
|
||||
{
|
||||
DW_AT_decl_file,DW_FORM_data1,0,
|
||||
DW_AT_decl_line,DW_FORM_data1,
|
||||
@ -2914,7 +2914,7 @@ implementation
|
||||
|
||||
procedure TDebugInfoDwarf.beforeappendsym(list:TAsmList;sym:tsym);
|
||||
begin
|
||||
current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Symbol '+symname(sym))));
|
||||
current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Symbol '+symname(sym, true))));
|
||||
end;
|
||||
|
||||
|
||||
@ -3270,7 +3270,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
function TDebugInfoDwarf.symname(sym: tsym): String;
|
||||
function TDebugInfoDwarf.symname(sym: tsym; manglename: boolean): String;
|
||||
begin
|
||||
if (sym.typ=paravarsym) and
|
||||
(vo_is_self in tparavarsym(sym).varoptions) then
|
||||
@ -3290,9 +3290,20 @@ implementation
|
||||
else if (ds_dwarf_method_class_prefix in current_settings.debugswitches) and
|
||||
(sym.typ=procsym) and
|
||||
(tprocsym(sym).owner.symtabletype in [objectsymtable,recordsymtable]) then
|
||||
result:=tprocsym(sym).owner.name^+'__'+symdebugname(sym)
|
||||
begin
|
||||
result:=tprocsym(sym).owner.name^+'__';
|
||||
if manglename then
|
||||
result := result + sym.name
|
||||
else
|
||||
result := result + symdebugname(sym);
|
||||
end
|
||||
else
|
||||
result:=symdebugname(sym);
|
||||
begin
|
||||
if manglename then
|
||||
result := sym.name
|
||||
else
|
||||
result := symdebugname(sym);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -3517,7 +3528,7 @@ implementation
|
||||
file recs. are less than 1k so using data2 is enough }
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_structure_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_byte_size,DW_FORM_udata,def.size
|
||||
])
|
||||
else
|
||||
@ -3660,7 +3671,7 @@ implementation
|
||||
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_set_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_byte_size,DW_FORM_data2,def.size
|
||||
])
|
||||
else
|
||||
@ -3696,7 +3707,7 @@ implementation
|
||||
{ info of modules that contain set tags }
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_base_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
|
||||
DW_AT_byte_size,DW_FORM_data2,def.size
|
||||
])
|
||||
@ -3764,7 +3775,7 @@ implementation
|
||||
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_array_type,true,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_data_location,DW_FORM_block1,2
|
||||
])
|
||||
else
|
||||
@ -3935,7 +3946,7 @@ implementation
|
||||
begin
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_file_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0,
|
||||
DW_AT_byte_size,DW_FORM_data2,def.size
|
||||
])
|
||||
else
|
||||
@ -4073,7 +4084,7 @@ implementation
|
||||
{ ??? can a undefined def have a typename ? }
|
||||
if assigned(def.typesym) then
|
||||
append_entry(DW_TAG_unspecified_type,false,[
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym)+#0
|
||||
DW_AT_name,DW_FORM_string,symname(def.typesym, false)+#0
|
||||
])
|
||||
else
|
||||
append_entry(DW_TAG_unspecified_type,false,[
|
||||
|
Loading…
Reference in New Issue
Block a user