diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-01-21 23:28:34 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-01-21 23:28:34 +0000 |
commit | 1903b037de2fb3e75826406b46f055acb70963fa (patch) | |
tree | 604cd8b790fe14e5fbe441d4cd647c80d2a36a9a /compiler/dbgdwarf.pas | |
parent | ad1141d52f8353457053b925cd674fe1d5c4eafc (diff) | |
parent | 953d907e4d6c3a5c2f8aaee6e5e4f73c55ce5985 (diff) | |
download | fpc-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.pas | 120 |
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,[ |