[Lldb-commits] [lldb] r178827 - Add a new PlatformDarwinKernel for kernel debugging. This Platform

Jason Molenda jmolenda at apple.com
Thu Apr 4 18:03:26 PDT 2013


Author: jmolenda
Date: Thu Apr  4 20:03:25 2013
New Revision: 178827

URL: http://llvm.org/viewvc/llvm-project?rev=178827&view=rev
Log:
Add a new PlatformDarwinKernel for kernel debugging.  This Platform
plugin will index the kext bundles on the local filesystem when
created.  During a kernel debug session, when the DynamicLoader
plugin needs to locate a kext by name like
"com.apple.com.apple.filesystems.autofs", the Platform can quickly
look for a UUID match in those kernel debug kit directories it
previously indexed.

I'm still working on profiling the performance impact of the inital
kext bundle scan; there will likely need to be a switch to enable
or disable this plugin's scan.

This only affects Mac kernel debugging and the code is only built
on Apple systems because of some use of low-level CoreFoundation
to parse plists.

<rdar://problem/13503583> 


Added:
    lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
    lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h
Modified:
    lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
    lldb/trunk/source/Target/Platform.cpp
    lldb/trunk/source/lldb.cpp

Modified: lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp?rev=178827&r1=178826&r2=178827&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp Thu Apr  4 20:03:25 2013
@@ -457,6 +457,15 @@ DynamicLoaderDarwinKernel::DynamicLoader
     m_mutex(Mutex::eMutexTypeRecursive),
     m_break_id (LLDB_INVALID_BREAK_ID)
 {
+    PlatformSP platform_sp(Platform::FindPlugin (process, "darwin-kernel"));
+    // Only select the darwin-kernel Platform if we've been asked to load kexts.
+    // It can take some time to scan over all of the kext info.plists and that
+    // shouldn't be done if kext loading is explicitly disabled.
+    if (platform_sp.get() && GetGlobalProperties()->GetLoadKexts())
+    {
+        process->GetTarget().SetPlatform (platform_sp);
+        process->GetTarget().GetDebugger().GetPlatformList().SetSelectedPlatform (platform_sp);
+    }
 }
 
 //----------------------------------------------------------------------
@@ -797,6 +806,22 @@ DynamicLoaderDarwinKernel::KextImageInfo
                 }
             }
 
+            // If the current platform is PlatformDarwinKernel, create a ModuleSpec with the filename set 
+            // to be the bundle ID for this kext, e.g. "com.apple.filesystems.msdosfs", and ask the platform
+            // to find it.
+            PlatformSP platform_sp (target.GetPlatform());
+            if (platform_sp)
+            {
+                const char *pname = platform_sp->GetShortPluginName();
+                if (pname && strcmp (pname, "darwin-kernel") == 0)
+                {
+                    ModuleSpec kext_bundle_module_spec(module_spec);
+                    FileSpec kext_filespec(m_name.c_str(), false);
+                    kext_bundle_module_spec.GetFileSpec() = kext_filespec;
+                    platform_sp->GetSharedModule (kext_bundle_module_spec, m_module_sp, &target.GetExecutableSearchPaths(), NULL, NULL);
+                }
+            }
+
             // Ask the Target to find this file on the local system, if possible.
             // This will search in the list of currently-loaded files, look in the 
             // standard search paths on the system, and on a Mac it will try calling

Added: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp?rev=178827&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp (added)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp Thu Apr  4 20:03:25 2013
@@ -0,0 +1,533 @@
+//===-- PlatformDarwinKernel.cpp -----------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "PlatformDarwinKernel.h"
+
+#if defined (__APPLE__)  // This Plugin uses the Mac-specific source/Host/macosx/cfcpp utilities
+
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "lldb/Breakpoint/BreakpointLocation.h"
+#include "lldb/Core/ArchSpec.h"
+#include "lldb/Core/Error.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleList.h"
+#include "lldb/Core/ModuleSpec.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/StreamString.h"
+#include "lldb/Host/FileSpec.h"
+#include "lldb/Host/Host.h"
+#include "lldb/Target/Process.h"
+#include "lldb/Target/Target.h"
+
+#include <CoreFoundation/CoreFoundation.h>
+
+#include "Host/macosx/cfcpp/CFCBundle.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//------------------------------------------------------------------
+// Static Variables
+//------------------------------------------------------------------
+static uint32_t g_initialize_count = 0;
+
+//------------------------------------------------------------------
+// Static Functions
+//------------------------------------------------------------------
+void
+PlatformDarwinKernel::Initialize ()
+{
+    if (g_initialize_count++ == 0)
+    {
+        PluginManager::RegisterPlugin (PlatformDarwinKernel::GetShortPluginNameStatic(),
+                                       PlatformDarwinKernel::GetDescriptionStatic(),
+                                       PlatformDarwinKernel::CreateInstance);
+    }
+}
+
+void
+PlatformDarwinKernel::Terminate ()
+{
+    if (g_initialize_count > 0)
+    {
+        if (--g_initialize_count == 0)
+        {
+            PluginManager::UnregisterPlugin (PlatformDarwinKernel::CreateInstance);
+        }
+    }
+}
+
+Platform*
+PlatformDarwinKernel::CreateInstance (bool force, const ArchSpec *arch)
+{
+    // This is a special plugin that we don't want to activate just based on an ArchSpec for normal
+    // userlnad debugging.  It is only useful in kernel debug sessions and the DynamicLoaderDarwinPlugin
+    // (or a user doing 'platform select') will force the creation of this Platform plugin.
+    if (force == false)
+        return NULL;
+
+    bool create = force;
+    LazyBool is_ios_debug_session = eLazyBoolCalculate;
+
+    if (create == false && arch && arch->IsValid())
+    {
+        const llvm::Triple &triple = arch->GetTriple();
+        switch (triple.getVendor())
+        {
+            case llvm::Triple::Apple:
+                create = true;
+                break;
+                
+            // Only accept "unknown" for vendor if the host is Apple and
+            // it "unknown" wasn't specified (it was just returned becasue it
+            // was NOT specified)
+            case llvm::Triple::UnknownArch:
+                create = !arch->TripleVendorWasSpecified();
+                break;
+            default:
+                break;
+        }
+        
+        if (create)
+        {
+            switch (triple.getOS())
+            {
+                case llvm::Triple::Darwin:  // Deprecated, but still support Darwin for historical reasons
+                case llvm::Triple::MacOSX:
+                    break;
+                // Only accept "vendor" for vendor if the host is Apple and
+                // it "unknown" wasn't specified (it was just returned becasue it
+                // was NOT specified)
+                case llvm::Triple::UnknownOS:
+                    create = !arch->TripleOSWasSpecified();
+                    break;
+                default:
+                    create = false;
+                    break;
+            }
+        }
+    }
+    if (arch && arch->IsValid())
+    {
+        switch (arch->GetMachine())
+        {
+        case llvm::Triple::x86:
+        case llvm::Triple::x86_64:
+        case llvm::Triple::ppc:
+        case llvm::Triple::ppc64:
+            is_ios_debug_session = eLazyBoolNo;
+            break;
+        case llvm::Triple::arm:
+        case llvm::Triple::thumb:
+            is_ios_debug_session = eLazyBoolYes;
+            break;
+        default:
+            is_ios_debug_session = eLazyBoolCalculate;
+            break;
+        }
+    }
+    if (create)
+        return new PlatformDarwinKernel (is_ios_debug_session);
+    return NULL;
+}
+
+
+const char *
+PlatformDarwinKernel::GetPluginNameStatic ()
+{
+    return "PlatformDarwinKernel";
+}
+
+const char *
+PlatformDarwinKernel::GetShortPluginNameStatic()
+{
+    return "darwin-kernel";
+}
+
+const char *
+PlatformDarwinKernel::GetDescriptionStatic()
+{
+    return "Darwin Kernel platform plug-in.";
+}
+
+
+//------------------------------------------------------------------
+/// Default Constructor
+//------------------------------------------------------------------
+PlatformDarwinKernel::PlatformDarwinKernel (lldb_private::LazyBool is_ios_debug_session) :
+    PlatformDarwin (false),    // This is a remote platform
+    m_name_to_kext_path_map(),
+    m_directories_searched(),
+    m_ios_debug_session(is_ios_debug_session)
+
+{
+    SearchForKexts ();
+}
+
+//------------------------------------------------------------------
+/// Destructor.
+///
+/// The destructor is virtual since this class is designed to be
+/// inherited from by the plug-in instance.
+//------------------------------------------------------------------
+PlatformDarwinKernel::~PlatformDarwinKernel()
+{
+}
+
+
+void
+PlatformDarwinKernel::GetStatus (Stream &strm)
+{
+    Platform::GetStatus (strm);
+    strm.Printf (" Debug session type: ");
+    if (m_ios_debug_session == eLazyBoolYes)
+        strm.Printf ("iOS kernel debugging\n");
+    else if (m_ios_debug_session == eLazyBoolNo)
+        strm.Printf ("Mac OS X kernel debugging\n");
+    else
+            strm.Printf ("unknown kernel debugging\n");
+    const uint32_t num_kdk_dirs = m_directories_searched.size();
+    for (uint32_t i=0; i<num_kdk_dirs; ++i)
+    {
+        const FileSpec &kdk_dir = m_directories_searched[i];
+
+        strm.Printf (" KDK Roots: [%2u] \"%s/%s\"\n",
+                     i,
+                     kdk_dir.GetDirectory().GetCString(),
+                     kdk_dir.GetFilename().GetCString());
+    }
+    strm.Printf (" Total number of kexts indexed: %d\n", (int) m_name_to_kext_path_map.size());
+}
+
+void
+PlatformDarwinKernel::SearchForKexts ()
+{
+    // Differentiate between "ios debug session" and "mac debug session" so we don't index
+    // kext bundles that won't be used in this debug session.  If this is an ios kext debug
+    // session, looking in /System/Library/Extensions is a waste of stat()s, for example.
+
+    // Build up a list of all SDKs we'll be searching for directories of kexts
+    // e.g. /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.Internal.sdk
+    std::vector<FileSpec> sdk_dirs;
+    if (m_ios_debug_session != eLazyBoolNo)
+        GetiOSSDKDirectoriesToSearch (sdk_dirs);
+    if (m_ios_debug_session != eLazyBoolYes)
+        GetMacSDKDirectoriesToSearch (sdk_dirs);
+
+    GetGenericSDKDirectoriesToSearch (sdk_dirs);
+
+    // Build up a list of directories that hold kext bundles on the system
+    // e.g. /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.Internal.sdk/System/Library/Extensions
+    std::vector<FileSpec> kext_dirs;
+    SearchSDKsForKextDirectories (sdk_dirs, kext_dirs);
+
+    if (m_ios_debug_session != eLazyBoolNo)
+        GetiOSDirectoriesToSearch (kext_dirs);
+    if (m_ios_debug_session != eLazyBoolYes)
+        GetMacDirectoriesToSearch (kext_dirs);
+
+    GetGenericDirectoriesToSearch (kext_dirs);
+
+    // We now have a complete list of directories that we will search for kext bundles
+    m_directories_searched = kext_dirs;
+
+    IndexKextsInDirectories (kext_dirs);
+}
+
+void
+PlatformDarwinKernel::GetiOSSDKDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories)
+{
+    // DeveloperDirectory is something like "/Applications/Xcode.app/Contents/Developer"
+    const char *developer_dir = GetDeveloperDirectory();
+    if (developer_dir == NULL)
+        developer_dir = "/Applications/Xcode.app/Contents/Developer";
+
+    char pathbuf[PATH_MAX];
+    ::snprintf (pathbuf, sizeof (pathbuf), "%s/Platforms/iPhoneOS.platform/Developer/SDKs", developer_dir);
+    FileSpec ios_sdk(pathbuf, true);
+    if (ios_sdk.Exists() && ios_sdk.GetFileType() == FileSpec::eFileTypeDirectory)
+    {
+        directories.push_back (ios_sdk);
+    }
+}
+
+void
+PlatformDarwinKernel::GetMacSDKDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories)
+{
+    // DeveloperDirectory is something like "/Applications/Xcode.app/Contents/Developer"
+    const char *developer_dir = GetDeveloperDirectory();
+    if (developer_dir == NULL)
+        developer_dir = "/Applications/Xcode.app/Contents/Developer";
+
+    char pathbuf[PATH_MAX];
+    ::snprintf (pathbuf, sizeof (pathbuf), "%s/Platforms/MacOSX.platform/Developer/SDKs", developer_dir);
+    FileSpec mac_sdk(pathbuf, true);
+    if (mac_sdk.Exists() && mac_sdk.GetFileType() == FileSpec::eFileTypeDirectory)
+    {
+        directories.push_back (mac_sdk);
+    }
+}
+
+void
+PlatformDarwinKernel::GetGenericSDKDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories)
+{
+    FileSpec generic_sdk("/AppleInternal/Developer/KDKs", true);
+    if (generic_sdk.Exists() && generic_sdk.GetFileType() == FileSpec::eFileTypeDirectory)
+    {
+        directories.push_back (generic_sdk);
+    }
+}
+
+void
+PlatformDarwinKernel::GetiOSDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories)
+{
+}
+
+void
+PlatformDarwinKernel::GetMacDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories)
+{
+    FileSpec sle("/System/Library/Extensions", true);
+    if (sle.Exists() && sle.GetFileType() == FileSpec::eFileTypeDirectory)
+    {
+        directories.push_back(sle);
+    }
+}
+
+void
+PlatformDarwinKernel::GetGenericDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories)
+{
+    // DeveloperDirectory is something like "/Applications/Xcode.app/Contents/Developer"
+    const char *developer_dir = GetDeveloperDirectory();
+    if (developer_dir == NULL)
+        developer_dir = "/Applications/Xcode.app/Contents/Developer";
+
+    char pathbuf[PATH_MAX];
+    ::snprintf (pathbuf, sizeof (pathbuf), "%s/../Symbols", developer_dir);
+    FileSpec symbols_dir (pathbuf, true);
+    if (symbols_dir.Exists() && symbols_dir.GetFileType() == FileSpec::eFileTypeDirectory)
+    {
+        directories.push_back (symbols_dir);
+    }
+}
+
+// Scan through the SDK directories, looking for directories where kexts are likely.
+// Add those directories to kext_dirs.
+void
+PlatformDarwinKernel::SearchSDKsForKextDirectories (std::vector<lldb_private::FileSpec> sdk_dirs, std::vector<lldb_private::FileSpec> &kext_dirs)
+{
+    const uint32_t num_sdks = sdk_dirs.size();
+    for (uint32_t i = 0; i < num_sdks; i++)
+    {
+        const FileSpec &sdk_dir = sdk_dirs[i];
+        char pathbuf[PATH_MAX];
+        if (sdk_dir.GetPath (pathbuf, sizeof (pathbuf)))
+        {
+            const bool find_directories = true;
+            const bool find_files = false;
+            const bool find_other = false;
+            FileSpec::EnumerateDirectory (pathbuf,
+                                          find_directories,
+                                          find_files,
+                                          find_other,
+                                          GetKextDirectoriesInSDK,
+                                          &kext_dirs);
+        }
+    }
+}
+
+// Callback for FileSpec::EnumerateDirectory().  
+// Step through the entries in a directory like
+//    /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
+// looking for any subdirectories of the form MacOSX10.8.Internal.sdk/System/Library/Extensions
+// Adds these to the vector of FileSpec's.
+
+FileSpec::EnumerateDirectoryResult
+PlatformDarwinKernel::GetKextDirectoriesInSDK (void *baton,
+                                               FileSpec::FileType file_type,
+                                               const FileSpec &file_spec)
+{
+    if (file_type == FileSpec::eFileTypeDirectory 
+        && (file_spec.GetFileNameExtension() == ConstString("sdk")
+            || file_spec.GetFileNameExtension() == ConstString("kdk")))
+    {
+        char pathbuf[PATH_MAX];
+        if (file_spec.GetPath (pathbuf, PATH_MAX))
+        {
+            char kext_directory_str[PATH_MAX];
+            ::snprintf (kext_directory_str, sizeof (kext_directory_str), "%s/%s", pathbuf, "System/Library/Extensions");
+            FileSpec kext_directory (kext_directory_str, true);
+            if (kext_directory.Exists() && kext_directory.GetFileType() == FileSpec::eFileTypeDirectory)
+            {
+                ((std::vector<lldb_private::FileSpec> *)baton)->push_back(kext_directory);
+            }
+        }
+    }
+    return FileSpec::eEnumerateDirectoryResultNext;
+}
+
+void
+PlatformDarwinKernel::IndexKextsInDirectories (std::vector<lldb_private::FileSpec> kext_dirs)
+{
+    std::vector<FileSpec> kext_bundles;
+    const uint32_t num_dirs = kext_dirs.size();
+    for (uint32_t i = 0; i < num_dirs; i++)
+    {
+        const FileSpec &dir = kext_dirs[i];
+        char pathbuf[PATH_MAX];
+        if (dir.GetPath (pathbuf, sizeof(pathbuf)))
+        {
+            const bool find_directories = true;
+            const bool find_files = false;
+            const bool find_other = false;
+            FileSpec::EnumerateDirectory (pathbuf,
+                                          find_directories,
+                                          find_files,
+                                          find_other,
+                                          GetKextsInDirectory,
+                                          &kext_bundles);
+        }
+    }
+
+    const uint32_t num_kexts = kext_bundles.size();
+    for (uint32_t i = 0; i < num_kexts; i++)
+    {
+        const FileSpec &kext = kext_bundles[i];
+        char pathbuf[PATH_MAX];
+        if (kext.GetPath (pathbuf, sizeof (pathbuf)))
+        {
+            CFCBundle bundle (pathbuf);
+            CFStringRef bundle_id (bundle.GetIdentifier());
+            if (bundle_id && CFGetTypeID (bundle_id) == CFStringGetTypeID ())
+            {
+                char bundle_id_buf[PATH_MAX];
+                if (CFStringGetCString (bundle_id, bundle_id_buf, sizeof (bundle_id_buf), kCFStringEncodingUTF8))
+                {
+                    ConstString bundle_conststr(bundle_id_buf);
+                    m_name_to_kext_path_map.insert(std::pair<ConstString, FileSpec>(bundle_conststr, kext));
+                }
+            }
+        }
+    }
+}
+
+// Callback for FileSpec::EnumerateDirectory().
+// Step through the entries in a directory like /System/Library/Extensions, find .kext bundles, add them
+// to the vector of FileSpecs.
+// If a .kext bundle has a Contents/PlugIns or PlugIns subdir, search for kexts in there too.
+
+FileSpec::EnumerateDirectoryResult
+PlatformDarwinKernel::GetKextsInDirectory (void *baton,
+                                           FileSpec::FileType file_type,
+                                           const FileSpec &file_spec)
+{
+    if (file_type == FileSpec::eFileTypeDirectory && file_spec.GetFileNameExtension() == ConstString("kext"))
+    {
+        ((std::vector<lldb_private::FileSpec> *)baton)->push_back(file_spec);
+        bool search_inside = false;
+        char pathbuf[PATH_MAX];
+        ::snprintf (pathbuf, sizeof (pathbuf), "%s/%s/Contents/PlugIns", file_spec.GetDirectory().GetCString(), file_spec.GetFilename().GetCString());
+        FileSpec contents_plugins (pathbuf, false);
+        if (contents_plugins.Exists() && contents_plugins.GetFileType() == FileSpec::eFileTypeDirectory)
+        {
+            search_inside = true;
+        }
+        else
+        {
+            ::snprintf (pathbuf, sizeof (pathbuf), "%s/%s/PlugIns", file_spec.GetDirectory().GetCString(), file_spec.GetFilename().GetCString());
+            FileSpec plugins (pathbuf, false);
+            if (plugins.Exists() && plugins.GetFileType() == FileSpec::eFileTypeDirectory)
+            {
+                search_inside = true;
+            }
+        }
+
+        if (search_inside)
+        {
+            const bool find_directories = true;
+            const bool find_files = false;
+            const bool find_other = false;
+            FileSpec::EnumerateDirectory (pathbuf,
+                                          find_directories,
+                                          find_files,
+                                          find_other,
+                                          GetKextsInDirectory,
+                                          baton);
+        }
+    }
+    return FileSpec::eEnumerateDirectoryResultNext;
+}
+
+Error
+PlatformDarwinKernel::GetSharedModule (const ModuleSpec &module_spec,
+                                       ModuleSP &module_sp,
+                                       const FileSpecList *module_search_paths_ptr,
+                                       ModuleSP *old_module_sp_ptr,
+                                       bool *did_create_ptr)
+{
+    Error error;
+    module_sp.reset();
+    const FileSpec &platform_file = module_spec.GetFileSpec();
+    char kext_bundle_id[PATH_MAX];
+    if (platform_file.GetPath (kext_bundle_id, sizeof (kext_bundle_id)))
+    {
+        ConstString kext_bundle_cs(kext_bundle_id);
+        if (m_name_to_kext_path_map.count(kext_bundle_cs) > 0)
+        {
+            for (BundleIDToKextIterator it = m_name_to_kext_path_map.begin (); it != m_name_to_kext_path_map.end (); ++it)
+            {
+                if (it->first == kext_bundle_cs)
+                {
+                    error = ExamineKextForMatchingUUID (it->second, module_spec.GetUUID(), module_sp);
+                    if (module_sp.get())
+                    {
+                        return error;
+                    }
+                }
+            }
+        }
+    }
+
+    return error;
+}
+
+Error
+PlatformDarwinKernel::ExamineKextForMatchingUUID (const FileSpec &kext_bundle_path, const lldb_private::UUID &uuid, ModuleSP &exe_module_sp)
+{
+    Error error;
+    FileSpec exe_file = kext_bundle_path;
+    Host::ResolveExecutableInBundle (exe_file);
+    if (exe_file.Exists())
+    {
+        ModuleSpec exe_spec (exe_file);
+        exe_spec.GetUUID() = uuid;
+        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();
+    }
+    return error;
+}
+
+bool
+PlatformDarwinKernel::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch)
+{
+#if defined (__arm__)
+    return ARMGetSupportedArchitectureAtIndex (idx, arch);
+#else
+    return x86GetSupportedArchitectureAtIndex (idx, arch);
+#endif
+}
+
+#endif // __APPLE__

Added: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h?rev=178827&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h (added)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h Thu Apr  4 20:03:25 2013
@@ -0,0 +1,176 @@
+//===-- PlatformDarwinKernel.h ----------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_PlatformDarwinKernel_h_
+#define liblldb_PlatformDarwinKernel_h_
+
+#if defined (__APPLE__)  // This Plugin uses the Mac-specific source/Host/macosx/cfcpp utilities
+
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+#include "lldb/Host/FileSpec.h"
+
+// Project includes
+#include "PlatformDarwin.h"
+
+class PlatformDarwinKernel : public PlatformDarwin
+{
+public:
+
+    //------------------------------------------------------------
+    // Class Functions
+    //------------------------------------------------------------
+    static lldb_private::Platform*
+    CreateInstance (bool force, const lldb_private::ArchSpec *arch);
+
+    static void
+    Initialize ();
+
+    static void
+    Terminate ();
+
+    static const char *
+    GetPluginNameStatic ();
+
+    static const char *
+    GetShortPluginNameStatic();
+
+    static const char *
+    GetDescriptionStatic();
+
+    //------------------------------------------------------------
+    // Class Methods
+    //------------------------------------------------------------
+    PlatformDarwinKernel (lldb_private::LazyBool is_ios_debug_session);
+
+    virtual
+    ~PlatformDarwinKernel();
+
+    //------------------------------------------------------------
+    // lldb_private::PluginInterface functions
+    //------------------------------------------------------------
+    virtual const char *
+    GetPluginName()
+    {
+        return GetPluginNameStatic();
+    }
+
+    virtual const char *
+    GetShortPluginName()
+    {
+        return GetShortPluginNameStatic();
+    }
+
+    virtual uint32_t
+    GetPluginVersion()
+    {
+        return 1;
+    }
+
+    //------------------------------------------------------------
+    // lldb_private::Platform functions
+    //------------------------------------------------------------
+    virtual const char *
+    GetDescription ()
+    {
+        return GetDescriptionStatic();
+    }
+
+    virtual void
+    GetStatus (lldb_private::Stream &strm);
+
+    virtual lldb_private::Error
+    GetSharedModule (const lldb_private::ModuleSpec &module_spec,
+                     lldb::ModuleSP &module_sp,
+                     const lldb_private::FileSpecList *module_search_paths_ptr,
+                     lldb::ModuleSP *old_module_sp_ptr,
+                     bool *did_create_ptr);
+
+    virtual bool
+    GetSupportedArchitectureAtIndex (uint32_t idx, 
+                                     lldb_private::ArchSpec &arch);
+
+protected:
+
+    // Map from kext bundle ID ("com.apple.filesystems.exfat") to FileSpec for the kext bundle on 
+    // the host ("/System/Library/Extensions/exfat.kext/Contents/Info.plist").
+    typedef std::multimap<lldb_private::ConstString, lldb_private::FileSpec> BundleIDToKextMap;
+    typedef BundleIDToKextMap::iterator BundleIDToKextIterator;
+
+    
+    // Array of directories that were searched for kext bundles (used only for reporting to user)
+    typedef std::vector<lldb_private::FileSpec> DirectoriesSearchedCollection;
+    typedef DirectoriesSearchedCollection::iterator DirectoriesSearchedIterator;
+
+
+    static lldb_private::FileSpec::EnumerateDirectoryResult
+    GetKextDirectoriesInSDK (void *baton,
+                             lldb_private::FileSpec::FileType file_type,
+                             const lldb_private::FileSpec &file_spec);
+
+    static lldb_private::FileSpec::EnumerateDirectoryResult 
+    GetKextsInDirectory (void *baton,
+                         lldb_private::FileSpec::FileType file_type,
+                         const lldb_private::FileSpec &file_spec);
+
+    void
+    SearchForKexts();
+
+    // Directories where we may find iOS SDKs with kext bundles in them
+    void
+    GetiOSSDKDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories);
+
+    // Directories where we may find Mac OS X SDKs with kext bundles in them
+    void
+    GetMacSDKDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories);
+
+    // Directories where we may find Mac OS X or iOS SDKs with kext bundles in them
+    void
+    GetGenericSDKDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories);
+
+    // Directories where we may find iOS kext bundles
+    void
+    GetiOSDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories);
+
+    // Directories where we may find MacOSX kext bundles
+    void
+    GetMacDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories);
+
+    // Directories where we may find iOS or MacOSX kext bundles
+    void
+    GetGenericDirectoriesToSearch (std::vector<lldb_private::FileSpec> &directories);
+
+    // Search through a vector of SDK FileSpecs, add any directories that may contain kexts
+    // to the vector of kext dir FileSpecs
+    void
+    SearchSDKsForKextDirectories (std::vector<lldb_private::FileSpec> sdk_dirs, std::vector<lldb_private::FileSpec> &kext_dirs);
+
+    // Search through all of the directories passed in, find all .kext bundles in those directories,
+    // get the CFBundleIDs out of the Info.plists and add the bundle ID and kext path to m_name_to_kext_path_map.
+    void
+    IndexKextsInDirectories (std::vector<lldb_private::FileSpec> kext_dirs);
+
+    lldb_private::Error
+    ExamineKextForMatchingUUID (const lldb_private::FileSpec &kext_bundle_path, const lldb_private::UUID &uuid, lldb::ModuleSP &exe_module_sp);
+
+private:
+
+    BundleIDToKextMap m_name_to_kext_path_map; 
+    DirectoriesSearchedCollection m_directories_searched;
+    lldb_private::LazyBool m_ios_debug_session;
+
+    DISALLOW_COPY_AND_ASSIGN (PlatformDarwinKernel);
+
+};
+
+#endif // __APPLE__
+
+#endif  // liblldb_PlatformDarwinKernel_h_

Modified: lldb/trunk/source/Target/Platform.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Platform.cpp?rev=178827&r1=178826&r2=178827&view=diff
==============================================================================
--- lldb/trunk/source/Target/Platform.cpp (original)
+++ lldb/trunk/source/Target/Platform.cpp Thu Apr  4 20:03:25 2013
@@ -95,6 +95,37 @@ Platform::LocateExecutableScriptingResou
     return FileSpecList();
 }
 
+Platform*
+Platform::FindPlugin (Process *process, const char *plugin_name)
+{
+    PlatformCreateInstance create_callback = NULL;
+    if (plugin_name)
+    {
+        create_callback  = PluginManager::GetPlatformCreateCallbackForPluginName (plugin_name);
+        if (create_callback)
+        {
+            ArchSpec arch;
+            if (process)
+            {
+                arch = process->GetTarget().GetArchitecture();
+            }
+            std::auto_ptr<Platform> instance_ap(create_callback(process, &arch));
+            if (instance_ap.get())
+                return instance_ap.release();
+        }
+    }
+    else
+    {
+        for (uint32_t idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex(idx)) != NULL; ++idx)
+        {
+            std::auto_ptr<Platform> instance_ap(create_callback(process, false));
+            if (instance_ap.get())
+                return instance_ap.release();
+        }
+    }
+    return NULL;
+}
+
 Error
 Platform::GetSharedModule (const ModuleSpec &module_spec,
                            ModuleSP &module_sp,

Modified: lldb/trunk/source/lldb.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/lldb.cpp?rev=178827&r1=178826&r2=178827&view=diff
==============================================================================
--- lldb/trunk/source/lldb.cpp (original)
+++ lldb/trunk/source/lldb.cpp Thu Apr  4 20:03:25 2013
@@ -56,6 +56,7 @@
 #include "Plugins/Process/MacOSX-Kernel/ProcessKDP.h"
 #include "Plugins/Platform/MacOSX/PlatformMacOSX.h"
 #include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h"
+#include "Plugins/Platform/MacOSX/PlatformDarwinKernel.h"
 #include "Plugins/Platform/MacOSX/PlatformiOSSimulator.h"
 #endif
 
@@ -127,6 +128,7 @@ lldb_private::Initialize ()
         ProcessKDP::Initialize();
         ProcessMachCore::Initialize();
         SymbolVendorMacOSX::Initialize();
+        PlatformDarwinKernel::Initialize();
         PlatformRemoteiOS::Initialize();
         PlatformMacOSX::Initialize();
         PlatformiOSSimulator::Initialize();
@@ -204,6 +206,7 @@ lldb_private::Terminate ()
     ProcessKDP::Terminate();
     SymbolVendorMacOSX::Terminate();
     PlatformMacOSX::Terminate();
+    PlatformDarwinKernel::Terminate();
     PlatformRemoteiOS::Terminate();
     PlatformiOSSimulator::Terminate();
 #endif





More information about the lldb-commits mailing list