diff --git a/compiler/dbgdwarf.pas b/compiler/dbgdwarf.pas index d51b09798a..1b6ab25840 100644 --- a/compiler/dbgdwarf.pas +++ b/compiler/dbgdwarf.pas @@ -1555,7 +1555,7 @@ implementation files for debugging and also that gdb only loads in the debug info of a particular object file once you step into or over a procedure in it. - + To solve this, there is a tool called dsymutil which can extract all the dwarf info from a program's object files. This utility however performs "smart linking" on the dwarf @@ -1563,7 +1563,7 @@ implementation variables' types always point to the dwarfino for a tdef and never to that for a typesym, this means all debug entries generated for typesyms are thrown away. - + The problem with that is that we translate typesyms into DW_TAG_typedef, and gdb's dwarf-2 reader only makes types globally visibly if they are defined using a DW_TAG_typedef. @@ -1574,7 +1574,7 @@ implementation tdef dwarf info is still available, but you cannot typecast anything outside the declaring units because the type names are not known there). - + The solution: if a tdef has an associated typesym, let the debug label for the tdef point to a DW_TAG_typedef instead of directly to the tdef itself. And don't write anything @@ -2347,7 +2347,7 @@ implementation if ditem.Name = '.' then Continue; { Write without trailing path delimiter and also don't prefix with ./ for current dir (already done while adding to dirlist } - + linelist.concat(tai_string.create(ditem.Name+#0)); end; linelist.concat(tai_const.create_8bit(0)); @@ -2377,7 +2377,7 @@ implementation { end of debug line table } linelist.concat(tai_symbol.createname(target_asm.labelprefix+'edebug_line0',AT_DATA,0)); - + flist.free; end; @@ -2611,9 +2611,10 @@ implementation currfileinfo:=tailineinfo(hp).fileinfo; { file changed ? (must be before line info) } if (currfileinfo.fileindex<>0) and - (lastfileinfo.fileindex<>currfileinfo.fileindex) then + ((lastfileinfo.fileindex<>currfileinfo.fileindex) or + (lastfileinfo.moduleindex<>currfileinfo.moduleindex)) then begin - infile:=current_module.sourcefiles.get_file(currfileinfo.fileindex); + infile:=get_module(currfileinfo.moduleindex).sourcefiles.get_file(currfileinfo.fileindex); if assigned(infile) then begin currfileidx := get_file_index(infile); diff --git a/compiler/dbgstabs.pas b/compiler/dbgstabs.pas index 8d7ae3d8b8..e4e166ab9c 100644 --- a/compiler/dbgstabs.pas +++ b/compiler/dbgstabs.pas @@ -1574,9 +1574,10 @@ implementation currfileinfo:=tailineinfo(hp).fileinfo; { file changed ? (must be before line info) } if (currfileinfo.fileindex<>0) and - (lastfileinfo.fileindex<>currfileinfo.fileindex) then + ((lastfileinfo.fileindex<>currfileinfo.fileindex) or + (lastfileinfo.moduleindex<>currfileinfo.moduleindex)) then begin - infile:=current_module.sourcefiles.get_file(currfileinfo.fileindex); + infile:=get_module(currfileinfo.moduleindex).sourcefiles.get_file(currfileinfo.fileindex); if assigned(infile) then begin current_asmdata.getlabel(hlabel,alt_dbgfile); diff --git a/compiler/psub.pas b/compiler/psub.pas index 8650ccf329..c33f125f6d 100644 --- a/compiler/psub.pas +++ b/compiler/psub.pas @@ -1822,6 +1822,8 @@ implementation begin oldcurrent_filepos:=current_filepos; current_filepos:=tprocdef(tprocdef(hp).genericdef).fileinfo; + { use the index the module got from the current compilation process } + current_filepos.moduleindex:=hmodule.unit_index; current_tokenpos:=current_filepos; current_scanner.startreplaytokens(tprocdef(tprocdef(hp).genericdef).generictokenbuf); read_proc_body(nil,tprocdef(hp));