[Lldb-commits] [PATCH] D47539: [Platform] Accept arbitrary kext variants
Jonas Devlieghere via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed May 30 09:41:32 PDT 2018
JDevlieghere updated this revision to Diff 149143.
JDevlieghere added a comment.
Don't use `EnumerateDirectory`
https://reviews.llvm.org/D47539
Files:
source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h
Index: source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h
===================================================================
--- source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h
+++ source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h
@@ -127,6 +127,9 @@
const lldb_private::FileSpec &file_spec,
bool recurse);
+ static std::vector<lldb_private::FileSpec>
+ SearchForExecutablesRecursively(const lldb_private::ConstString &dir);
+
static void AddKextToMap(PlatformDarwinKernel *thisp,
const lldb_private::FileSpec &file_spec);
Index: source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
===================================================================
--- source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
+++ source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
@@ -779,35 +779,53 @@
return error;
}
+std::vector<lldb_private::FileSpec>
+PlatformDarwinKernel::SearchForExecutablesRecursively(const ConstString &dir) {
+ std::vector<FileSpec> executables;
+ std::error_code EC;
+ for (llvm::sys::fs::recursive_directory_iterator it(dir.GetStringRef(), EC),
+ end;
+ it != end && !EC; it.increment(EC)) {
+ auto status = it->status();
+ if (!status)
+ break;
+ if (llvm::sys::fs::is_regular_file(*status) &&
+ llvm::sys::fs::can_execute(it->path()))
+ executables.emplace_back(it->path(), false);
+ }
+ return executables;
+}
+
Status PlatformDarwinKernel::ExamineKextForMatchingUUID(
const FileSpec &kext_bundle_path, const lldb_private::UUID &uuid,
const ArchSpec &arch, ModuleSP &exe_module_sp) {
- Status error;
- FileSpec exe_file = kext_bundle_path;
- Host::ResolveExecutableInBundle(exe_file);
- if (exe_file.Exists()) {
- ModuleSpec exe_spec(exe_file);
- exe_spec.GetUUID() = uuid;
- if (!uuid.IsValid()) {
- exe_spec.GetArchitecture() = arch;
- }
+ for (const auto &exe_file :
+ SearchForExecutablesRecursively(kext_bundle_path.GetDirectory())) {
+ if (exe_file.Exists()) {
+ ModuleSpec exe_spec(exe_file);
+ exe_spec.GetUUID() = uuid;
+ if (!uuid.IsValid()) {
+ exe_spec.GetArchitecture() = arch;
+ }
- // First try to create a ModuleSP with the file / arch and see if the UUID
- // matches. If that fails (this exec file doesn't have the correct uuid),
- // don't call GetSharedModule (which may call in to the DebugSymbols
- // framework and therefore can be slow.)
- ModuleSP module_sp(new Module(exe_spec));
- if (module_sp && module_sp->GetObjectFile() &&
- module_sp->MatchesModuleSpec(exe_spec)) {
- error = ModuleList::GetSharedModule(exe_spec, exe_module_sp, NULL, NULL,
- NULL);
- if (exe_module_sp && exe_module_sp->GetObjectFile()) {
- return error;
+ // First try to create a ModuleSP with the file / arch and see if the UUID
+ // matches. If that fails (this exec file doesn't have the correct uuid),
+ // don't call GetSharedModule (which may call in to the DebugSymbols
+ // framework and therefore can be slow.)
+ ModuleSP module_sp(new Module(exe_spec));
+ if (module_sp && module_sp->GetObjectFile() &&
+ module_sp->MatchesModuleSpec(exe_spec)) {
+ Status error = ModuleList::GetSharedModule(exe_spec, exe_module_sp,
+ NULL, NULL, NULL);
+ if (exe_module_sp && exe_module_sp->GetObjectFile()) {
+ return error;
+ }
}
+ exe_module_sp.reset();
}
- exe_module_sp.reset();
}
- return error;
+
+ return {};
}
bool PlatformDarwinKernel::GetSupportedArchitectureAtIndex(uint32_t idx,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D47539.149143.patch
Type: text/x-patch
Size: 3796 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20180530/c1024529/attachment.bin>
More information about the lldb-commits
mailing list