[Lldb-commits] [lldb] r276729 - Add support for an additional dictionary in the per-arch plists
Jason Molenda via lldb-commits
lldb-commits at lists.llvm.org
Mon Jul 25 23:33:07 PDT 2016
Author: jmolenda
Date: Tue Jul 26 01:33:07 2016
New Revision: 276729
URL: http://llvm.org/viewvc/llvm-project?rev=276729&view=rev
Log:
Add support for an additional dictionary in the per-arch plists
that may be embedded in the Contents/Resources subdir of a dSYM
bundle. These allow for the specification of a build-time path
to debug-time path remapping for source files. Files may be built
in /BuildDirectory/sources/project-100 but when the debugger is
run, they're actually found via ~sources/project-100 - this plist
allows for that remapping through the DBGBuildSourcePath and
DBGSourcePath keys.
This patch adds support for a new DBGSourcePathRemapping
dictionary in the plist where the keys are the build-time paths
and the values are the debug-time paths that they should be
remapped to. There are instances were we have multiple possible
build-time paths that need to be included, so the dictionary was
required.
<rdar://problem/26725174>
Modified:
lldb/trunk/source/Host/macosx/Symbols.cpp
lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
Modified: lldb/trunk/source/Host/macosx/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Symbols.cpp?rev=276729&r1=276728&r2=276729&view=diff
==============================================================================
--- lldb/trunk/source/Host/macosx/Symbols.cpp (original)
+++ lldb/trunk/source/Host/macosx/Symbols.cpp Tue Jul 26 01:33:07 2016
@@ -310,6 +310,7 @@ GetModuleSpecInfoFromUUIDDictionary (CFD
{
std::string str;
CFStringRef cf_str;
+ CFDictionaryRef cf_dict;
cf_str = (CFStringRef)CFDictionaryGetValue ((CFDictionaryRef) uuid_dict, CFSTR("DBGSymbolRichExecutable"));
if (cf_str && CFGetTypeID (cf_str) == CFStringGetTypeID ())
@@ -362,8 +363,69 @@ GetModuleSpecInfoFromUUIDDictionary (CFD
if (!DBGBuildSourcePath.empty() && !DBGSourcePath.empty())
{
+ if (DBGSourcePath[0] == '~')
+ {
+ FileSpec resolved_source_path(DBGSourcePath.c_str(), true);
+ DBGSourcePath = resolved_source_path.GetPath();
+ }
module_spec.GetSourceMappingList().Append (ConstString(DBGBuildSourcePath.c_str()), ConstString(DBGSourcePath.c_str()), true);
}
+
+ cf_dict = (CFDictionaryRef)CFDictionaryGetValue ((CFDictionaryRef) uuid_dict, CFSTR("DBGSourcePathRemapping"));
+ if (cf_dict && CFGetTypeID (cf_dict) == CFDictionaryGetTypeID ())
+ {
+ // If we see DBGVersion with any kind of value, this is a new style DBGSourcePathRemapping dictionary
+ bool new_style_source_remapping_dictionary = false;
+ std::string original_DBGSourcePath_value = DBGSourcePath;
+ const void *version_value;
+ version_value = CFDictionaryGetValue ((CFDictionaryRef) uuid_dict, CFSTR("DBGVersion"));
+ if (version_value)
+ new_style_source_remapping_dictionary = true;
+
+ CFIndex kv_pair_count = CFDictionaryGetCount ((CFDictionaryRef) uuid_dict);
+ if (kv_pair_count > 0)
+ {
+ CFStringRef *keys = (CFStringRef *) malloc (kv_pair_count * sizeof (CFStringRef));
+ CFStringRef *values = (CFStringRef *) malloc (kv_pair_count * sizeof (CFStringRef));
+ if (keys != nullptr && values != nullptr)
+ {
+ CFDictionaryGetKeysAndValues ((CFDictionaryRef) uuid_dict, (const void**)keys, (const void**)values);
+ }
+ for (CFIndex i = 0; i < kv_pair_count; i++)
+ {
+ DBGBuildSourcePath.clear();
+ DBGSourcePath.clear();
+ if (keys[i] && CFGetTypeID (keys[i]) == CFStringGetTypeID ())
+ {
+ CFCString::FileSystemRepresentation(keys[i], DBGBuildSourcePath);
+ }
+ if (values[i] && CFGetTypeID (values[i]) == CFStringGetTypeID ())
+ {
+ CFCString::FileSystemRepresentation(values[i], DBGSourcePath);
+ }
+ if (!DBGBuildSourcePath.empty() && !DBGSourcePath.empty())
+ {
+ // In the "old style" DBGSourcePathRemapping dictionary, the DBGSourcePath values
+ // (the "values" half of key-value path pairs) were wrong. Ignore them and use the
+ // universal DBGSourcePath string from earlier.
+ if (new_style_source_remapping_dictionary == true && !original_DBGSourcePath_value.empty())
+ {
+ DBGSourcePath = original_DBGSourcePath_value;
+ }
+ if (DBGSourcePath[0] == '~')
+ {
+ FileSpec resolved_source_path(DBGSourcePath.c_str(), true);
+ DBGSourcePath = resolved_source_path.GetPath();
+ }
+ module_spec.GetSourceMappingList().Append (ConstString(DBGBuildSourcePath.c_str()), ConstString(DBGSourcePath.c_str()), true);
+ }
+ }
+ if (keys)
+ free (keys);
+ if (values)
+ free (values);
+ }
+ }
}
return success;
}
Modified: lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp?rev=276729&r1=276728&r2=276729&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp Tue Jul 26 01:33:07 2016
@@ -211,6 +211,57 @@ SymbolVendorMacOSX::CreateInstance (cons
}
module_sp->GetSourceMappingList().Append (ConstString(DBGBuildSourcePath), ConstString(DBGSourcePath), true);
}
+
+ // DBGSourcePathRemapping is a dictionary in the plist with
+ // keys which are DBGBuildSourcePath file paths and
+ // values which are DBGSourcePath file paths
+
+ StructuredData::ObjectSP plist_sp = plist.GetStructuredData();
+ if (plist_sp.get()
+ && plist_sp->GetAsDictionary()
+ && plist_sp->GetAsDictionary()->HasKey("DBGSourcePathRemapping")
+ && plist_sp->GetAsDictionary()->GetValueForKey("DBGSourcePathRemapping")->GetAsDictionary())
+ {
+
+ // In an early version of DBGSourcePathRemapping, the DBGSourcePath
+ // values were incorrect. If we have a newer style
+ // DBGSourcePathRemapping, there will be a DBGVersion key in the plist
+ // (we don't care about the value at this point).
+ //
+ // If this is an old style DBGSourcePathRemapping, ignore the
+ // value half of the key-value remappings and use reuse the original
+ // gloal DBGSourcePath string.
+ bool new_style_source_remapping_dictionary = false;
+ std::string original_DBGSourcePath_value = DBGSourcePath;
+ if (plist_sp->GetAsDictionary()->HasKey("DBGVersion"))
+ {
+ new_style_source_remapping_dictionary = true;
+ }
+
+ StructuredData::Dictionary *remappings_dict = plist_sp->GetAsDictionary()->GetValueForKey("DBGSourcePathRemapping")->GetAsDictionary();
+ remappings_dict->ForEach ([&module_sp, new_style_source_remapping_dictionary, original_DBGSourcePath_value](ConstString key, StructuredData::Object *object) -> bool
+ {
+ if (object && object->GetAsString())
+ {
+
+ // key is DBGBuildSourcePath
+ // object is DBGSourcePath
+ std::string DBGSourcePath = object->GetStringValue();
+ if (new_style_source_remapping_dictionary == false && !original_DBGSourcePath_value.empty())
+ {
+ DBGSourcePath = original_DBGSourcePath_value;
+ }
+ if (DBGSourcePath[0] == '~')
+ {
+ FileSpec resolved_source_path(DBGSourcePath.c_str(), true);
+ DBGSourcePath = resolved_source_path.GetPath();
+ }
+ module_sp->GetSourceMappingList().Append (key, ConstString(DBGSourcePath), true);
+ }
+ return true;
+ });
+
+ }
}
}
}
More information about the lldb-commits
mailing list