summaryrefslogtreecommitdiff
path: root/compiler/dbgdwarf.pas
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-01-21 23:28:34 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-01-21 23:28:34 +0000
commit1903b037de2fb3e75826406b46f055acb70963fa (patch)
tree604cd8b790fe14e5fbe441d4cd647c80d2a36a9a /compiler/dbgdwarf.pas
parentad1141d52f8353457053b925cd674fe1d5c4eafc (diff)
parent953d907e4d6c3a5c2f8aaee6e5e4f73c55ce5985 (diff)
downloadfpc-blocks.tar.gz
* synchronised with trunk till r29513blocks
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/blocks@29516 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/dbgdwarf.pas')
-rw-r--r--compiler/dbgdwarf.pas120
1 files changed, 77 insertions, 43 deletions
diff --git a/compiler/dbgdwarf.pas b/compiler/dbgdwarf.pas
index 4592094753..4d7cf22890 100644
--- a/compiler/dbgdwarf.pas
+++ b/compiler/dbgdwarf.pas
@@ -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;
@@ -2404,7 +2404,12 @@ implementation
if (vo_is_thread_var in sym.varoptions) then
begin
{ TODO: !!! FIXME: dwarf for thread vars !!!}
- blocksize:=0;
+{ This is only a minimal change to at least be able to get a value
+ in only one thread is present PM 2014-11-21, like for stabs format }
+ templist.concat(tai_const.create_8bit(ord(DW_OP_addr)));
+ templist.concat(tai_const.Create_type_name(aitconst_ptr,sym.mangledname,
+ offset+sizeof(pint)));
+ blocksize:=1+sizeof(puint);
end
else
begin
@@ -2554,7 +2559,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 +2606,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 +2647,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 +2657,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 +2826,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 +2888,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 +2898,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 +2919,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 +3275,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 +3295,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;
@@ -3316,6 +3332,7 @@ implementation
currfileinfo,
lastfileinfo : tfileposinfo;
currfuncname : pshortstring;
+ currstatement: boolean;
currsectype : TAsmSectiontype;
hp, hpend : tai;
infile : tinputfile;
@@ -3334,6 +3351,7 @@ implementation
currfuncname:=nil;
currsectype:=sec_code;
hp:=Tai(list.first);
+ currstatement:=true;
prevcolumn := 0;
prevline := 1;
prevfileidx := 1;
@@ -3365,8 +3383,7 @@ implementation
end;
if (currsectype=sec_code) and
- (hp.typ=ait_instruction) and
- (nolineinfolevel=0) then
+ (hp.typ=ait_instruction) then
begin
currfileinfo:=tailineinfo(hp).fileinfo;
{ file changed ? (must be before line info) }
@@ -3397,8 +3414,12 @@ implementation
end;
end;
+ { Set the line-nr to 0 if the code does not corresponds to a particular line }
+ if nolineinfolevel>0 then
+ currfileinfo.line := 0;
+
{ line changed ? }
- if (lastfileinfo.line<>currfileinfo.line) and (currfileinfo.line<>0) then
+ if (lastfileinfo.line<>currfileinfo.line) and ((currfileinfo.line<>0) or (nolineinfolevel>0)) then
begin
{ set address }
current_asmdata.getlabel(currlabel, alt_dbgline);
@@ -3431,6 +3452,19 @@ implementation
prevcolumn := currfileinfo.column;
end;
+ { set statement }
+ if (currfileinfo.line=0) and currstatement then
+ begin
+ currstatement := false;
+ asmline.concat(tai_const.create_8bit(DW_LNS_negate_stmt));
+ end;
+
+ if not currstatement and (currfileinfo.line>0) then
+ begin
+ currstatement := true;
+ asmline.concat(tai_const.create_8bit(DW_LNS_negate_stmt));
+ end;
+
{ set line }
diffline := currfileinfo.line - prevline;
if (diffline >= LINE_BASE) and (OPCODE_BASE + diffline - LINE_BASE <= 255) then
@@ -3517,7 +3551,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 +3694,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 +3730,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 +3798,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 +3969,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 +4107,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,[