* strip ./ prefixes and / suffixes from paths

* compile unit name requires (relative) path prefix otherwise the debugger
    thinks that there is also a copy of the file in the current directory

git-svn-id: trunk@8847 -
This commit is contained in:
peter 2007-10-18 22:53:39 +00:00
parent 658d9fcc92
commit daf320225b

View File

@ -40,7 +40,7 @@ unit dbgdwarf;
interface
uses
cclasses,
cclasses,globtype,
aasmbase,aasmtai,aasmdata,
symbase,symtype,symdef,symsym,
finput,
@ -224,6 +224,7 @@ interface
function def_dwarf_class_struct_lab(def:tobjectdef) : tasmsymbol;
function get_file_index(afile: tinputfile): Integer;
procedure write_symtable_syms(st:TSymtable);
function clean_dwarf_path(const s:tcmdstr):tcmdstr;
protected
// set if we should use 64bit headers (dwarf3 and up)
_use_64bit_headers: Boolean;
@ -334,8 +335,8 @@ interface
implementation
uses
cutils,cfileutl,constexp,
version,globtype,globals,verbose,systems,
sysutils,cutils,cfileutl,constexp,
version,globals,verbose,systems,
cpubase,cgbase,paramgr,
fmodule,
defutil,symconst,symtable
@ -625,6 +626,14 @@ implementation
TDebugInfoDwarf
****************************************************************************}
function TDebugInfoDwarf.clean_dwarf_path(const s:tcmdstr):tcmdstr;
begin
{ Make a clean path for gdb. Remove trailing / and ./ prefixes and
use always a / }
result:=BsToSlash(ExcludeTrailingPathDelimiter(ExtractRelativePath('.',s)));
end;
procedure TDebugInfoDwarf.set_use_64bit_headers(state: boolean);
begin
_use_64bit_headers:=state;
@ -2271,7 +2280,8 @@ implementation
ditem := TDirIndexItem(dirlist[n]);
if ditem.Name = '.' then
Continue;
linelist.concat(tai_string.create(ditem.Name+#0));
{ Write without trailing path delimiter and also don't prefix with ./ for current dir }
linelist.concat(tai_string.create(clean_dwarf_path(ditem.Name)+#0));
end;
linelist.concat(tai_const.create_8bit(0));
@ -2394,9 +2404,9 @@ implementation
{ first manadatory compilation unit TAG }
append_entry(DW_TAG_compile_unit,true,[
DW_AT_name,DW_FORM_string,FixFileName(current_module.sourcefiles.get_file(1).name^)+#0,
DW_AT_name,DW_FORM_string,clean_dwarf_path(FixFileName(current_module.sourcefiles.get_file(1).path^+current_module.sourcefiles.get_file(1).name^))+#0,
DW_AT_producer,DW_FORM_string,'Free Pascal '+full_version_string+' '+date_string+#0,
DW_AT_comp_dir,DW_FORM_string,BsToSlash(FixPath(GetCurrentDir,false))+#0,
DW_AT_comp_dir,DW_FORM_string,clean_dwarf_path(FixPath(GetCurrentDir,false))+#0,
DW_AT_language,DW_FORM_data1,DW_LANG_Pascal83,
DW_AT_identifier_case,DW_FORM_data1,DW_ID_case_insensitive]);