diff options
-rw-r--r-- | compiler/dbgdwarf.pas | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/compiler/dbgdwarf.pas b/compiler/dbgdwarf.pas index 9b18b13135..b95fa82234 100644 --- a/compiler/dbgdwarf.pas +++ b/compiler/dbgdwarf.pas @@ -2310,6 +2310,20 @@ implementation templist.concat(tai_const.create_8bit(ord(DW_OP_breg0)+dreg)); templist.concat(tai_const.create_sleb128bit(sym.localloc.reference.offset+offset)); blocksize:=1+Lengthsleb128(sym.localloc.reference.offset); +{$ifndef gdb_supports_DW_AT_variable_parameter} + { Parameters which are passed by reference. (var and the like) + Hide the reference-pointer and dereference the pointer + in the DW_AT_location block. + } + if (sym.typ=paravarsym) and + paramanager.push_addr_param(sym.varspez,sym.vardef,tprocdef(sym.owner.defowner).proccalloption) and + not(vo_has_local_copy in sym.varoptions) and + not is_open_string(sym.vardef) then + begin + templist.concat(tai_const.create_8bit(ord(DW_OP_deref))); + inc(blocksize); + end +{$endif not gdb_supports_DW_AT_variable_parameter} end; end else @@ -2396,15 +2410,7 @@ implementation that). } if (vo_is_self in sym.varoptions) then append_attribute(DW_AT_artificial,DW_FORM_flag,[true]); -{$ifndef gdb_supports_DW_AT_variable_parameter} - if (sym.typ=paravarsym) and - paramanager.push_addr_param(sym.varspez,sym.vardef,tprocdef(sym.owner.defowner).proccalloption) and - not(vo_has_local_copy in sym.varoptions) and - not is_open_string(sym.vardef) then - append_labelentry_ref(DW_AT_type,def_dwarf_ref_lab(def)) - else -{$endif not gdb_supports_DW_AT_variable_parameter} - append_labelentry_ref(DW_AT_type,def_dwarf_lab(def)); + append_labelentry_ref(DW_AT_type,def_dwarf_lab(def)); templist.free; |