[Lldb-commits] [lldb] r163417 - /lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
Greg Clayton
gclayton at apple.com
Fri Sep 7 13:29:13 PDT 2012
Author: gclayton
Date: Fri Sep 7 15:29:13 2012
New Revision: 163417
URL: http://llvm.org/viewvc/llvm-project?rev=163417&view=rev
Log:
Train LLDB to deal with bad linker N_SO entries that point to our source files for debug map + DWARF in .o file debugging.
Modified:
lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp?rev=163417&r1=163416&r2=163417&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Fri Sep 7 15:29:13 2012
@@ -1822,6 +1822,24 @@
if (so_path && so_path[0])
{
std::string full_so_path (so_path);
+ const size_t double_slash_pos = full_so_path.find("//");
+ if (double_slash_pos != std::string::npos)
+ {
+ // The linker has been generating bad N_SO entries with doubled up paths
+ // in the format "%s%s" where the first stirng in the DW_AT_comp_dir,
+ // and the second is the directory for the source file so you end up with
+ // a path that looks like "/tmp/src//tmp/src/"
+ FileSpec so_dir(so_path, false);
+ if (!so_dir.Exists())
+ {
+ so_dir.SetFile(&full_so_path[double_slash_pos + 1], false);
+ if (so_dir.Exists())
+ {
+ // Trim off the incorrect path
+ full_so_path.erase(0, double_slash_pos + 1);
+ }
+ }
+ }
if (*full_so_path.rbegin() != '/')
full_so_path += '/';
full_so_path += symbol_name;
@@ -2545,6 +2563,24 @@
if (so_path && so_path[0])
{
std::string full_so_path (so_path);
+ const size_t double_slash_pos = full_so_path.find("//");
+ if (double_slash_pos != std::string::npos)
+ {
+ // The linker has been generating bad N_SO entries with doubled up paths
+ // in the format "%s%s" where the first stirng in the DW_AT_comp_dir,
+ // and the second is the directory for the source file so you end up with
+ // a path that looks like "/tmp/src//tmp/src/"
+ FileSpec so_dir(so_path, false);
+ if (!so_dir.Exists())
+ {
+ so_dir.SetFile(&full_so_path[double_slash_pos + 1], false);
+ if (so_dir.Exists())
+ {
+ // Trim off the incorrect path
+ full_so_path.erase(0, double_slash_pos + 1);
+ }
+ }
+ }
if (*full_so_path.rbegin() != '/')
full_so_path += '/';
full_so_path += symbol_name;
More information about the lldb-commits
mailing list