* 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:
joost 2014-09-01 16:55:10 +00:00
parent 98332db7fe
commit 030885727e

View File

@ -375,7 +375,7 @@ interface
procedure appendsym_property(list:TAsmList;sym:tpropertysym);override; procedure appendsym_property(list:TAsmList;sym:tpropertysym);override;
function symdebugname(sym:tsym): String; virtual; 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 append_visibility(vis: tvisibility);
procedure enum_membersyms_callback(p:TObject;arg:pointer); procedure enum_membersyms_callback(p:TObject;arg:pointer);
@ -931,10 +931,10 @@ implementation
begin begin
if not assigned(def.typesym) then if not assigned(def.typesym) then
internalerror(200610011); internalerror(200610011);
def.dwarf_lab:=current_asmdata.RefAsmSymbol(make_mangledname('DBG',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)),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 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; def.dbg_state:=dbg_state_written;
end end
else else
@ -945,10 +945,10 @@ implementation
(def.owner.symtabletype=globalsymtable) and (def.owner.symtabletype=globalsymtable) and
(def.owner.iscurrentunit) then (def.owner.iscurrentunit) then
begin begin
def.dwarf_lab:=current_asmdata.DefineAsmSymbol(make_mangledname('DBG',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)),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 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); include(def.defstates,ds_dwarf_dbg_info_written);
end end
else else
@ -1371,7 +1371,7 @@ implementation
{ base type such as byte/shortint/word/... } { base type such as byte/shortint/word/... }
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_base_type,false,[ 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_encoding,DW_FORM_data1,sign,
DW_AT_byte_size,DW_FORM_data1,fullbytesize]) DW_AT_byte_size,DW_FORM_data1,fullbytesize])
else else
@ -1385,7 +1385,7 @@ implementation
{ to be always clipped to s32bit for some reason } { to be always clipped to s32bit for some reason }
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_subrange_type,false,[ 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_lower_bound,signform,int64(def.low),
DW_AT_upper_bound,signform,int64(def.high) DW_AT_upper_bound,signform,int64(def.high)
]) ])
@ -1544,7 +1544,7 @@ implementation
if assigned(def.typesym) then if assigned(def.typesym) then
begin begin
append_entry(DW_TAG_base_type,false,[ 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_encoding,DW_FORM_data1,DW_ATE_float,
DW_AT_byte_size,DW_FORM_data1,def.size 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) } { we should use DW_ATE_signed_fixed, however it isn't supported yet by GDB (FK) }
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_base_type,false,[ 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_encoding,DW_FORM_data1,DW_ATE_signed,
DW_AT_byte_size,DW_FORM_data1,8 DW_AT_byte_size,DW_FORM_data1,8
]) ])
@ -1581,7 +1581,7 @@ implementation
s64comp: s64comp:
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_base_type,false,[ 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_encoding,DW_FORM_data1,DW_ATE_signed,
DW_AT_byte_size,DW_FORM_data1,8 DW_AT_byte_size,DW_FORM_data1,8
]) ])
@ -1604,7 +1604,7 @@ implementation
begin begin
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_enumeration_type,true,[ 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 DW_AT_byte_size,DW_FORM_data1,def.size
]) ])
else else
@ -1625,7 +1625,7 @@ implementation
if hp.value>def.maxval then if hp.value>def.maxval then
break; break;
append_entry(DW_TAG_enumerator,false,[ 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 DW_AT_const_value,DW_FORM_data4,hp.value
]); ]);
finish_entry; finish_entry;
@ -1668,7 +1668,7 @@ implementation
{ no known size, no known upper bound } { no known size, no known upper bound }
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_array_type,true,[ 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 else
append_entry(DW_TAG_array_type,true,[]); append_entry(DW_TAG_array_type,true,[]);
@ -1685,7 +1685,7 @@ implementation
size:=def.size; size:=def.size;
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_array_type,true,[ 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 DW_AT_byte_size,DW_FORM_udata,size
]) ])
else else
@ -1867,7 +1867,7 @@ implementation
begin begin
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_subroutine_type,true,[ 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 DW_AT_prototyped,DW_FORM_flag,true
]) ])
else else
@ -1882,7 +1882,7 @@ implementation
for i:=0 to def.paras.count-1 do for i:=0 to def.paras.count-1 do
begin begin
append_entry(DW_TAG_formal_parameter,false,[ 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)); append_labelentry_ref(DW_AT_type,def_dwarf_lab(tparavarsym(def.paras[i]).vardef));
finish_entry; finish_entry;
@ -2017,7 +2017,7 @@ implementation
begin begin
current_asmdata.getaddrlabel(TAsmLabel(pointer(labsym))); current_asmdata.getaddrlabel(TAsmLabel(pointer(labsym)));
append_entry(DW_TAG_typedef,false,[ 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); append_labelentry_ref(DW_AT_type,labsym);
finish_entry; finish_entry;
@ -2114,7 +2114,7 @@ implementation
current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Procdef '+def.fullprocname(true)))); 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 if not is_objc_class_or_protocol(def.struct) then
append_entry(DW_TAG_subprogram,true, 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 } { data continues below }
{ problem: base reg isn't known here { problem: base reg isn't known here
DW_AT_frame_base,DW_FORM_block1,1 DW_AT_frame_base,DW_FORM_block1,1
@ -2318,7 +2318,7 @@ implementation
procedure TDebugInfoDwarf.appendsym_var(list:TAsmList;sym:tabstractnormalvarsym); procedure TDebugInfoDwarf.appendsym_var(list:TAsmList;sym:tabstractnormalvarsym);
begin 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; end;
@ -2554,7 +2554,7 @@ implementation
procedure TDebugInfoDwarf.appendsym_fieldvar(list:TAsmList;sym: tfieldvarsym); procedure TDebugInfoDwarf.appendsym_fieldvar(list:TAsmList;sym: tfieldvarsym);
begin 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; end;
@ -2601,7 +2601,7 @@ implementation
if (target_info.endian=endian_little) then if (target_info.endian=endian_little) then
bitoffset:=(fieldnatsize*8)-bitoffset-sym.vardef.packedbitsize; bitoffset:=(fieldnatsize*8)-bitoffset-sym.vardef.packedbitsize;
append_entry(DW_TAG_member,false,[ 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 } { gcc also generates both a bit and byte size attribute }
{ we don't support ordinals >= 256 bits } { we don't support ordinals >= 256 bits }
DW_AT_byte_size,DW_FORM_data1,fieldnatsize, DW_AT_byte_size,DW_FORM_data1,fieldnatsize,
@ -2642,7 +2642,7 @@ implementation
if ismember then if ismember then
append_entry(DW_TAG_member,false,[ 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. { The DW_AT_declaration tag is invalid according to the DWARF specifications.
But gcc adds this to static const members and gdb checks But gcc adds this to static const members and gdb checks
for this flag. So we have to set it also. for this flag. So we have to set it also.
@ -2652,7 +2652,7 @@ implementation
]) ])
else else
append_entry(DW_TAG_variable,false,[ 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 } { for string constants, constdef isn't set because they have no real type }
case sym.consttyp of case sym.consttyp of
@ -2821,10 +2821,10 @@ implementation
begin begin
if (tosym.typ=fieldvarsym) then if (tosym.typ=fieldvarsym) then
internalerror(2009031404); 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 end
else 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; end;
@ -2883,7 +2883,7 @@ implementation
flags:=[]; flags:=[];
if (sym.owner.symtabletype=localsymtable) then if (sym.owner.symtabletype=localsymtable) then
include(flags,dvf_force_local_var); 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; end;
templist.free; templist.free;
exit; exit;
@ -2893,7 +2893,7 @@ implementation
end; end;
append_entry(DW_TAG_variable,false,[ 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_file,DW_FORM_data1,0,
DW_AT_decl_line,DW_FORM_data1, DW_AT_decl_line,DW_FORM_data1,
@ -2914,7 +2914,7 @@ implementation
procedure TDebugInfoDwarf.beforeappendsym(list:TAsmList;sym:tsym); procedure TDebugInfoDwarf.beforeappendsym(list:TAsmList;sym:tsym);
begin 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; end;
@ -3270,7 +3270,7 @@ implementation
end; end;
function TDebugInfoDwarf.symname(sym: tsym): String; function TDebugInfoDwarf.symname(sym: tsym; manglename: boolean): String;
begin begin
if (sym.typ=paravarsym) and if (sym.typ=paravarsym) and
(vo_is_self in tparavarsym(sym).varoptions) then (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 else if (ds_dwarf_method_class_prefix in current_settings.debugswitches) and
(sym.typ=procsym) and (sym.typ=procsym) and
(tprocsym(sym).owner.symtabletype in [objectsymtable,recordsymtable]) then (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 else
result:=symdebugname(sym); result := result + symdebugname(sym);
end
else
begin
if manglename then
result := sym.name
else
result := symdebugname(sym);
end;
end; end;
@ -3517,7 +3528,7 @@ implementation
file recs. are less than 1k so using data2 is enough } file recs. are less than 1k so using data2 is enough }
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_structure_type,false,[ 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 DW_AT_byte_size,DW_FORM_udata,def.size
]) ])
else else
@ -3660,7 +3671,7 @@ implementation
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_set_type,false,[ 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 DW_AT_byte_size,DW_FORM_data2,def.size
]) ])
else else
@ -3696,7 +3707,7 @@ implementation
{ info of modules that contain set tags } { info of modules that contain set tags }
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_base_type,false,[ 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_encoding,DW_FORM_data1,DW_ATE_unsigned,
DW_AT_byte_size,DW_FORM_data2,def.size DW_AT_byte_size,DW_FORM_data2,def.size
]) ])
@ -3764,7 +3775,7 @@ implementation
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_array_type,true,[ 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 DW_AT_data_location,DW_FORM_block1,2
]) ])
else else
@ -3935,7 +3946,7 @@ implementation
begin begin
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_file_type,false,[ 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 DW_AT_byte_size,DW_FORM_data2,def.size
]) ])
else else
@ -4073,7 +4084,7 @@ implementation
{ ??? can a undefined def have a typename ? } { ??? can a undefined def have a typename ? }
if assigned(def.typesym) then if assigned(def.typesym) then
append_entry(DW_TAG_unspecified_type,false,[ 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 else
append_entry(DW_TAG_unspecified_type,false,[ append_entry(DW_TAG_unspecified_type,false,[