diff --git a/compiler/dbgdwarf.pas b/compiler/dbgdwarf.pas index 81522c961d..9e7790fe96 100644 --- a/compiler/dbgdwarf.pas +++ b/compiler/dbgdwarf.pas @@ -438,7 +438,7 @@ implementation { Calling convention. } Tdwarf_calling_convention = (DW_CC_normal := $1,DW_CC_program := $2, - DW_CC_nocall := $3,DW_CC_GNU_renesas_sh := $40 + DW_CC_nocall := $3,DW_CC_GNU_renesas_sh := $40, DW_CC_GNU_borland_fastcall_i386 := $41 ); {$notes off} { Location atom names and codes. } @@ -1657,6 +1657,22 @@ implementation procedure TDebugInfoDwarf.appendprocdef(list:TAsmList;def:tprocdef); + + function dwarf_calling_convention(def: tprocdef): Tdwarf_calling_convention; + begin + case def.proccalloption of + pocall_register: + result:=DW_CC_GNU_borland_fastcall_i386; + pocall_cdecl, + pocall_stdcall, + pocall_cppdecl, + pocall_mwpascal: + result:=DW_CC_normal; + else + result:=DW_CC_nocall; + end + end; + var procendlabel : tasmlabel; funcrettype : tasmsymbol; @@ -1669,6 +1685,7 @@ implementation current_asmdata.asmlists[al_dwarf_info].concat(tai_comment.Create(strpnew('Procdef '+def.fullprocname(true)))); append_entry(DW_TAG_subprogram,true, [DW_AT_name,DW_FORM_string,symname(def.procsym)+#0, + DW_AT_calling_convention,DW_FORM_data1,dwarf_calling_convention(def), DW_AT_external,DW_FORM_flag,po_global in def.procoptions { data continues below } { problem: base reg isn't known here @@ -1693,35 +1710,9 @@ implementation append_labelentry(DW_AT_low_pc,current_asmdata.RefAsmSymbol(procentry)); append_labelentry(DW_AT_high_pc,procendlabel); - if assigned(def.funcretsym) and - (tabstractnormalvarsym(def.funcretsym).refs>0) then - begin - if tabstractnormalvarsym(def.funcretsym).localloc.loc=LOC_REFERENCE then - begin - finish_entry; - - if paramanager.ret_in_param(def.returndef,def.proccalloption) then - funcrettype:=def_dwarf_ref_lab(def.returndef) - else - funcrettype:=def_dwarf_lab(def.returndef); - - append_entry(DW_TAG_formal_parameter,false,[ - DW_AT_name,DW_FORM_string,def.procsym.name+#0, - { - DW_AT_decl_file,DW_FORM_data1,0, - DW_AT_decl_line,DW_FORM_data1, - } - { data continues below } - DW_AT_location,DW_FORM_block1,1+Lengthsleb128(tabstractnormalvarsym(def.funcretsym).localloc.reference.offset) - ]); - - { append block data } - dreg:=dwarf_reg(tabstractnormalvarsym(def.funcretsym).localloc.reference.base); - current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_breg0)+dreg)); - current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_sleb128bit(tabstractnormalvarsym(def.funcretsym).localloc.reference.offset)); - append_labelentry_ref(DW_AT_type,funcrettype); - end; - end; + { Don't write the funcretsym explicitly, it's also in the + localsymtable and/or parasymtable. + } finish_entry; if assigned(def.parast) then @@ -1889,7 +1880,13 @@ implementation end; end; - if sym.typ=paravarsym then + { function results must not be added to the parameter list, + as they are not part of the signature of the function + (gdb automatically adds them according to the ABI specifications + when calling the function) + } + if (sym.typ=paravarsym) and + not(vo_is_funcret in sym.varoptions) then tag:=DW_TAG_formal_parameter else tag:=DW_TAG_variable;