* better detection of source file change while writing debug info

* set module index before replaying tokens of a generic

git-svn-id: trunk@9767 -
This commit is contained in:
florian 2008-01-15 21:36:58 +00:00
parent 611e07202d
commit cd4b05f3de
3 changed files with 13 additions and 9 deletions

View File

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

View File

@ -1574,9 +1574,10 @@ implementation
currfileinfo:=tailineinfo(hp).fileinfo; currfileinfo:=tailineinfo(hp).fileinfo;
{ file changed ? (must be before line info) } { file changed ? (must be before line info) }
if (currfileinfo.fileindex<>0) and if (currfileinfo.fileindex<>0) and
(lastfileinfo.fileindex<>currfileinfo.fileindex) then ((lastfileinfo.fileindex<>currfileinfo.fileindex) or
(lastfileinfo.moduleindex<>currfileinfo.moduleindex)) then
begin begin
infile:=current_module.sourcefiles.get_file(currfileinfo.fileindex); infile:=get_module(currfileinfo.moduleindex).sourcefiles.get_file(currfileinfo.fileindex);
if assigned(infile) then if assigned(infile) then
begin begin
current_asmdata.getlabel(hlabel,alt_dbgfile); current_asmdata.getlabel(hlabel,alt_dbgfile);

View File

@ -1822,6 +1822,8 @@ implementation
begin begin
oldcurrent_filepos:=current_filepos; oldcurrent_filepos:=current_filepos;
current_filepos:=tprocdef(tprocdef(hp).genericdef).fileinfo; 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_tokenpos:=current_filepos;
current_scanner.startreplaytokens(tprocdef(tprocdef(hp).genericdef).generictokenbuf); current_scanner.startreplaytokens(tprocdef(tprocdef(hp).genericdef).generictokenbuf);
read_proc_body(nil,tprocdef(hp)); read_proc_body(nil,tprocdef(hp));