<rdar://problem/11757916>

Make breakpoint setting by file and line much more efficient by only looking for inlined breakpoint locations if we are setting a breakpoint in anything but a source implementation file. Implementing this complex for a many reasons. Turns out that parsing compile units lazily had some issues with respect to how we need to do things with DWARF in .o files. So the fixes in the checkin for this makes these changes:
- Add a new setting called "target.inline-breakpoint-strategy" which can be set to "never", "always", or "headers". "never" will never try and set any inlined breakpoints (fastest). "always" always looks for inlined breakpoint locations (slowest, but most accurate). "headers", which is the default setting, will only look for inlined breakpoint locations if the breakpoint is set in what are consudered to be header files, which is realy defined as "not in an implementation source file". 
- modify the breakpoint setting by file and line to check the current "target.inline-breakpoint-strategy" setting and act accordingly
- Modify compile units to be able to get their language and other info lazily. This allows us to create compile units from the debug map and not have to fill all of the details in, and then lazily discover this information as we go on debuggging. This is needed to avoid parsing all .o files when setting breakpoints in implementation only files (no inlines). Otherwise we would need to parse the .o file, the object file (mach-o in our case) and the symbol file (DWARF in the object file) just to see what the compile unit was.
- modify the "SymbolFileDWARFDebugMap" to subclass lldb_private::Module so that the virtual "GetObjectFile()" and "GetSymbolVendor()" functions can be intercepted when the .o file contenst are later lazilly needed. Prior to this fix, when we first instantiated the "SymbolFileDWARFDebugMap" class, we would also make modules, object files and symbol files for every .o file in the debug map because we needed to fix up the sections in the .o files with information that is in the executable debug map. Now we lazily do this in the DebugMapModule::GetObjectFile()

Cleaned up header includes a bit as well.



git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@162860 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/examples/python/crashlog.py b/examples/python/crashlog.py
index 2700cd8..752700f 100755
--- a/examples/python/crashlog.py
+++ b/examples/python/crashlog.py
@@ -587,6 +587,14 @@
         print 'error: no images in crash log'
         return
 
+    if options.dump_image_list:
+        print "Binary Images:"
+        for image in crash_log.images:
+            if options.verbose:
+                print image.debug_dump()
+            else:
+                print image
+
     target = crash_log.create_target ()
     if not target:
         return
@@ -678,11 +686,6 @@
                 print frame
         print                
 
-    if options.dump_image_list:
-        print "Binary Images:"
-        for image in crash_log.images:
-            print image
-
 def CreateSymbolicateCrashLogOptions(command_name, description, add_interactive_options):
     usage = "usage: %prog [options] <FILE> [FILE ...]"
     option_parser = optparse.OptionParser(description=description, prog='crashlog',usage=usage)
diff --git a/examples/python/symbolication.py b/examples/python/symbolication.py
index 3ac6acc..fd4e500 100755
--- a/examples/python/symbolication.py
+++ b/examples/python/symbolication.py
@@ -214,7 +214,21 @@
     
     def dump(self, prefix):
         print "%s%s" % (prefix, self)
-    
+
+    def debug_dump(self):
+        print 'path = "%s"' % (self.path)
+        print 'resolved_path = "%s"' % (self.resolved_path)
+        print 'resolved = %i' % (self.resolved)
+        print 'unavailable = %i' % (self.unavailable)
+        print 'uuid = %s' % (self.uuid)
+        print 'section_infos = %s' % (self.section_infos)
+        print 'identifier = "%s"' % (self.identifier)
+        print 'version = %s' % (self.version)
+        print 'arch = %s' % (self.arch)
+        print 'module = %s' % (self.module)
+        print 'symfile = "%s"' % (self.symfile)
+        print 'slide = %i (0x%x)' % (self.slide, self.slide)
+        
     def __str__(self):
         s = "%s %s %s" % (self.get_uuid(), self.version, self.get_resolved_path())
         for section_info in self.section_infos:
diff --git a/include/lldb/Core/FileLineResolver.h b/include/lldb/Core/FileLineResolver.h
index 50b9fb3..e1928f1 100644
--- a/include/lldb/Core/FileLineResolver.h
+++ b/include/lldb/Core/FileLineResolver.h
@@ -12,6 +12,7 @@
 
 // Project includes
 #include "lldb/Core/AddressResolver.h"
+#include "lldb/Symbol/SymbolContext.h"
 
 namespace lldb_private {
 
diff --git a/include/lldb/Core/Language.h b/include/lldb/Core/Language.h
index 711fc63..670c6aa 100644
--- a/include/lldb/Core/Language.h
+++ b/include/lldb/Core/Language.h
@@ -74,7 +74,7 @@
     ///     The enumeration value that describes the programming
     ///     language that an object is associated with.
     //------------------------------------------------------------------
-    lldb::LanguageType
+    virtual lldb::LanguageType
     GetLanguage() const;
 
     //------------------------------------------------------------------
diff --git a/include/lldb/Core/Module.h b/include/lldb/Core/Module.h
index c2f4775..9059435 100644
--- a/include/lldb/Core/Module.h
+++ b/include/lldb/Core/Module.h
@@ -11,270 +11,16 @@
 #define liblldb_Module_h_
 
 #include "lldb/Core/ArchSpec.h"
-#include "lldb/Core/Section.h"
 #include "lldb/Core/UUID.h"
-#include "lldb/Symbol/ObjectFile.h"
+#include "lldb/Host/FileSpec.h"
 #include "lldb/Host/Mutex.h"
 #include "lldb/Host/TimeValue.h"
 #include "lldb/Symbol/ClangASTContext.h"
-#include "lldb/Symbol/CompileUnit.h"
-#include "lldb/Symbol/SymbolContext.h"
-#include "lldb/Symbol/Symtab.h"
-#include "lldb/Symbol/TypeList.h"
+#include "lldb/Symbol/SymbolContextScope.h"
 #include "lldb/Target/PathMappingList.h"
 
-
 namespace lldb_private {
 
-class ModuleSpec
-{
-public:
-    ModuleSpec () :
-        m_file (),
-        m_platform_file (),
-        m_symbol_file (),
-        m_arch (),
-        m_uuid (),
-        m_object_name (),
-        m_object_offset (0),
-        m_source_mappings ()
-    {
-    }
-
-    ModuleSpec (const FileSpec &file_spec) :
-        m_file (file_spec),
-        m_platform_file (),
-        m_symbol_file (),
-        m_arch (),
-        m_uuid (),
-        m_object_name (),
-        m_object_offset (0),
-        m_source_mappings ()
-    {
-    }
-
-    ModuleSpec (const FileSpec &file_spec, const ArchSpec &arch) :
-        m_file (file_spec),
-        m_platform_file (),
-        m_symbol_file (),
-        m_arch (arch),
-        m_uuid (),
-        m_object_name (),
-        m_object_offset (0),
-        m_source_mappings ()
-    {
-    }
-    
-    ModuleSpec (const ModuleSpec &rhs) :
-        m_file (rhs.m_file),
-        m_platform_file (rhs.m_platform_file),
-        m_symbol_file (rhs.m_symbol_file),
-        m_arch (rhs.m_arch),
-        m_uuid (rhs.m_uuid),
-        m_object_name (rhs.m_object_name),
-        m_object_offset (rhs.m_object_offset),
-        m_source_mappings (rhs.m_source_mappings)
-    {
-    }
-
-    ModuleSpec &
-    operator = (const ModuleSpec &rhs)
-    {
-        if (this != &rhs)
-        {
-            m_file = rhs.m_file;
-            m_platform_file = rhs.m_platform_file;
-            m_symbol_file = rhs.m_symbol_file;
-            m_arch = rhs.m_arch;
-            m_uuid = rhs.m_uuid;
-            m_object_name = rhs.m_object_name;
-            m_object_offset = rhs.m_object_offset;
-            m_source_mappings = rhs.m_source_mappings;
-        }
-        return *this;
-    }
-
-    FileSpec *
-    GetFileSpecPtr ()
-    {
-        if (m_file)
-            return &m_file;
-        return NULL;
-    }
-
-    const FileSpec *
-    GetFileSpecPtr () const
-    {
-        if (m_file)
-            return &m_file;
-        return NULL;
-    }
-    
-    FileSpec &
-    GetFileSpec ()
-    {
-        return m_file;
-    }
-    const FileSpec &
-    GetFileSpec () const
-    {
-        return m_file;
-    }
-
-    FileSpec *
-    GetPlatformFileSpecPtr ()
-    {
-        if (m_platform_file)
-            return &m_platform_file;
-        return NULL;
-    }
-
-    const FileSpec *
-    GetPlatformFileSpecPtr () const
-    {
-        if (m_platform_file)
-            return &m_platform_file;
-        return NULL;
-    }
-
-    FileSpec &
-    GetPlatformFileSpec ()
-    {
-        return m_platform_file;
-    }
-
-    const FileSpec &
-    GetPlatformFileSpec () const
-    {
-        return m_platform_file;
-    }
-
-    FileSpec *
-    GetSymbolFileSpecPtr ()
-    {
-        if (m_symbol_file)
-            return &m_symbol_file;
-        return NULL;
-    }
-    
-    const FileSpec *
-    GetSymbolFileSpecPtr () const
-    {
-        if (m_symbol_file)
-            return &m_symbol_file;
-        return NULL;
-    }
-    
-    FileSpec &
-    GetSymbolFileSpec ()
-    {
-        return m_symbol_file;
-    }
-    
-    const FileSpec &
-    GetSymbolFileSpec () const
-    {
-        return m_symbol_file;
-    }
-
-    
-    ArchSpec *
-    GetArchitecturePtr ()
-    {
-        if (m_arch.IsValid())
-            return &m_arch;
-        return NULL;
-    }
-    
-    const ArchSpec *
-    GetArchitecturePtr () const
-    {
-        if (m_arch.IsValid())
-            return &m_arch;
-        return NULL;
-    }
-    
-    ArchSpec &
-    GetArchitecture ()
-    {
-        return m_arch;
-    }
-    
-    const ArchSpec &
-    GetArchitecture () const
-    {
-        return m_arch;
-    }
-
-    UUID *
-    GetUUIDPtr ()
-    {
-        if (m_uuid.IsValid())
-            return &m_uuid;
-        return NULL;
-    }
-    
-    const UUID *
-    GetUUIDPtr () const
-    {
-        if (m_uuid.IsValid())
-            return &m_uuid;
-        return NULL;
-    }
-    
-    UUID &
-    GetUUID ()
-    {
-        return m_uuid;
-    }
-    
-    const UUID &
-    GetUUID () const
-    {
-        return m_uuid;
-    }
-
-    ConstString &
-    GetObjectName ()
-    {
-        return m_object_name;
-    }
-
-    const ConstString &
-    GetObjectName () const
-    {
-        return m_object_name;
-    }
-
-    uint64_t
-    GetObjectOffset () const
-    {
-        return m_object_offset;
-    }
-
-    void
-    SetObjectOffset (uint64_t object_offset)
-    {
-        m_object_offset = object_offset;
-    }
-
-    PathMappingList &
-    GetSourceMappingList () const
-    {
-        return m_source_mappings;
-    }
-
-protected:
-    FileSpec m_file;
-    FileSpec m_platform_file;
-    FileSpec m_symbol_file;
-    ArchSpec m_arch;
-    UUID m_uuid;
-    ConstString m_object_name;
-    uint64_t m_object_offset;
-    mutable PathMappingList m_source_mappings;
-};
-
 //----------------------------------------------------------------------
 /// @class Module Module.h "lldb/Core/Module.h"
 /// @brief A class that describes an executable image and its associated
@@ -299,9 +45,6 @@
     public SymbolContextScope
 {
 public:
-    friend class ModuleList;
-    friend bool ObjectFile::SetModulesArchitecture (const ArchSpec &new_arch);
-
 	// Static functions that can track the lifetime of moodule objects.
 	// This is handy because we might have Module objects that are in
 	// shared pointers that aren't in the global module list (from 
@@ -826,7 +569,7 @@
     ///     returned. The returned pointer is owned by this object and
     ///     remains valid as long as the object is around.
     //------------------------------------------------------------------
-    ObjectFile *
+    virtual ObjectFile *
     GetObjectFile ();
 
     // Load an object file from memory.
@@ -848,7 +591,7 @@
     ///     will be returned. The returned pointer is owned by this
     ///     object and remains valid as long as the object is around.
     //------------------------------------------------------------------
-    SymbolVendor*
+    virtual SymbolVendor*
     GetSymbolVendor(bool can_create = true);
 
     //------------------------------------------------------------------
@@ -1179,6 +922,10 @@
     bool
     SetArchitecture (const ArchSpec &new_arch);
     
+    
+    friend class ModuleList;
+    friend class ObjectFile;
+
 private:
 
     uint32_t
diff --git a/include/lldb/Core/ModuleSpec.h b/include/lldb/Core/ModuleSpec.h
new file mode 100644
index 0000000..9446c76
--- /dev/null
+++ b/include/lldb/Core/ModuleSpec.h
@@ -0,0 +1,271 @@
+//===-- ModuleSpec.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_ModuleSpec_h_
+#define liblldb_ModuleSpec_h_
+
+#include "lldb/Core/ArchSpec.h"
+#include "lldb/Core/UUID.h"
+#include "lldb/Host/FileSpec.h"
+#include "lldb/Target/PathMappingList.h"
+
+namespace lldb_private {
+
+class ModuleSpec
+{
+public:
+    ModuleSpec () :
+        m_file (),
+        m_platform_file (),
+        m_symbol_file (),
+        m_arch (),
+        m_uuid (),
+        m_object_name (),
+        m_object_offset (0),
+        m_source_mappings ()
+    {
+    }
+
+    ModuleSpec (const FileSpec &file_spec) :
+        m_file (file_spec),
+        m_platform_file (),
+        m_symbol_file (),
+        m_arch (),
+        m_uuid (),
+        m_object_name (),
+        m_object_offset (0),
+        m_source_mappings ()
+    {
+    }
+
+    ModuleSpec (const FileSpec &file_spec, const ArchSpec &arch) :
+        m_file (file_spec),
+        m_platform_file (),
+        m_symbol_file (),
+        m_arch (arch),
+        m_uuid (),
+        m_object_name (),
+        m_object_offset (0),
+        m_source_mappings ()
+    {
+    }
+    
+    ModuleSpec (const ModuleSpec &rhs) :
+        m_file (rhs.m_file),
+        m_platform_file (rhs.m_platform_file),
+        m_symbol_file (rhs.m_symbol_file),
+        m_arch (rhs.m_arch),
+        m_uuid (rhs.m_uuid),
+        m_object_name (rhs.m_object_name),
+        m_object_offset (rhs.m_object_offset),
+        m_source_mappings (rhs.m_source_mappings)
+    {
+    }
+
+    ModuleSpec &
+    operator = (const ModuleSpec &rhs)
+    {
+        if (this != &rhs)
+        {
+            m_file = rhs.m_file;
+            m_platform_file = rhs.m_platform_file;
+            m_symbol_file = rhs.m_symbol_file;
+            m_arch = rhs.m_arch;
+            m_uuid = rhs.m_uuid;
+            m_object_name = rhs.m_object_name;
+            m_object_offset = rhs.m_object_offset;
+            m_source_mappings = rhs.m_source_mappings;
+        }
+        return *this;
+    }
+
+    FileSpec *
+    GetFileSpecPtr ()
+    {
+        if (m_file)
+            return &m_file;
+        return NULL;
+    }
+
+    const FileSpec *
+    GetFileSpecPtr () const
+    {
+        if (m_file)
+            return &m_file;
+        return NULL;
+    }
+    
+    FileSpec &
+    GetFileSpec ()
+    {
+        return m_file;
+    }
+    const FileSpec &
+    GetFileSpec () const
+    {
+        return m_file;
+    }
+
+    FileSpec *
+    GetPlatformFileSpecPtr ()
+    {
+        if (m_platform_file)
+            return &m_platform_file;
+        return NULL;
+    }
+
+    const FileSpec *
+    GetPlatformFileSpecPtr () const
+    {
+        if (m_platform_file)
+            return &m_platform_file;
+        return NULL;
+    }
+
+    FileSpec &
+    GetPlatformFileSpec ()
+    {
+        return m_platform_file;
+    }
+
+    const FileSpec &
+    GetPlatformFileSpec () const
+    {
+        return m_platform_file;
+    }
+
+    FileSpec *
+    GetSymbolFileSpecPtr ()
+    {
+        if (m_symbol_file)
+            return &m_symbol_file;
+        return NULL;
+    }
+    
+    const FileSpec *
+    GetSymbolFileSpecPtr () const
+    {
+        if (m_symbol_file)
+            return &m_symbol_file;
+        return NULL;
+    }
+    
+    FileSpec &
+    GetSymbolFileSpec ()
+    {
+        return m_symbol_file;
+    }
+    
+    const FileSpec &
+    GetSymbolFileSpec () const
+    {
+        return m_symbol_file;
+    }
+
+    
+    ArchSpec *
+    GetArchitecturePtr ()
+    {
+        if (m_arch.IsValid())
+            return &m_arch;
+        return NULL;
+    }
+    
+    const ArchSpec *
+    GetArchitecturePtr () const
+    {
+        if (m_arch.IsValid())
+            return &m_arch;
+        return NULL;
+    }
+    
+    ArchSpec &
+    GetArchitecture ()
+    {
+        return m_arch;
+    }
+    
+    const ArchSpec &
+    GetArchitecture () const
+    {
+        return m_arch;
+    }
+
+    UUID *
+    GetUUIDPtr ()
+    {
+        if (m_uuid.IsValid())
+            return &m_uuid;
+        return NULL;
+    }
+    
+    const UUID *
+    GetUUIDPtr () const
+    {
+        if (m_uuid.IsValid())
+            return &m_uuid;
+        return NULL;
+    }
+    
+    UUID &
+    GetUUID ()
+    {
+        return m_uuid;
+    }
+    
+    const UUID &
+    GetUUID () const
+    {
+        return m_uuid;
+    }
+
+    ConstString &
+    GetObjectName ()
+    {
+        return m_object_name;
+    }
+
+    const ConstString &
+    GetObjectName () const
+    {
+        return m_object_name;
+    }
+
+    uint64_t
+    GetObjectOffset () const
+    {
+        return m_object_offset;
+    }
+
+    void
+    SetObjectOffset (uint64_t object_offset)
+    {
+        m_object_offset = object_offset;
+    }
+
+    PathMappingList &
+    GetSourceMappingList () const
+    {
+        return m_source_mappings;
+    }
+
+protected:
+    FileSpec m_file;
+    FileSpec m_platform_file;
+    FileSpec m_symbol_file;
+    ArchSpec m_arch;
+    UUID m_uuid;
+    ConstString m_object_name;
+    uint64_t m_object_offset;
+    mutable PathMappingList m_source_mappings;
+};
+
+} // namespace lldb_private
+
+#endif  // liblldb_ModuleSpec_h_
diff --git a/include/lldb/Core/SearchFilter.h b/include/lldb/Core/SearchFilter.h
index 20db97e..70eee2e 100644
--- a/include/lldb/Core/SearchFilter.h
+++ b/include/lldb/Core/SearchFilter.h
@@ -15,11 +15,7 @@
 // Other libraries and framework includes
 // Project includes
 #include "lldb/lldb-private.h"
-#include "lldb/Core/Stream.h"
-#include "lldb/Host/FileSpec.h"
-#include "lldb/Core/Address.h"
-#include "lldb/Symbol/SymbolContext.h"
-#include "lldb/Core/Module.h"
+#include "lldb/Core/FileSpecList.h"
 
 namespace lldb_private {
 
diff --git a/include/lldb/Host/FileSpec.h b/include/lldb/Host/FileSpec.h
index 3ff405e..0419651 100644
--- a/include/lldb/Host/FileSpec.h
+++ b/include/lldb/Host/FileSpec.h
@@ -330,6 +330,18 @@
     const ConstString &
     GetFilename () const;
 
+    //------------------------------------------------------------------
+    /// Returns true if the filespec represents an implementation source
+    /// file (files with a ".c", ".cpp", ".m", ".mm" (many more)
+    /// extension).
+    ///
+    /// @return
+    ///     \b true if the filespec represents an implementation source
+    ///     file, \b false otherwise.
+    //------------------------------------------------------------------
+    bool
+    IsSourceImplementationFile () const;
+
     TimeValue
     GetModificationTime () const;
 
diff --git a/include/lldb/Interpreter/CommandCompletions.h b/include/lldb/Interpreter/CommandCompletions.h
index c7e7a89..ff2bbd5 100644
--- a/include/lldb/Interpreter/CommandCompletions.h
+++ b/include/lldb/Interpreter/CommandCompletions.h
@@ -12,6 +12,8 @@
 
 // C Includes
 // C++ Includes
+#include <set>
+
 // Other libraries and framework includes
 // Project includes
 #include "lldb/lldb-private.h"
diff --git a/include/lldb/Symbol/CompileUnit.h b/include/lldb/Symbol/CompileUnit.h
index 3129549..2f209dd 100644
--- a/include/lldb/Symbol/CompileUnit.h
+++ b/include/lldb/Symbol/CompileUnit.h
@@ -10,9 +10,9 @@
 #ifndef liblldb_CompUnit_h_
 #define liblldb_CompUnit_h_
 
+#include "lldb/lldb-enumerations.h"
 #include "lldb/Symbol/Function.h"
 #include "lldb/Core/FileSpecList.h"
-#include "lldb/Core/Language.h"
 #include "lldb/Core/ModuleChild.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Core/UserID.h"
@@ -36,7 +36,6 @@
     public ModuleChild,
     public FileSpec,
     public UserID,
-    public Language,
     public SymbolContextScope
 {
 public:
@@ -143,6 +142,15 @@
     virtual void
     DumpSymbolContext(Stream *s);
 
+    lldb::LanguageType
+    GetLanguage();
+
+    void
+    SetLanguage(lldb::LanguageType language)
+    {
+        m_flags.Set(flagsParsedLanguage);
+        m_language = language;
+    }
 
     void
     GetDescription(Stream *s, lldb::DescriptionLevel level) const;
@@ -388,6 +396,7 @@
 
 protected:
     void *m_user_data; ///< User data for the SymbolFile parser to store information into.
+    lldb::LanguageType m_language; ///< The programming language enumeration value.
     Flags m_flags; ///< Compile unit flags that help with partial parsing.
     std::vector<lldb::FunctionSP> m_functions; ///< The sparsely populated list of shared pointers to functions
                                          ///< that gets populated as functions get partially parsed.
@@ -398,10 +407,11 @@
 private:
     enum
     {
-        flagsParsedAllFunctions = (1 << 0), ///< Have we already parsed all our functions
-        flagsParsedVariables    = (1 << 1), ///< Have we already parsed globals and statics?
-        flagsParsedSupportFiles = (1 << 2), ///< Have we already parsed the support files for this compile unit?
-        flagsParsedLineTable    = (1 << 3)  ///< Have we parsed the line table already?
+        flagsParsedAllFunctions = (1u << 0), ///< Have we already parsed all our functions
+        flagsParsedVariables    = (1u << 1), ///< Have we already parsed globals and statics?
+        flagsParsedSupportFiles = (1u << 2), ///< Have we already parsed the support files for this compile unit?
+        flagsParsedLineTable    = (1u << 3),  ///< Have we parsed the line table already?
+        flagsParsedLanguage     = (1u << 4)   ///< Have we parsed the line table already?
     };
 
     DISALLOW_COPY_AND_ASSIGN (CompileUnit);
diff --git a/include/lldb/Symbol/ObjectFile.h b/include/lldb/Symbol/ObjectFile.h
index 3144096..4466e02 100644
--- a/include/lldb/Symbol/ObjectFile.h
+++ b/include/lldb/Symbol/ObjectFile.h
@@ -175,6 +175,37 @@
                 lldb::addr_t header_addr,
                 lldb::DataBufferSP &file_data_sp);
 
+    
+    //------------------------------------------------------------------
+    /// Split a path into a file path with object name.
+    ///
+    /// For paths like "/tmp/foo.a(bar.o)" we often need to split a path
+    /// up into the actual path name and into the object name so we can
+    /// make a valid object file from it.
+    ///
+    /// @param[in] path_with_object
+    ///     A path that might contain an archive path with a .o file
+    ///     specified in parens in the basename of the path.
+    ///
+    /// @param[out] archive_file
+    ///     If \b true is returned, \a file_spec will be filled in with
+    ///     the path to the archive.
+    ///
+    /// @param[out] archive_object
+    ///     If \b true is returned, \a object will be filled in with
+    ///     the name of the object inside the archive.
+    ///
+    /// @return
+    ///     \b true if the path matches the pattern of archive + object
+    ///     and \a archive_file and \a archive_object are modified,
+    ///     \b false otherwise and \a archive_file and \a archive_object
+    ///     are guaranteed to be remain unchanged.
+    //------------------------------------------------------------------
+    static bool
+    SplitArchivePathWithObject (const char *path_with_object,
+                                lldb_private::FileSpec &archive_file,
+                                lldb_private::ConstString &archive_object);
+
     //------------------------------------------------------------------
     /// Gets the address size in bytes for the current object file.
     ///
diff --git a/include/lldb/Symbol/Symbol.h b/include/lldb/Symbol/Symbol.h
index 3cb83c2..9043fe2 100644
--- a/include/lldb/Symbol/Symbol.h
+++ b/include/lldb/Symbol/Symbol.h
@@ -91,7 +91,7 @@
     }
 
     const ConstString &
-    GetName ()
+    GetName () const
     {
         return m_mangled.GetName();
     }
diff --git a/include/lldb/Symbol/SymbolFile.h b/include/lldb/Symbol/SymbolFile.h
index 13d02bd..bac886a 100644
--- a/include/lldb/Symbol/SymbolFile.h
+++ b/include/lldb/Symbol/SymbolFile.h
@@ -120,6 +120,7 @@
     virtual uint32_t        GetNumCompileUnits() = 0;
     virtual lldb::CompUnitSP  ParseCompileUnitAtIndex(uint32_t index) = 0;
 
+    virtual lldb::LanguageType ParseCompileUnitLanguage (const SymbolContext& sc) = 0;
     virtual size_t          ParseCompileUnitFunctions (const SymbolContext& sc) = 0;
     virtual bool            ParseCompileUnitLineTable (const SymbolContext& sc) = 0;
     virtual bool            ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files) = 0;
diff --git a/include/lldb/Symbol/SymbolVendor.h b/include/lldb/Symbol/SymbolVendor.h
index 9c2e989..de9f35c 100644
--- a/include/lldb/Symbol/SymbolVendor.h
+++ b/include/lldb/Symbol/SymbolVendor.h
@@ -62,6 +62,9 @@
     virtual void
     Dump(Stream *s);
 
+    virtual lldb::LanguageType
+    ParseCompileUnitLanguage (const SymbolContext& sc);
+    
     virtual size_t
     ParseCompileUnitFunctions (const SymbolContext& sc);
 
diff --git a/include/lldb/Target/Target.h b/include/lldb/Target/Target.h
index 4a81a78..4252529 100644
--- a/include/lldb/Target/Target.h
+++ b/include/lldb/Target/Target.h
@@ -19,6 +19,7 @@
 #include "lldb/Breakpoint/BreakpointList.h"
 #include "lldb/Breakpoint/BreakpointLocationCollection.h"
 #include "lldb/Breakpoint/WatchpointList.h"
+#include "lldb/Core/ArchSpec.h"
 #include "lldb/Core/Broadcaster.h"
 #include "lldb/Core/Event.h"
 #include "lldb/Core/ModuleList.h"
@@ -39,6 +40,14 @@
 
 extern OptionEnumValueElement g_dynamic_value_types[];
 
+typedef enum InlineStrategy
+{
+    eInlineBreakpointsNever = 0,
+    eInlineBreakpointsHeaders,
+    eInlineBreakpointsAlways
+} InlineStrategy;
+
+
 //----------------------------------------------------------------------
 // TargetProperties
 //----------------------------------------------------------------------
@@ -71,6 +80,9 @@
     void
     SetDisableSTDIO (bool b);
     
+    InlineStrategy
+    GetInlineStrategy () const;
+
     bool
     GetRunArguments (Args &args) const;
     
@@ -312,7 +324,7 @@
     CreateBreakpoint (const FileSpecList *containingModules,
                       const FileSpec &file,
                       uint32_t line_no,
-                      bool check_inlines,
+                      LazyBool check_inlines = eLazyBoolCalculate,
                       LazyBool skip_prologue = eLazyBoolCalculate,
                       bool internal = false);
 
diff --git a/lldb.xcodeproj/project.pbxproj b/lldb.xcodeproj/project.pbxproj
index 75bcda7..139d67f 100644
--- a/lldb.xcodeproj/project.pbxproj
+++ b/lldb.xcodeproj/project.pbxproj
@@ -78,6 +78,7 @@
 		260CC65215D0440D002BF2E0 /* OptionValueString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260CC64515D0440D002BF2E0 /* OptionValueString.cpp */; };
 		260CC65315D0440D002BF2E0 /* OptionValueUInt64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260CC64615D0440D002BF2E0 /* OptionValueUInt64.cpp */; };
 		260CC65415D0440D002BF2E0 /* OptionValueUUID.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260CC64715D0440D002BF2E0 /* OptionValueUUID.cpp */; };
+		260D9B2715EC369500960137 /* ModuleSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 260D9B2615EC369500960137 /* ModuleSpec.h */; };
 		260E07C6136FA69E00CF21D3 /* OptionGroupUUID.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260E07C5136FA69E00CF21D3 /* OptionGroupUUID.cpp */; };
 		260E07C8136FAB9200CF21D3 /* OptionGroupFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 260E07C7136FAB9200CF21D3 /* OptionGroupFile.cpp */; };
 		261744781168585B005ADD65 /* SBType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 261744771168585B005ADD65 /* SBType.cpp */; };
@@ -802,6 +803,7 @@
 		260CC64515D0440D002BF2E0 /* OptionValueString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionValueString.cpp; path = source/Interpreter/OptionValueString.cpp; sourceTree = "<group>"; };
 		260CC64615D0440D002BF2E0 /* OptionValueUInt64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionValueUInt64.cpp; path = source/Interpreter/OptionValueUInt64.cpp; sourceTree = "<group>"; };
 		260CC64715D0440D002BF2E0 /* OptionValueUUID.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionValueUUID.cpp; path = source/Interpreter/OptionValueUUID.cpp; sourceTree = "<group>"; };
+		260D9B2615EC369500960137 /* ModuleSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ModuleSpec.h; path = include/lldb/Core/ModuleSpec.h; sourceTree = "<group>"; };
 		260E07C3136FA68900CF21D3 /* OptionGroupUUID.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionGroupUUID.h; path = include/lldb/Interpreter/OptionGroupUUID.h; sourceTree = "<group>"; };
 		260E07C5136FA69E00CF21D3 /* OptionGroupUUID.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionGroupUUID.cpp; path = source/Interpreter/OptionGroupUUID.cpp; sourceTree = "<group>"; };
 		260E07C7136FAB9200CF21D3 /* OptionGroupFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OptionGroupFile.cpp; path = source/Interpreter/OptionGroupFile.cpp; sourceTree = "<group>"; };
@@ -2511,6 +2513,7 @@
 				26BC7E8210F1B85900F91463 /* ModuleChild.cpp */,
 				26BC7D6C10F1B77400F91463 /* ModuleList.h */,
 				26BC7E8310F1B85900F91463 /* ModuleList.cpp */,
+				260D9B2615EC369500960137 /* ModuleSpec.h */,
 				26651A15133BF9CC005B64B7 /* Opcode.h */,
 				26651A17133BF9DF005B64B7 /* Opcode.cpp */,
 				266DFE9813FD658300D0C574 /* OperatingSystem.h */,
@@ -3388,6 +3391,7 @@
 				26491E3B15E1DB8600CBFFC2 /* OptionValueRegex.h in Headers */,
 				2697A39515E404BA003E682C /* OptionValueArch.h in Headers */,
 				2698699D15E6CBD0002415FF /* OperatingSystemPython.h in Headers */,
+				260D9B2715EC369500960137 /* ModuleSpec.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/source/API/SBFrame.cpp b/source/API/SBFrame.cpp
index ceab3b7..ca45191 100644
--- a/source/API/SBFrame.cpp
+++ b/source/API/SBFrame.cpp
@@ -24,6 +24,8 @@
 #include "lldb/Expression/ClangUserExpression.h"
 #include "lldb/Host/Host.h"
 #include "lldb/Symbol/Block.h"
+#include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/Symbol.h"
 #include "lldb/Symbol/SymbolContext.h"
 #include "lldb/Symbol/VariableList.h"
 #include "lldb/Symbol/Variable.h"
diff --git a/source/API/SBInstruction.cpp b/source/API/SBInstruction.cpp
index fa9058b..2334cc0 100644
--- a/source/API/SBInstruction.cpp
+++ b/source/API/SBInstruction.cpp
@@ -17,6 +17,7 @@
 
 #include "lldb/Core/ArchSpec.h"
 #include "lldb/Core/DataBufferHeap.h"
+#include "lldb/Core/DataExtractor.h"
 #include "lldb/Core/Disassembler.h"
 #include "lldb/Core/EmulateInstruction.h"
 #include "lldb/Core/StreamFile.h"
diff --git a/source/API/SBModule.cpp b/source/API/SBModule.cpp
index 463669f..44ac2d3 100644
--- a/source/API/SBModule.cpp
+++ b/source/API/SBModule.cpp
@@ -15,10 +15,13 @@
 #include "lldb/API/SBSymbolContextList.h"
 #include "lldb/Core/Module.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/ValueObjectList.h"
 #include "lldb/Core/ValueObjectVariable.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/SymbolVendor.h"
+#include "lldb/Symbol/Symtab.h"
 #include "lldb/Symbol/VariableList.h"
 #include "lldb/Target/Target.h"
 
diff --git a/source/API/SBProcess.cpp b/source/API/SBProcess.cpp
index e556904..7130e33 100644
--- a/source/API/SBProcess.cpp
+++ b/source/API/SBProcess.cpp
@@ -15,6 +15,7 @@
 #include "lldb/Interpreter/Args.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/State.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Core/StreamFile.h"
diff --git a/source/API/SBSection.cpp b/source/API/SBSection.cpp
index 06a08d8..0f55f01 100644
--- a/source/API/SBSection.cpp
+++ b/source/API/SBSection.cpp
@@ -16,6 +16,7 @@
 #include "lldb/Core/Module.h"
 #include "lldb/Core/Section.h"
 #include "lldb/Core/StreamString.h"
+#include "lldb/Symbol/ObjectFile.h"
 
 
 using namespace lldb;
diff --git a/source/API/SBTarget.cpp b/source/API/SBTarget.cpp
index 7635a36..df02778 100644
--- a/source/API/SBTarget.cpp
+++ b/source/API/SBTarget.cpp
@@ -31,14 +31,18 @@
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/Disassembler.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/RegularExpression.h"
 #include "lldb/Core/SearchFilter.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/STLUtils.h"
 #include "lldb/Core/ValueObjectList.h"
 #include "lldb/Core/ValueObjectVariable.h"
 #include "lldb/Host/FileSpec.h"
 #include "lldb/Host/Host.h"
 #include "lldb/Interpreter/Args.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/SymbolVendor.h"
 #include "lldb/Symbol/VariableList.h"
 #include "lldb/Target/LanguageRuntime.h"
@@ -1182,9 +1186,9 @@
     {
         Mutex::Locker api_locker (target_sp->GetAPIMutex());
         
-        const bool check_inlines = true;
-        const bool internal = false;
+        const LazyBool check_inlines = eLazyBoolCalculate;
         const LazyBool skip_prologue = eLazyBoolCalculate;
+        const bool internal = false;
         *sb_bp = target_sp->CreateBreakpoint (NULL, *sb_file_spec, line, check_inlines, skip_prologue, internal);
     }
 
diff --git a/source/API/SBValue.cpp b/source/API/SBValue.cpp
index 3521e90..21f24a2 100644
--- a/source/API/SBValue.cpp
+++ b/source/API/SBValue.cpp
@@ -21,6 +21,7 @@
 #include "lldb/Core/Log.h"
 #include "lldb/Core/Module.h"
 #include "lldb/Core/Scalar.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Core/StreamFile.h"
 #include "lldb/Core/Value.h"
diff --git a/source/Breakpoint/Breakpoint.cpp b/source/Breakpoint/Breakpoint.cpp
index 5acfa9d..095924f 100644
--- a/source/Breakpoint/Breakpoint.cpp
+++ b/source/Breakpoint/Breakpoint.cpp
@@ -22,6 +22,7 @@
 #include "lldb/Core/Log.h"
 #include "lldb/Core/ModuleList.h"
 #include "lldb/Core/SearchFilter.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Symbol/SymbolContext.h"
diff --git a/source/Breakpoint/BreakpointID.cpp b/source/Breakpoint/BreakpointID.cpp
index 691e5c0..6180e4d 100644
--- a/source/Breakpoint/BreakpointID.cpp
+++ b/source/Breakpoint/BreakpointID.cpp
@@ -15,6 +15,7 @@
 
 #include "lldb/Breakpoint/BreakpointID.h"
 #include "lldb/Breakpoint/Breakpoint.h"
+#include "lldb/Core/Stream.h"
 
 using namespace lldb;
 using namespace lldb_private;
diff --git a/source/Breakpoint/BreakpointLocation.cpp b/source/Breakpoint/BreakpointLocation.cpp
index c0ae1c5..96ccce3 100644
--- a/source/Breakpoint/BreakpointLocation.cpp
+++ b/source/Breakpoint/BreakpointLocation.cpp
@@ -13,16 +13,18 @@
 
 // Other libraries and framework includes
 // Project includes
+#include "lldb/lldb-private-log.h"
 #include "lldb/Breakpoint/BreakpointLocation.h"
 #include "lldb/Breakpoint/BreakpointID.h"
 #include "lldb/Breakpoint/StoppointCallbackContext.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/Log.h"
-#include "lldb/Target/Target.h"
-#include "lldb/Target/ThreadPlan.h"
-#include "lldb/Target/Process.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/StreamString.h"
-#include "lldb/lldb-private-log.h"
+#include "lldb/Symbol/CompileUnit.h"
+#include "lldb/Symbol/Symbol.h"
+#include "lldb/Target/Target.h"
+#include "lldb/Target/Process.h"
 #include "lldb/Target/Thread.h"
 #include "lldb/Target/ThreadSpec.h"
 
diff --git a/source/Breakpoint/BreakpointLocationList.cpp b/source/Breakpoint/BreakpointLocationList.cpp
index 2508158..8329912 100644
--- a/source/Breakpoint/BreakpointLocationList.cpp
+++ b/source/Breakpoint/BreakpointLocationList.cpp
@@ -14,8 +14,7 @@
 // Project includes
 #include "lldb/Breakpoint/BreakpointLocationList.h"
 #include "lldb/Breakpoint/BreakpointLocation.h"
-#include "lldb/Core/ModuleList.h"
-#include "lldb/Target/Target.h"
+#include "lldb/Core/Section.h"
 
 using namespace lldb;
 using namespace lldb_private;
diff --git a/source/Breakpoint/BreakpointResolverFileLine.cpp b/source/Breakpoint/BreakpointResolverFileLine.cpp
index f1b8ac5..45d54e7 100644
--- a/source/Breakpoint/BreakpointResolverFileLine.cpp
+++ b/source/Breakpoint/BreakpointResolverFileLine.cpp
@@ -15,8 +15,10 @@
 // Project includes
 #include "lldb/Breakpoint/BreakpointLocation.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/StreamString.h"
-#include "lldb/Target/Target.h"
+#include "lldb/Symbol/CompileUnit.h"
+#include "lldb/Symbol/Function.h"
 #include "lldb/lldb-private-log.h"
 
 using namespace lldb;
diff --git a/source/Breakpoint/BreakpointResolverFileRegex.cpp b/source/Breakpoint/BreakpointResolverFileRegex.cpp
index e4b596a..0f627a0 100644
--- a/source/Breakpoint/BreakpointResolverFileRegex.cpp
+++ b/source/Breakpoint/BreakpointResolverFileRegex.cpp
@@ -17,6 +17,7 @@
 #include "lldb/Core/SourceManager.h"
 #include "lldb/Core/Log.h"
 #include "lldb/Core/StreamString.h"
+#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Target/Target.h"
 #include "lldb/lldb-private-log.h"
 
diff --git a/source/Breakpoint/BreakpointResolverName.cpp b/source/Breakpoint/BreakpointResolverName.cpp
index 83d99f6..86a536c 100644
--- a/source/Breakpoint/BreakpointResolverName.cpp
+++ b/source/Breakpoint/BreakpointResolverName.cpp
@@ -15,9 +15,13 @@
 // Project includes
 #include "lldb/Breakpoint/BreakpointLocation.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Symbol/ClangNamespaceDecl.h"
-#include "lldb/Target/Target.h"
+#include "lldb/Symbol/Block.h"
+#include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/Symbol.h"
+#include "lldb/Symbol/SymbolContext.h"
 
 using namespace lldb;
 using namespace lldb_private;
diff --git a/source/Commands/CommandCompletions.cpp b/source/Commands/CommandCompletions.cpp
index adeebe3..ab782d6 100644
--- a/source/Commands/CommandCompletions.cpp
+++ b/source/Commands/CommandCompletions.cpp
@@ -21,9 +21,11 @@
 #include "lldb/Host/FileSpec.h"
 #include "lldb/Core/FileSpecList.h"
 #include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Interpreter/Args.h"
 #include "lldb/Interpreter/CommandCompletions.h"
 #include "lldb/Interpreter/CommandInterpreter.h"
+#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Utility/CleanUp.h"
 
diff --git a/source/Commands/CommandObjectArgs.cpp b/source/Commands/CommandObjectArgs.cpp
index f9d6d02..da54961 100644
--- a/source/Commands/CommandObjectArgs.cpp
+++ b/source/Commands/CommandObjectArgs.cpp
@@ -14,13 +14,14 @@
 // Other libraries and framework includes
 // Project includes
 #include "lldb/Interpreter/Args.h"
+#include "lldb/Core/Debugger.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/Value.h"
 #include "lldb/Expression/ClangExpression.h"
 #include "lldb/Expression/ClangExpressionVariable.h"
 #include "lldb/Expression/ClangFunction.h"
 #include "lldb/Host/Host.h"
 #include "lldb/Interpreter/CommandInterpreter.h"
-#include "lldb/Core/Debugger.h"
 #include "lldb/Interpreter/CommandReturnObject.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/Variable.h"
diff --git a/source/Commands/CommandObjectBreakpoint.cpp b/source/Commands/CommandObjectBreakpoint.cpp
index 6228333..95d533d 100644
--- a/source/Commands/CommandObjectBreakpoint.cpp
+++ b/source/Commands/CommandObjectBreakpoint.cpp
@@ -91,7 +91,6 @@
             m_filenames (),
             m_line_num (0),
             m_column (0),
-            m_check_inlines (true),
             m_func_names (),
             m_func_name_type_mask (eFunctionNameTypeNone),
             m_func_regexp (),
@@ -104,7 +103,7 @@
             m_thread_name(),
             m_queue_name(),
             m_catch_bp (false),
-            m_throw_bp (false),
+            m_throw_bp (true),
             m_language (eLanguageTypeUnknown),
             m_skip_prologue (eLazyBoolCalculate)
         {
@@ -285,18 +284,19 @@
             m_line_num = 0;
             m_column = 0;
             m_func_names.clear();
-            m_func_name_type_mask = 0;
+            m_func_name_type_mask = eFunctionNameTypeNone;
             m_func_regexp.clear();
-            m_load_addr = LLDB_INVALID_ADDRESS;
+            m_source_text_regexp.clear();
             m_modules.Clear();
+            m_load_addr = LLDB_INVALID_ADDRESS;
             m_ignore_count = 0;
             m_thread_id = LLDB_INVALID_THREAD_ID;
             m_thread_index = UINT32_MAX;
             m_thread_name.clear();
             m_queue_name.clear();
-            m_language = eLanguageTypeUnknown;
             m_catch_bp = false;
             m_throw_bp = true;
+            m_language = eLanguageTypeUnknown;
             m_skip_prologue = eLazyBoolCalculate;
         }
     
@@ -316,7 +316,6 @@
         FileSpecList m_filenames;
         uint32_t m_line_num;
         uint32_t m_column;
-        bool m_check_inlines;
         std::vector<std::string> m_func_names;
         uint32_t m_func_name_type_mask;
         std::string m_func_regexp;
@@ -398,11 +397,14 @@
                     }
                     else
                         file = m_options.m_filenames.GetFileSpecAtIndex(0);
-                        
+                    
+                    // Only check for inline functions if 
+                    LazyBool check_inlines = eLazyBoolCalculate;
+                    
                     bp = target->CreateBreakpoint (&(m_options.m_modules),
                                                    file,
                                                    m_options.m_line_num,
-                                                   m_options.m_check_inlines,
+                                                   check_inlines,
                                                    m_options.m_skip_prologue,
                                                    internal).get();
                 }
diff --git a/source/Commands/CommandObjectDisassemble.cpp b/source/Commands/CommandObjectDisassemble.cpp
index 5247743..38cfe32 100644
--- a/source/Commands/CommandObjectDisassemble.cpp
+++ b/source/Commands/CommandObjectDisassemble.cpp
@@ -14,16 +14,17 @@
 // Other libraries and framework includes
 // Project includes
 #include "lldb/Core/AddressRange.h"
+#include "lldb/Core/Disassembler.h"
+#include "lldb/Core/SourceManager.h"
 #include "lldb/Interpreter/Args.h"
 #include "lldb/Interpreter/CommandCompletions.h"
 #include "lldb/Interpreter/CommandInterpreter.h"
 #include "lldb/Interpreter/CommandReturnObject.h"
-#include "lldb/Core/Disassembler.h"
 #include "lldb/Interpreter/Options.h"
-#include "lldb/Core/SourceManager.h"
-#include "lldb/Target/StackFrame.h"
+#include "lldb/Symbol/Function.h"
 #include "lldb/Symbol/Symbol.h"
 #include "lldb/Target/Process.h"
+#include "lldb/Target/StackFrame.h"
 #include "lldb/Target/Target.h"
 
 #define DEFAULT_DISASM_BYTE_SIZE 32
diff --git a/source/Commands/CommandObjectDisassemble.h b/source/Commands/CommandObjectDisassemble.h
index e99edac..7587c0a 100644
--- a/source/Commands/CommandObjectDisassemble.h
+++ b/source/Commands/CommandObjectDisassemble.h
@@ -14,6 +14,7 @@
 // C++ Includes
 // Other libraries and framework includes
 // Project includes
+#include "lldb/Core/ArchSpec.h"
 #include "lldb/Interpreter/CommandObject.h"
 #include "lldb/Interpreter/Options.h"
 
diff --git a/source/Commands/CommandObjectMemory.cpp b/source/Commands/CommandObjectMemory.cpp
index 0874f01..ef1709f 100644
--- a/source/Commands/CommandObjectMemory.cpp
+++ b/source/Commands/CommandObjectMemory.cpp
@@ -16,6 +16,7 @@
 #include "lldb/Core/DataBufferHeap.h"
 #include "lldb/Core/DataExtractor.h"
 #include "lldb/Core/Debugger.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/ValueObjectMemory.h"
 #include "lldb/Interpreter/Args.h"
@@ -26,7 +27,7 @@
 #include "lldb/Interpreter/OptionGroupOutputFile.h"
 #include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
 #include "lldb/Interpreter/OptionValueString.h"
-#include "lldb/Symbol/ClangNamespaceDecl.h"
+#include "lldb/Symbol/TypeList.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/StackFrame.h"
 
diff --git a/source/Commands/CommandObjectPlatform.cpp b/source/Commands/CommandObjectPlatform.cpp
index 82de22a..64c05af 100644
--- a/source/Commands/CommandObjectPlatform.cpp
+++ b/source/Commands/CommandObjectPlatform.cpp
@@ -15,6 +15,7 @@
 // Project includes
 #include "lldb/Core/DataExtractor.h"
 #include "lldb/Core/Debugger.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Interpreter/Args.h"
 #include "lldb/Interpreter/CommandInterpreter.h"
diff --git a/source/Commands/CommandObjectProcess.cpp b/source/Commands/CommandObjectProcess.cpp
index c6b059a..e744b58 100644
--- a/source/Commands/CommandObjectProcess.cpp
+++ b/source/Commands/CommandObjectProcess.cpp
@@ -17,6 +17,7 @@
 #include "lldb/Breakpoint/BreakpointLocation.h"
 #include "lldb/Breakpoint/BreakpointSite.h"
 #include "lldb/Core/State.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Host/Host.h"
 #include "lldb/Interpreter/Args.h"
 #include "lldb/Interpreter/Options.h"
diff --git a/source/Commands/CommandObjectSource.cpp b/source/Commands/CommandObjectSource.cpp
index ec58e94..c4ccf2a 100644
--- a/source/Commands/CommandObjectSource.cpp
+++ b/source/Commands/CommandObjectSource.cpp
@@ -16,10 +16,13 @@
 #include "lldb/Interpreter/Args.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/FileLineResolver.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/SourceManager.h"
 #include "lldb/Interpreter/CommandInterpreter.h"
 #include "lldb/Interpreter/CommandReturnObject.h"
 #include "lldb/Host/FileSpec.h"
+#include "lldb/Symbol/CompileUnit.h"
+#include "lldb/Symbol/Function.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/TargetList.h"
 #include "lldb/Interpreter/CommandCompletions.h"
diff --git a/source/Commands/CommandObjectTarget.cpp b/source/Commands/CommandObjectTarget.cpp
index cc83190..15523b3 100644
--- a/source/Commands/CommandObjectTarget.cpp
+++ b/source/Commands/CommandObjectTarget.cpp
@@ -18,6 +18,8 @@
 #include "lldb/Interpreter/Args.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/InputReader.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/Section.h"
 #include "lldb/Core/State.h"
 #include "lldb/Core/Timer.h"
@@ -34,6 +36,7 @@
 #include "lldb/Interpreter/OptionGroupUInt64.h"
 #include "lldb/Interpreter/OptionGroupUUID.h"
 #include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
+#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Symbol/FuncUnwinders.h"
 #include "lldb/Symbol/LineTable.h"
 #include "lldb/Symbol/ObjectFile.h"
diff --git a/source/Commands/CommandObjectThread.cpp b/source/Commands/CommandObjectThread.cpp
index f8deebc..7cb8273 100644
--- a/source/Commands/CommandObjectThread.cpp
+++ b/source/Commands/CommandObjectThread.cpp
@@ -13,15 +13,16 @@
 // C++ Includes
 // Other libraries and framework includes
 // Project includes
-#include "lldb/Interpreter/Options.h"
 #include "lldb/Core/State.h"
 #include "lldb/Core/SourceManager.h"
-
 #include "lldb/Host/Host.h"
-
 #include "lldb/Interpreter/CommandInterpreter.h"
 #include "lldb/Interpreter/CommandReturnObject.h"
-
+#include "lldb/Interpreter/Options.h"
+#include "lldb/Symbol/CompileUnit.h"
+#include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/LineTable.h"
+#include "lldb/Symbol/LineEntry.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
 #include "lldb/Target/Target.h"
@@ -31,8 +32,7 @@
 #include "lldb/Target/ThreadPlanStepOut.h"
 #include "lldb/Target/ThreadPlanStepRange.h"
 #include "lldb/Target/ThreadPlanStepInRange.h"
-#include "lldb/Symbol/LineTable.h"
-#include "lldb/Symbol/LineEntry.h"
+
 
 using namespace lldb;
 using namespace lldb_private;
diff --git a/source/Core/Address.cpp b/source/Core/Address.cpp
index d9ff36e..2edd52f 100644
--- a/source/Core/Address.cpp
+++ b/source/Core/Address.cpp
@@ -10,7 +10,9 @@
 #include "lldb/Core/Address.h"
 #include "lldb/Core/Module.h"
 #include "lldb/Core/Section.h"
+#include "lldb/Symbol/Block.h"
 #include "lldb/Symbol/ObjectFile.h"
+#include "lldb/Symbol/Type.h"
 #include "lldb/Symbol/Variable.h"
 #include "lldb/Symbol/VariableList.h"
 #include "lldb/Target/ExecutionContext.h"
diff --git a/source/Core/AddressResolverFileLine.cpp b/source/Core/AddressResolverFileLine.cpp
index 0da1feb..9300f90 100644
--- a/source/Core/AddressResolverFileLine.cpp
+++ b/source/Core/AddressResolverFileLine.cpp
@@ -12,6 +12,8 @@
 // Project includes
 #include "lldb/Core/Log.h"
 #include "lldb/Core/StreamString.h"
+#include "lldb/Symbol/CompileUnit.h"
+#include "lldb/Symbol/SymbolContext.h"
 #include "lldb/lldb-private-log.h"
 
 using namespace lldb;
diff --git a/source/Core/AddressResolverName.cpp b/source/Core/AddressResolverName.cpp
index f187420..3e7c373 100644
--- a/source/Core/AddressResolverName.cpp
+++ b/source/Core/AddressResolverName.cpp
@@ -11,8 +11,12 @@
 
 // Project includes
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Symbol/ClangNamespaceDecl.h"
+#include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/SymbolContext.h"
+#include "lldb/Symbol/Symbol.h"
 #include "lldb/lldb-private-log.h"
 
 using namespace lldb;
diff --git a/source/Core/ConstString.cpp b/source/Core/ConstString.cpp
index 720514b..d82bc61 100644
--- a/source/Core/ConstString.cpp
+++ b/source/Core/ConstString.cpp
@@ -100,6 +100,18 @@
     }
 
     const char *
+    GetConstCStringWithStringRef (const llvm::StringRef &string_ref)
+    {
+        if (string_ref.data())
+        {
+            Mutex::Locker locker (m_mutex);
+            StringPoolEntryType& entry = m_string_map.GetOrCreateValue (string_ref, (StringPoolValueType)NULL);
+            return entry.getKeyData();
+        }
+        return NULL;
+    }
+
+    const char *
     GetConstCStringAndSetMangledCounterPart (const char *demangled_cstr, const char *mangled_ccstr)
     {
         if (demangled_cstr)
diff --git a/source/Core/Debugger.cpp b/source/Core/Debugger.cpp
index 23fbbad..57f63e8 100644
--- a/source/Core/Debugger.cpp
+++ b/source/Core/Debugger.cpp
@@ -19,6 +19,7 @@
 #include "lldb/Core/DataVisualization.h"
 #include "lldb/Core/FormatManager.h"
 #include "lldb/Core/InputReader.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/RegisterValue.h"
 #include "lldb/Core/State.h"
 #include "lldb/Core/StreamAsynchronousIO.h"
@@ -31,6 +32,10 @@
 #include "lldb/Interpreter/CommandInterpreter.h"
 #include "lldb/Interpreter/OptionValueSInt64.h"
 #include "lldb/Interpreter/OptionValueString.h"
+#include "lldb/Symbol/ClangASTContext.h"
+#include "lldb/Symbol/CompileUnit.h"
+#include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/Symbol.h"
 #include "lldb/Symbol/VariableList.h"
 #include "lldb/Target/TargetList.h"
 #include "lldb/Target/Process.h"
diff --git a/source/Core/Disassembler.cpp b/source/Core/Disassembler.cpp
index 6b6b6ee..124fc4a 100644
--- a/source/Core/Disassembler.cpp
+++ b/source/Core/Disassembler.cpp
@@ -29,6 +29,7 @@
 #include "lldb/Interpreter/OptionValueString.h"
 #include "lldb/Interpreter/OptionValueUInt64.h"
 #include "lldb/Symbol/ClangNamespaceDecl.h"
+#include "lldb/Symbol/Function.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
diff --git a/source/Core/FileLineResolver.cpp b/source/Core/FileLineResolver.cpp
index 8d68df2..59a875c 100644
--- a/source/Core/FileLineResolver.cpp
+++ b/source/Core/FileLineResolver.cpp
@@ -13,6 +13,7 @@
 #include "lldb/lldb-private-log.h"
 #include "lldb/Core/Log.h"
 #include "lldb/Core/StreamString.h"
+#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Symbol/LineTable.h"
 
 using namespace lldb;
diff --git a/source/Core/Module.cpp b/source/Core/Module.cpp
index b3fac25..7818530 100644
--- a/source/Core/Module.cpp
+++ b/source/Core/Module.cpp
@@ -12,11 +12,14 @@
 #include "lldb/Core/DataBufferHeap.h"
 #include "lldb/Core/Log.h"
 #include "lldb/Core/ModuleList.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/RegularExpression.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/Timer.h"
 #include "lldb/Host/Host.h"
 #include "lldb/lldb-private-log.h"
+#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/SymbolContext.h"
 #include "lldb/Symbol/SymbolVendor.h"
diff --git a/source/Core/ModuleList.cpp b/source/Core/ModuleList.cpp
index 5507428..657ee69 100644
--- a/source/Core/ModuleList.cpp
+++ b/source/Core/ModuleList.cpp
@@ -15,6 +15,7 @@
 // Project includes
 #include "lldb/Core/Log.h"
 #include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Host/Host.h"
 #include "lldb/Host/Symbols.h"
 #include "lldb/Symbol/ClangNamespaceDecl.h"
diff --git a/source/Core/SearchFilter.cpp b/source/Core/SearchFilter.cpp
index 9256899..60f7dbb 100644
--- a/source/Core/SearchFilter.cpp
+++ b/source/Core/SearchFilter.cpp
@@ -14,6 +14,8 @@
 
 #include "lldb/lldb-private.h"
 #include "lldb/Core/SearchFilter.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Target/Target.h"
 
 using namespace lldb;
@@ -368,26 +370,25 @@
 bool
 SearchFilterByModule::ModulePasses (const FileSpec &spec)
 {
-    if (FileSpec::Compare(spec, m_module_spec, false) == 0)
-        return true;
-    else
-        return false;
+    // Do a full match only if "spec" has a directory
+    const bool full_match = spec.GetDirectory();
+    return FileSpec::Equal(spec, m_module_spec, full_match);
 }
 
 bool
-SearchFilterByModule::SymbolContextPasses
-(
- const SymbolContext &context,
- lldb::SymbolContextItem scope
- )
+SearchFilterByModule::SymbolContextPasses (const SymbolContext &sc,
+                                           lldb::SymbolContextItem scope)
 {
-    if (!(scope & eSymbolContextModule))
-        return false;
-
-    if (context.module_sp && FileSpec::Compare (context.module_sp->GetFileSpec(), m_module_spec, false) == 0)
-        return true;
-    else
-        return false;
+    if (scope & eSymbolContextModule)
+    {
+        if (sc.module_sp)
+        {
+            // Match the full path only if "m_module_spec" has a directory
+            const bool full_match = m_module_spec.GetDirectory();
+            return FileSpec::Equal (sc.module_sp->GetFileSpec(), m_module_spec, full_match);
+        }
+    }
+    return false;
 }
 
 bool
@@ -434,7 +435,8 @@
     for (size_t i = 0; i < num_modules; i++)
     {
         Module* module = target_modules.GetModulePointerAtIndexUnlocked(i);
-        if (FileSpec::Compare (m_module_spec, module->GetFileSpec(), false) == 0)
+        const bool full_match = m_module_spec.GetDirectory();
+        if (FileSpec::Equal (m_module_spec, module->GetFileSpec(), full_match))
         {
             SymbolContext matchingContext(m_target_sp, module->shared_from_this());
             Searcher::CallbackReturn shouldContinue;
@@ -723,7 +725,7 @@
         return false;
     if (!(scope & eSymbolContextCompUnit))
         return false;
-    if (context.comp_unit && m_cu_spec_list.FindFileIndex(0, static_cast<FileSpec>(context.comp_unit), false) == UINT32_MAX)
+    if (context.comp_unit && m_cu_spec_list.FindFileIndex(0, context.comp_unit, false) == UINT32_MAX)
         return false;
     return true;
 }
@@ -745,7 +747,7 @@
 bool
 SearchFilterByModuleListAndCU::CompUnitPasses (CompileUnit &compUnit)
 {
-    return m_cu_spec_list.FindFileIndex(0, static_cast<FileSpec>(compUnit), false) != UINT32_MAX;
+    return m_cu_spec_list.FindFileIndex(0, compUnit, false) != UINT32_MAX;
 }
 
 void
diff --git a/source/Core/SourceManager.cpp b/source/Core/SourceManager.cpp
index 849c824..a967b35 100644
--- a/source/Core/SourceManager.cpp
+++ b/source/Core/SourceManager.cpp
@@ -15,8 +15,11 @@
 // Project includes
 #include "lldb/Core/DataBuffer.h"
 #include "lldb/Core/Debugger.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Symbol/ClangNamespaceDecl.h"
+#include "lldb/Symbol/CompileUnit.h"
+#include "lldb/Symbol/Function.h"
 #include "lldb/Symbol/SymbolContext.h"
 #include "lldb/Target/Target.h"
 
diff --git a/source/Core/ValueObject.cpp b/source/Core/ValueObject.cpp
index 8016bab..ed370e6 100644
--- a/source/Core/ValueObject.cpp
+++ b/source/Core/ValueObject.cpp
@@ -22,6 +22,7 @@
 #include "lldb/Core/DataVisualization.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/ValueObjectChild.h"
 #include "lldb/Core/ValueObjectConstResult.h"
diff --git a/source/Core/ValueObjectVariable.cpp b/source/Core/ValueObjectVariable.cpp
index d71ec97..20a4af0 100644
--- a/source/Core/ValueObjectVariable.cpp
+++ b/source/Core/ValueObjectVariable.cpp
@@ -18,6 +18,7 @@
 #include "lldb/Core/ValueObjectList.h"
 #include "lldb/Core/Value.h"
 
+#include "lldb/Symbol/Function.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/SymbolContext.h"
 #include "lldb/Symbol/SymbolContextScope.h"
diff --git a/source/Expression/ClangASTSource.cpp b/source/Expression/ClangASTSource.cpp
index 605747a..f94eb9c 100644
--- a/source/Expression/ClangASTSource.cpp
+++ b/source/Expression/ClangASTSource.cpp
@@ -17,6 +17,7 @@
 #include "lldb/Expression/ClangASTSource.h"
 #include "lldb/Expression/ClangExpression.h"
 #include "lldb/Symbol/ClangNamespaceDecl.h"
+#include "lldb/Symbol/Function.h"
 #include "lldb/Symbol/SymbolVendor.h"
 #include "lldb/Target/ObjCLanguageRuntime.h"
 #include "lldb/Target/Target.h"
diff --git a/source/Expression/ClangUserExpression.cpp b/source/Expression/ClangUserExpression.cpp
index 5e673c0..194f5ab 100644
--- a/source/Expression/ClangUserExpression.cpp
+++ b/source/Expression/ClangUserExpression.cpp
@@ -30,6 +30,7 @@
 #include "lldb/Expression/ClangUserExpression.h"
 #include "lldb/Expression/ExpressionSourceCode.h"
 #include "lldb/Host/Host.h"
+#include "lldb/Symbol/Block.h"
 #include "lldb/Symbol/VariableList.h"
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
diff --git a/source/Host/common/FileSpec.cpp b/source/Host/common/FileSpec.cpp
index 2a6e339..0faa274 100644
--- a/source/Host/common/FileSpec.cpp
+++ b/source/Host/common/FileSpec.cpp
@@ -28,6 +28,7 @@
 #include "lldb/Host/FileSpec.h"
 #include "lldb/Core/DataBufferHeap.h"
 #include "lldb/Core/DataBufferMemoryMap.h"
+#include "lldb/Core/RegularExpression.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Host/Host.h"
 #include "lldb/Utility/CleanUp.h"
@@ -702,15 +703,14 @@
 ConstString
 FileSpec::GetFileNameExtension () const
 {
-    const char *filename = m_filename.GetCString();
-    if (filename == NULL)
-        return ConstString();
-    
-    const char* dot_pos = strrchr(filename, '.');
-    if (dot_pos == NULL)
-        return ConstString();
-    
-    return ConstString(dot_pos+1);
+    if (m_filename)
+    {
+        const char *filename = m_filename.GetCString();
+        const char* dot_pos = strrchr(filename, '.');
+        if (dot_pos && dot_pos[1] != '\0')
+            return ConstString(dot_pos+1);
+    }
+    return ConstString();
 }
 
 ConstString
@@ -944,3 +944,26 @@
     return eEnumerateDirectoryResultNext;    
 }
 
+//------------------------------------------------------------------
+/// Returns true if the filespec represents an implementation source
+/// file (files with a ".c", ".cpp", ".m", ".mm" (many more)
+/// extension).
+///
+/// @return
+///     \b true if the filespec represents an implementation source
+///     file, \b false otherwise.
+//------------------------------------------------------------------
+bool
+FileSpec::IsSourceImplementationFile () const
+{
+    ConstString extension (GetFileNameExtension());
+    if (extension)
+    {
+        static RegularExpression g_source_file_regex ("^(c|m|mm|cpp|c\\+\\+|cxx|cc|cp|s|asm|f|f77|f90|f95|f03|for|ftn|fpp|ada|adb|ads)$",
+                                                      REG_EXTENDED | REG_ICASE);
+        return g_source_file_regex.Execute (extension.GetCString());
+    }
+    return false;
+}
+
+
diff --git a/source/Host/macosx/Symbols.cpp b/source/Host/macosx/Symbols.cpp
index 9274dec..eb7341d 100644
--- a/source/Host/macosx/Symbols.cpp
+++ b/source/Host/macosx/Symbols.cpp
@@ -22,6 +22,7 @@
 #include "lldb/Core/DataBuffer.h"
 #include "lldb/Core/DataExtractor.h"
 #include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/Timer.h"
 #include "lldb/Core/UUID.h"
diff --git a/source/Interpreter/OptionValue.cpp b/source/Interpreter/OptionValue.cpp
index 564fec8..1f6b03d 100644
--- a/source/Interpreter/OptionValue.cpp
+++ b/source/Interpreter/OptionValue.cpp
@@ -347,7 +347,7 @@
 {
     const OptionValueEnumeration *option_value = GetAsEnumeration();
     if (option_value)
-        option_value->GetCurrentValue();
+        return option_value->GetCurrentValue();
     return fail_value;
 }
 
diff --git a/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp b/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
index cb4f97f..8c263d6 100644
--- a/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
+++ b/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
@@ -14,6 +14,7 @@
 
 #include "lldb/Core/Address.h"
 #include "lldb/Core/DataExtractor.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Symbol/SymbolContext.h"
 #include "lldb/Target/ExecutionContext.h"
diff --git a/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp b/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
index fb7272d..5edd368 100644
--- a/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
+++ b/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
@@ -13,7 +13,9 @@
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/Log.h"
 #include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/State.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/ObjCLanguageRuntime.h"
@@ -302,6 +304,31 @@
     return is_loaded;
 }
 
+uint32_t
+DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetAddressByteSize ()
+{
+    if (module_sp)
+        return module_sp->GetArchitecture().GetAddressByteSize();
+    return 0;
+}
+
+lldb::ByteOrder
+DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetByteOrder()
+{
+    if (module_sp)
+        return module_sp->GetArchitecture().GetByteOrder();
+    return lldb::endian::InlHostByteOrder();
+}
+
+lldb_private::ArchSpec
+DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::GetArchitecture () const
+{
+    if (module_sp)
+        return module_sp->GetArchitecture();
+    return lldb_private::ArchSpec ();
+}
+
+
 //----------------------------------------------------------------------
 // Load the kernel module and initialize the "m_kernel" member. Return
 // true _only_ if the kernel is loaded the first time through (subsequent
@@ -826,3 +853,25 @@
     return 1;
 }
 
+lldb::ByteOrder
+DynamicLoaderDarwinKernel::GetByteOrderFromMagic (uint32_t magic)
+{
+    switch (magic)
+    {
+        case llvm::MachO::HeaderMagic32:
+        case llvm::MachO::HeaderMagic64:
+            return lldb::endian::InlHostByteOrder();
+            
+        case llvm::MachO::HeaderMagic32Swapped:
+        case llvm::MachO::HeaderMagic64Swapped:
+            if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig)
+                return lldb::eByteOrderLittle;
+            else
+                return lldb::eByteOrderBig;
+            
+        default:
+            break;
+    }
+    return lldb::eByteOrderInvalid;
+}
+
diff --git a/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h b/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h
index 005f5ea..9a6f90f 100644
--- a/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h
+++ b/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h
@@ -119,26 +119,8 @@
     }
 
     static lldb::ByteOrder
-    GetByteOrderFromMagic (uint32_t magic)
-    {
-        switch (magic)
-        {
-            case llvm::MachO::HeaderMagic32:
-            case llvm::MachO::HeaderMagic64:
-                return lldb::endian::InlHostByteOrder();
+    GetByteOrderFromMagic (uint32_t magic);
 
-            case llvm::MachO::HeaderMagic32Swapped:
-            case llvm::MachO::HeaderMagic64Swapped:
-                if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig)
-                    return lldb::eByteOrderLittle;
-                else
-                    return lldb::eByteOrderBig;
-
-            default:
-                break;
-        }
-        return lldb::eByteOrderInvalid;
-    }
     enum
     {
         KERNEL_MODULE_MAX_NAME = 64u,
@@ -229,28 +211,13 @@
         }
 
         uint32_t
-        GetAddressByteSize ()
-        {
-            if (module_sp)
-                return module_sp->GetArchitecture().GetAddressByteSize();
-            return 0;
-        }
+        GetAddressByteSize ();
 
         lldb::ByteOrder
-        GetByteOrder()
-        {
-            if (module_sp)
-                return module_sp->GetArchitecture().GetByteOrder();
-            return lldb::endian::InlHostByteOrder();
-        }
+        GetByteOrder();
 
         lldb_private::ArchSpec
-        GetArchitecture () const
-        {
-            if (module_sp)
-                return module_sp->GetArchitecture();
-            return lldb_private::ArchSpec ();
-        }
+        GetArchitecture () const;
 
         void
         PutToLog (lldb_private::Log *log) const;
diff --git a/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp b/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
index bc87588..5504c64 100644
--- a/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
+++ b/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
@@ -15,8 +15,11 @@
 #include "lldb/Core/DataBufferHeap.h"
 #include "lldb/Core/Log.h"
 #include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/State.h"
+#include "lldb/Symbol/Function.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/ObjCLanguageRuntime.h"
 #include "lldb/Target/RegisterContext.h"
@@ -1771,3 +1774,50 @@
     return 1;
 }
 
+uint32_t
+DynamicLoaderMacOSXDYLD::AddrByteSize()
+{
+    switch (m_dyld.header.magic)
+    {
+        case llvm::MachO::HeaderMagic32:
+        case llvm::MachO::HeaderMagic32Swapped:
+            return 4;
+            
+        case llvm::MachO::HeaderMagic64:
+        case llvm::MachO::HeaderMagic64Swapped:
+            return 8;
+            
+        default:
+            break;
+    }
+    return 0;
+}
+
+lldb::ByteOrder
+DynamicLoaderMacOSXDYLD::GetByteOrderFromMagic (uint32_t magic)
+{
+    switch (magic)
+    {
+        case llvm::MachO::HeaderMagic32:
+        case llvm::MachO::HeaderMagic64:
+            return lldb::endian::InlHostByteOrder();
+            
+        case llvm::MachO::HeaderMagic32Swapped:
+        case llvm::MachO::HeaderMagic64Swapped:
+            if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig)
+                return lldb::eByteOrderLittle;
+            else
+                return lldb::eByteOrderBig;
+            
+        default:
+            break;
+    }
+    return lldb::eByteOrderInvalid;
+}
+
+lldb::ByteOrder
+DynamicLoaderMacOSXDYLD::DYLDImageInfo::GetByteOrder()
+{
+    return DynamicLoaderMacOSXDYLD::GetByteOrderFromMagic(header.magic);
+}
+
diff --git a/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h b/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h
index 9e7ec75..f7e9ac5 100644
--- a/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h
+++ b/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h
@@ -118,45 +118,10 @@
                          lldb::user_id_t break_loc_id);
 
     uint32_t
-    AddrByteSize()
-    {
-        switch (m_dyld.header.magic)
-        {
-            case llvm::MachO::HeaderMagic32:
-            case llvm::MachO::HeaderMagic32Swapped:
-                return 4;
-
-            case llvm::MachO::HeaderMagic64:
-            case llvm::MachO::HeaderMagic64Swapped:
-                return 8;
-
-            default:
-                break;
-        }
-        return 0;
-    }
+    AddrByteSize();
 
     static lldb::ByteOrder
-    GetByteOrderFromMagic (uint32_t magic)
-    {
-        switch (magic)
-        {
-            case llvm::MachO::HeaderMagic32:
-            case llvm::MachO::HeaderMagic64:
-                return lldb::endian::InlHostByteOrder();
-
-            case llvm::MachO::HeaderMagic32Swapped:
-            case llvm::MachO::HeaderMagic64Swapped:
-                if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig)
-                    return lldb::eByteOrderLittle;
-                else
-                    return lldb::eByteOrderBig;
-
-            default:
-                break;
-        }
-        return lldb::eByteOrderInvalid;
-    }
+    GetByteOrderFromMagic (uint32_t magic);
 
     bool
     ReadMachHeader (lldb::addr_t addr,
@@ -269,26 +234,7 @@
         }
 
         lldb::ByteOrder
-        GetByteOrder()
-        {
-            switch (header.magic)
-            {
-            case llvm::MachO::HeaderMagic32:        // MH_MAGIC
-            case llvm::MachO::HeaderMagic64:        // MH_MAGIC_64
-                return lldb::endian::InlHostByteOrder();
-
-            case llvm::MachO::HeaderMagic32Swapped: // MH_CIGAM
-            case llvm::MachO::HeaderMagic64Swapped: // MH_CIGAM_64
-                if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderLittle)
-                    return lldb::eByteOrderBig;
-                else
-                    return lldb::eByteOrderLittle;
-            default:
-                assert (!"invalid header.magic value");
-                break;
-            }
-            return lldb::endian::InlHostByteOrder();
-        }
+        GetByteOrder();
 
         lldb_private::ArchSpec
         GetArchitecture () const
diff --git a/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp b/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
index ee64332..404f4b1 100644
--- a/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
+++ b/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
@@ -13,6 +13,7 @@
 #include "lldb/Core/ArchSpec.h"
 #include "lldb/Core/Error.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/Target.h"
 
diff --git a/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp b/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
index b863f11..251590f 100644
--- a/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
+++ b/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
@@ -12,6 +12,10 @@
 // Other libraries and framework includes
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
+#include "lldb/Core/Section.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Target/Thread.h"
diff --git a/source/Plugins/DynamicLoader/Static/DynamicLoaderStatic.cpp b/source/Plugins/DynamicLoader/Static/DynamicLoaderStatic.cpp
index ef79001..9b15ea8 100644
--- a/source/Plugins/DynamicLoader/Static/DynamicLoaderStatic.cpp
+++ b/source/Plugins/DynamicLoader/Static/DynamicLoaderStatic.cpp
@@ -9,6 +9,8 @@
 
 #include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Section.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/Target.h"
 
 #include "DynamicLoaderStatic.h"
diff --git a/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp b/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
index 1797ef2..aaa3cd3 100644
--- a/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
+++ b/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
@@ -19,6 +19,8 @@
 #include "lldb/Core/ValueObject.h"
 #include "lldb/Core/ValueObjectMemory.h"
 #include "lldb/Symbol/ClangASTContext.h"
+#include "lldb/Symbol/Symbol.h"
+#include "lldb/Symbol/TypeList.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
 #include "lldb/Target/StopInfo.h"
diff --git a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
index f00d947..1e0bf4d 100644
--- a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
+++ b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
@@ -25,11 +25,13 @@
 #include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/Scalar.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/ValueObjectConstResult.h"
 #include "lldb/Expression/ClangFunction.h"
 #include "lldb/Expression/ClangUtilityFunction.h"
 #include "lldb/Symbol/ClangASTContext.h"
+#include "lldb/Symbol/Symbol.h"
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
diff --git a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp
index 00c90c6..fba909b 100644
--- a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp
+++ b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp
@@ -10,6 +10,7 @@
 #include "AppleObjCSymbolVendor.h"
 
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/Target.h"
 
diff --git a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
index 4578801..d84bccd 100644
--- a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
+++ b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
@@ -26,6 +26,7 @@
 #include "lldb/Expression/ClangUtilityFunction.h"
 #include "lldb/Host/FileSpec.h"
 #include "lldb/Symbol/ClangASTContext.h"
+#include "lldb/Symbol/Symbol.h"
 #include "lldb/Target/ObjCLanguageRuntime.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
diff --git a/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp b/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp
index 1d9158a..db4e251 100644
--- a/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp
+++ b/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp
@@ -15,7 +15,6 @@
 #include "lldb/Core/ArchSpec.h"
 #include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
-#include "lldb/Core/RegularExpression.h"
 #include "lldb/Core/Timer.h"
 #include "lldb/Host/Mutex.h"
 #include "lldb/Symbol/ObjectFile.h"
diff --git a/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp b/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
index 45d3cdc..a5babca 100644
--- a/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
+++ b/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp
@@ -18,6 +18,8 @@
 // Project includes
 #include "lldb/Core/Error.h"
 #include "lldb/Core/Debugger.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Host/Host.h"
 
diff --git a/source/Plugins/Platform/Linux/PlatformLinux.cpp b/source/Plugins/Platform/Linux/PlatformLinux.cpp
index c4dd4a8..74de15a 100644
--- a/source/Plugins/Platform/Linux/PlatformLinux.cpp
+++ b/source/Plugins/Platform/Linux/PlatformLinux.cpp
@@ -20,6 +20,7 @@
 #include "lldb/Core/Debugger.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"
diff --git a/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
index 3bdff31..dc5658b 100644
--- a/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
+++ b/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
@@ -16,7 +16,10 @@
 #include "lldb/Breakpoint/BreakpointLocation.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/Error.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Host/Host.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/Target.h"
 
 using namespace lldb;
diff --git a/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp b/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
index 7b1a727..c22c1ab 100644
--- a/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
+++ b/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.cpp
@@ -18,6 +18,7 @@
 #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"
diff --git a/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp b/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp
index 5dfa11b..6e63bd2 100644
--- a/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp
+++ b/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp
@@ -18,6 +18,7 @@
 #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"
diff --git a/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp b/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
index 3c08a14..948ce9f 100644
--- a/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
+++ b/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
@@ -16,8 +16,10 @@
 #include "lldb/Core/ConnectionFileDescriptor.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/State.h"
 #include "lldb/Host/Host.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Target/Thread.h"
 
diff --git a/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp b/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
index a68f7d3..4d634f4 100644
--- a/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
+++ b/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
@@ -10,6 +10,7 @@
 #include "InferiorCallPOSIX.h"
 #include "lldb/Core/StreamFile.h"
 #include "lldb/Core/ValueObject.h"
+#include "lldb/Symbol/ClangASTContext.h"
 #include "lldb/Symbol/SymbolContext.h"
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
diff --git a/source/Plugins/Process/Utility/RegisterContextLLDB.cpp b/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
index cbc98d8..d811fee 100644
--- a/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
+++ b/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
@@ -13,13 +13,15 @@
 #include "lldb/Core/AddressRange.h"
 #include "lldb/Core/DataBufferHeap.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/RegisterValue.h"
 #include "lldb/Core/Value.h"
+#include "lldb/Expression/DWARFExpression.h"
 #include "lldb/Symbol/FuncUnwinders.h"
 #include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/SymbolContext.h"
 #include "lldb/Symbol/Symbol.h"
-#include "lldb/Expression/DWARFExpression.h"
 #include "lldb/Target/ABI.h"
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
diff --git a/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp b/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp
index 90913b9..ffce985 100644
--- a/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp
+++ b/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp
@@ -12,6 +12,9 @@
 // Other libraries and framework includes
 // Project includes
 #include "lldb/Core/ArchSpec.h"
+#include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/Symbol.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/Target.h"
diff --git a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 7045f2b..26104e5 100644
--- a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -31,6 +31,7 @@
 #include "lldb/Host/FileSpec.h"
 #include "lldb/Core/InputReader.h"
 #include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/State.h"
 #include "lldb/Core/StreamFile.h"
diff --git a/source/Plugins/Process/mach-core/ProcessMachCore.cpp b/source/Plugins/Process/mach-core/ProcessMachCore.cpp
index e9fe81e..d82b6a7 100644
--- a/source/Plugins/Process/mach-core/ProcessMachCore.cpp
+++ b/source/Plugins/Process/mach-core/ProcessMachCore.cpp
@@ -18,8 +18,12 @@
 // Other libraries and framework includes
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/State.h"
 #include "lldb/Host/Host.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Target/Thread.h"
 
@@ -452,3 +456,8 @@
 }
 
 
+lldb_private::ObjectFile *
+ProcessMachCore::GetCoreObjectFile ()
+{
+    return m_core_module_sp->GetObjectFile();
+}
diff --git a/source/Plugins/Process/mach-core/ProcessMachCore.h b/source/Plugins/Process/mach-core/ProcessMachCore.h
index e20276f..e5564a9 100644
--- a/source/Plugins/Process/mach-core/ProcessMachCore.h
+++ b/source/Plugins/Process/mach-core/ProcessMachCore.h
@@ -121,10 +121,7 @@
                       lldb_private::ThreadList &new_thread_list);
     
     lldb_private::ObjectFile *
-    GetCoreObjectFile ()
-    {
-        return m_core_module_sp->GetObjectFile();
-    }
+    GetCoreObjectFile ();
 private:
     bool 
     GetDynamicLoaderAddress (lldb::addr_t addr);
diff --git a/source/Plugins/Process/mach-core/ThreadMachCore.cpp b/source/Plugins/Process/mach-core/ThreadMachCore.cpp
index c0eefe1..3568dc7 100644
--- a/source/Plugins/Process/mach-core/ThreadMachCore.cpp
+++ b/source/Plugins/Process/mach-core/ThreadMachCore.cpp
@@ -16,6 +16,7 @@
 #include "lldb/Core/DataExtractor.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/State.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
 #include "lldb/Target/StopInfo.h"
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index bce6c2f..954f13b 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -229,7 +229,7 @@
 TypeList *          
 SymbolFileDWARF::GetTypeList ()
 {
-    if (m_debug_map_symfile)
+    if (GetDebugMapSymfile ())
         return m_debug_map_symfile->GetTypeList();
     return m_obj_file->GetModule()->GetTypeList();
 
@@ -263,6 +263,7 @@
 SymbolFileDWARF::SymbolFileDWARF(ObjectFile* objfile) :
     SymbolFile (objfile),
     UserID (0),  // Used by SymbolFileDWARFDebugMap to when this class parses .o files to contain the .o file index/ID
+    m_debug_map_module_wp (),
     m_debug_map_symfile (NULL),
     m_clang_tu_decl (NULL),
     m_flags(),
@@ -321,7 +322,7 @@
 UniqueDWARFASTTypeMap &
 SymbolFileDWARF::GetUniqueDWARFASTTypeMap ()
 {
-    if (m_debug_map_symfile)
+    if (GetDebugMapSymfile ())
         return m_debug_map_symfile->GetUniqueDWARFASTTypeMap ();
     return m_unique_ast_type_map;
 }
@@ -329,7 +330,7 @@
 ClangASTContext &       
 SymbolFileDWARF::GetClangASTContext ()
 {
-    if (m_debug_map_symfile)
+    if (GetDebugMapSymfile ())
         return m_debug_map_symfile->GetClangASTContext ();
 
     ClangASTContext &ast = m_obj_file->GetModule()->GetClangASTContext();
@@ -659,11 +660,27 @@
 }
 
 DWARFCompileUnit*
-SymbolFileDWARF::GetDWARFCompileUnitForUID(lldb::user_id_t cu_uid)
+SymbolFileDWARF::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit)
 {
     DWARFDebugInfo* info = DebugInfo();
-    if (info && UserIDMatches(cu_uid))
-        return info->GetCompileUnit((dw_offset_t)cu_uid).get();
+    if (info)
+    {
+        if (GetDebugMapSymfile ())
+        {
+            // The debug map symbol file made the compile units for this DWARF
+            // file which is .o file with DWARF in it, and we should have
+            // only 1 compile unit which is at offset zero in the DWARF.
+            // TODO: modify to support LTO .o files where each .o file might
+            // have multiple DW_TAG_compile_unit tags.
+            return info->GetCompileUnit(0).get();
+        }
+        else
+        {
+            // Just a normal DWARF file whose user ID for the compile unit is
+            // the DWARF offset itself
+            return info->GetCompileUnit((dw_offset_t)comp_unit->GetID()).get();
+        }
+    }
     return NULL;
 }
 
@@ -704,59 +721,58 @@
         }
         else
         {
-            ModuleSP module_sp (m_obj_file->GetModule());
-            if (module_sp)
+            if (GetDebugMapSymfile ())
             {
-                const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly ();
-                if (cu_die)
+                // Let the debug map create the compile unit
+                cu_sp = m_debug_map_symfile->GetCompileUnit(this);
+                dwarf_cu->SetUserData(cu_sp.get());
+            }
+            else
+            {
+                ModuleSP module_sp (m_obj_file->GetModule());
+                if (module_sp)
                 {
-                    const char * cu_die_name = cu_die->GetName(this, dwarf_cu);
-                    const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL);
-                    LanguageType cu_language = (LanguageType)cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0);
-                    if (cu_die_name)
+                    const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly ();
+                    if (cu_die)
                     {
-                        std::string ramapped_file;
-                        FileSpec cu_file_spec;
+                        const char * cu_die_name = cu_die->GetName(this, dwarf_cu);
+                        const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL);
+                        LanguageType cu_language = (LanguageType)cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0);
+                        if (cu_die_name)
+                        {
+                            std::string ramapped_file;
+                            FileSpec cu_file_spec;
 
-                        if (cu_die_name[0] == '/' || cu_comp_dir == NULL || cu_comp_dir[0] == '\0')
-                        {
-                            // If we have a full path to the compile unit, we don't need to resolve
-                            // the file.  This can be expensive e.g. when the source files are NFS mounted.
-                            if (module_sp->RemapSourceFile(cu_die_name, ramapped_file))
-                                cu_file_spec.SetFile (ramapped_file.c_str(), false);
-                            else
-                                cu_file_spec.SetFile (cu_die_name, false);
-                        }
-                        else
-                        {
-                            std::string fullpath(cu_comp_dir);
-                            if (*fullpath.rbegin() != '/')
-                                fullpath += '/';
-                            fullpath += cu_die_name;
-                            if (module_sp->RemapSourceFile (fullpath.c_str(), ramapped_file))
-                                cu_file_spec.SetFile (ramapped_file.c_str(), false);
-                            else
-                                cu_file_spec.SetFile (fullpath.c_str(), false);
-                        }
-
-                        cu_sp.reset(new CompileUnit (module_sp,
-                                                     dwarf_cu,
-                                                     cu_file_spec, 
-                                                     MakeUserID(dwarf_cu->GetOffset()),
-                                                     cu_language));
-                        if (cu_sp)
-                        {
-                            dwarf_cu->SetUserData(cu_sp.get());
-                            
-                            if (m_debug_map_symfile)
+                            if (cu_die_name[0] == '/' || cu_comp_dir == NULL || cu_comp_dir[0] == '\0')
                             {
-                                // Let the symbol file register the compile unit with
-                                // the symbol vendor using its compile unit index
-                                // when we are doing DWARF in .o files + debug map
-                                m_debug_map_symfile->SetCompileUnit(this, cu_sp);
+                                // If we have a full path to the compile unit, we don't need to resolve
+                                // the file.  This can be expensive e.g. when the source files are NFS mounted.
+                                if (module_sp->RemapSourceFile(cu_die_name, ramapped_file))
+                                    cu_file_spec.SetFile (ramapped_file.c_str(), false);
+                                else
+                                    cu_file_spec.SetFile (cu_die_name, false);
                             }
                             else
                             {
+                                std::string fullpath(cu_comp_dir);
+                                if (*fullpath.rbegin() != '/')
+                                    fullpath += '/';
+                                fullpath += cu_die_name;
+                                if (module_sp->RemapSourceFile (fullpath.c_str(), ramapped_file))
+                                    cu_file_spec.SetFile (ramapped_file.c_str(), false);
+                                else
+                                    cu_file_spec.SetFile (fullpath.c_str(), false);
+                            }
+
+                            cu_sp.reset(new CompileUnit (module_sp,
+                                                         dwarf_cu,
+                                                         cu_file_spec, 
+                                                         MakeUserID(dwarf_cu->GetOffset()),
+                                                         cu_language));
+                            if (cu_sp)
+                            {
+                                dwarf_cu->SetUserData(cu_sp.get());
+                                
                                 // Figure out the compile unit index if we weren't given one
                                 if (cu_idx == UINT32_MAX)
                                     DebugInfo()->GetCompileUnit(dwarf_cu->GetOffset(), &cu_idx);
@@ -897,18 +913,33 @@
     return NULL;
 }
 
+lldb::LanguageType
+SymbolFileDWARF::ParseCompileUnitLanguage (const SymbolContext& sc)
+{
+    assert (sc.comp_unit);
+    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
+    if (dwarf_cu)
+    {
+        const DWARFDebugInfoEntry *die = dwarf_cu->GetCompileUnitDIEOnly();
+        const uint32_t language = die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0);
+        if (language)
+            return (lldb::LanguageType)language;
+    }
+    return eLanguageTypeUnknown;
+}
+
 size_t
 SymbolFileDWARF::ParseCompileUnitFunctions(const SymbolContext &sc)
 {
     assert (sc.comp_unit);
     size_t functions_added = 0;
-    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID());
+    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
     if (dwarf_cu)
     {
         DWARFDIECollection function_dies;
-        const size_t num_funtions = dwarf_cu->AppendDIEsWithTag (DW_TAG_subprogram, function_dies);
+        const size_t num_functions = dwarf_cu->AppendDIEsWithTag (DW_TAG_subprogram, function_dies);
         size_t func_idx;
-        for (func_idx = 0; func_idx < num_funtions; ++func_idx)
+        for (func_idx = 0; func_idx < num_functions; ++func_idx)
         {
             const DWARFDebugInfoEntry *die = function_dies.GetDIEPtrAtIndex(func_idx);
             if (sc.comp_unit->FindFunctionByUID (MakeUserID(die->GetOffset())).get() == NULL)
@@ -926,7 +957,7 @@
 SymbolFileDWARF::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files)
 {
     assert (sc.comp_unit);
-    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID());
+    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
     assert (dwarf_cu);
     const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly();
 
@@ -1129,7 +1160,7 @@
     if (sc.comp_unit->GetLineTable() != NULL)
         return true;
 
-    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID());
+    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
     if (dwarf_cu)
     {
         const DWARFDebugInfoEntry *dwarf_cu_die = dwarf_cu->GetCompileUnitDIEOnly();
@@ -1146,7 +1177,7 @@
                         m_obj_file->GetSectionList(), 
                         0, 
                         0, 
-                        m_debug_map_symfile != NULL, 
+                        GetDebugMapSymfile () != NULL,
                         false, 
                         DWARFDebugLine::Row(), 
                         SectionSP(), 
@@ -2462,7 +2493,8 @@
             for (cu_idx = 0; (dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx)) != NULL; ++cu_idx)
             {
                 CompileUnit *dc_cu = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
-                bool file_spec_matches_cu_file_spec = dc_cu != NULL && FileSpec::Compare(file_spec, *dc_cu, false) == 0;
+                const bool full_match = file_spec.GetDirectory();
+                bool file_spec_matches_cu_file_spec = dc_cu != NULL && FileSpec::Equal(file_spec, *dc_cu, full_match);
                 if (check_inlines || file_spec_matches_cu_file_spec)
                 {
                     SymbolContext sc (m_obj_file->GetModule());
@@ -4339,7 +4371,7 @@
                 }
             }
         }
-        if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolNo && m_debug_map_symfile)
+        if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolNo && GetDebugMapSymfile ())
             return m_debug_map_symfile->Supports_DW_AT_APPLE_objc_complete_type (this);
     }
     return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
@@ -5399,7 +5431,7 @@
                             // know it is false), so the real definition is in here somewhere
                             type_sp = FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true);
 
-                            if (!type_sp && m_debug_map_symfile)
+                            if (!type_sp && GetDebugMapSymfile ())
                             {
                                 // We weren't able to find a full declaration in
                                 // this DWARF, see if we have a declaration anywhere    
@@ -5453,7 +5485,7 @@
                         //type_sp = FindDefinitionTypeForDIE (dwarf_cu, die, type_name_const_str);
                         type_sp = FindDefinitionTypeForDWARFDeclContext (die_decl_ctx);
 
-                        if (!type_sp && m_debug_map_symfile)
+                        if (!type_sp && GetDebugMapSymfile ())
                         {
                             // We weren't able to find a full declaration in
                             // this DWARF, see if we have a declaration anywhere    
@@ -6333,7 +6365,7 @@
 {
     assert(sc.comp_unit && sc.function);
     size_t functions_added = 0;
-    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID());
+    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
     if (dwarf_cu)
     {
         dw_offset_t function_die_offset = sc.function->GetID();
@@ -6354,7 +6386,7 @@
     // At least a compile unit must be valid
     assert(sc.comp_unit);
     size_t types_added = 0;
-    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID());
+    DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit);
     if (dwarf_cu)
     {
         if (sc.function)
@@ -6619,7 +6651,7 @@
                         {
                             scope = eValueTypeVariableGlobal;
 
-                            if (m_debug_map_symfile)
+                            if (GetDebugMapSymfile ())
                             {
                                 // When leaving the DWARF in the .o files on darwin,
                                 // when we have a global variable that wasn't initialized,
@@ -7153,4 +7185,20 @@
 }
 
 
+SymbolFileDWARFDebugMap *
+SymbolFileDWARF::GetDebugMapSymfile ()
+{
+    if (m_debug_map_symfile == NULL && !m_debug_map_module_wp.expired())
+    {
+        lldb::ModuleSP module_sp (m_debug_map_module_wp.lock());
+        if (module_sp)
+        {
+            SymbolVendor *sym_vendor = module_sp->GetSymbolVendor();
+            if (sym_vendor)
+                m_debug_map_symfile = (SymbolFileDWARFDebugMap *)sym_vendor->GetSymbolFile();
+        }
+    }
+    return m_debug_map_symfile;
+}
+
 
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index f8f0846..64f7fc4 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -43,6 +43,7 @@
 //----------------------------------------------------------------------
 // Forward Declarations for this DWARF plugin
 //----------------------------------------------------------------------
+class DebugMapModule;
 class DWARFAbbreviationDeclaration;
 class DWARFAbbreviationDeclarationSet;
 class DWARFileUnit;
@@ -62,7 +63,7 @@
 {
 public:
     friend class SymbolFileDWARFDebugMap;    
-
+    friend class DebugMapModule;
     //------------------------------------------------------------------
     // Static Functions
     //------------------------------------------------------------------
@@ -95,6 +96,7 @@
     virtual uint32_t        GetNumCompileUnits();
     virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index);
 
+    virtual lldb::LanguageType ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc);
     virtual size_t          ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc);
     virtual bool            ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc);
     virtual bool            ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc, lldb_private::FileSpecList& support_files);
@@ -301,7 +303,7 @@
 
     DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF);
     lldb::CompUnitSP        ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx);
-    DWARFCompileUnit*       GetDWARFCompileUnitForUID(lldb::user_id_t cu_uid);
+    DWARFCompileUnit*       GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit);
     DWARFCompileUnit*       GetNextUnparsedDWARFCompileUnit(DWARFCompileUnit* prev_cu);
     lldb_private::CompileUnit*      GetCompUnitForDWARFCompUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx = UINT32_MAX);
     bool                    GetFunction (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* func_die, lldb_private::SymbolContext& sc);
@@ -440,10 +442,13 @@
     
     void                    DumpIndexes();
 
-    void                    SetDebugMapSymfile (SymbolFileDWARFDebugMap *debug_map_symfile)
+    void                    SetDebugMapModule (const lldb::ModuleSP &module_sp)
                             {
-                                m_debug_map_symfile = debug_map_symfile;
+                                m_debug_map_module_wp = module_sp;
                             }
+    
+    SymbolFileDWARFDebugMap *
+                            GetDebugMapSymfile ();
 
     const DWARFDebugInfoEntry *
                             FindBlockContainingSpecification (dw_offset_t func_die_offset, 
@@ -532,6 +537,7 @@
                                 DWARFCompileUnit* dst_cu,
                                 const DWARFDebugInfoEntry *dst_class_die);
 
+    lldb::ModuleWP                  m_debug_map_module_wp;
     SymbolFileDWARFDebugMap *       m_debug_map_symfile;
     clang::TranslationUnitDecl *    m_clang_tu_decl;
     lldb_private::Flags             m_flags;
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 0ed6843..4e1b41c 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -13,10 +13,14 @@
 #include "lldb/Core/ModuleList.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/RegularExpression.h"
+#include "lldb/Core/Section.h"
+#if defined(DEBUG_OSO_DMAP)
 #include "lldb/Core/StreamFile.h"
+#endif
 #include "lldb/Core/Timer.h"
 
 #include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
+#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/SymbolVendor.h"
 #include "lldb/Symbol/VariableList.h"
@@ -27,6 +31,248 @@
 using namespace lldb;
 using namespace lldb_private;
 
+// Subclass lldb_private::Module so we can intercept the "Module::GetObjectFile()" 
+// (so we can fixup the object file sections) and also for "Module::GetSymbolVendor()"
+// (so we can fixup the symbol file id.
+
+class DebugMapModule : public Module
+{
+public:
+    DebugMapModule (const ModuleSP &exe_module_sp,
+                    uint32_t cu_idx,
+                    const FileSpec& file_spec,
+                    const ArchSpec& arch,
+                    const ConstString *object_name,
+                    off_t object_offset) :
+        Module (file_spec, arch, object_name, object_offset),
+        m_exe_module_wp (exe_module_sp),
+        m_cu_idx (cu_idx)
+    {
+    }
+
+    virtual ObjectFile *
+    GetObjectFile ()
+    {
+        Mutex::Locker locker (m_mutex);
+        if (m_did_load_objfile == false)
+        {
+            ModuleSP exe_module_sp (m_exe_module_wp.lock());
+            if (exe_module_sp)
+            {
+                ObjectFile *exe_objfile = exe_module_sp->GetObjectFile();
+                ObjectFile *oso_objfile = Module::GetObjectFile();
+                SymbolVendor *exe_sym_vendor = exe_module_sp->GetSymbolVendor();
+
+                if (exe_objfile && oso_objfile && exe_sym_vendor)
+                {
+                    SymbolFileDWARFDebugMap *exe_symfile = (SymbolFileDWARFDebugMap *)exe_sym_vendor->GetSymbolFile();
+                    if (exe_symfile)
+                    {
+                        SymbolFileDWARFDebugMap::CompileUnitInfo *comp_unit_info = exe_symfile->GetCompUnitInfo (this);
+                        if (comp_unit_info)
+                        {
+                            // Set the ID of the symbol file DWARF to the index of the OSO
+                            // shifted left by 32 bits to provide a unique prefix for any
+                            // UserID's that get created in the symbol file.
+                            //comp_unit_info->exe_sections_sp.reset(new SectionList);
+                            
+                            Symtab *exe_symtab = exe_objfile->GetSymtab();
+                            ModuleSP oso_module_sp (oso_objfile->GetModule());
+                            Symtab *oso_symtab = oso_objfile->GetSymtab();
+                            //#define DEBUG_OSO_DMAP    // Do not check in with this defined...
+#if defined(DEBUG_OSO_DMAP)
+                            StreamFile s(stdout);
+                            s << "OSO symtab:\n";
+                            oso_symtab->Dump(&s, NULL);
+                            s << "OSO sections before:\n";
+                            oso_objfile->GetSectionList()->Dump(&s, NULL, true);
+#endif
+                    
+                            ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
+                            //SectionList *oso_sections = oso_objfile->Sections();
+                            // Now we need to make sections that map from zero based object
+                            // file addresses to where things eneded up in the main executable.
+
+                            assert (comp_unit_info->first_symbol_index != UINT32_MAX);
+                            // End index is one past the last valid symbol index
+                            const uint32_t oso_end_idx = comp_unit_info->last_symbol_index + 1;
+                            uint32_t sect_id = 0x10000;
+                            for (uint32_t idx = comp_unit_info->first_symbol_index + 2; // Skip the N_SO and N_OSO
+                                 idx < oso_end_idx;
+                                 ++idx)
+                            {
+                                Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
+                                if (exe_symbol)
+                                {
+                                    if (exe_symbol->IsDebug() == false)
+                                        continue;
+                                    
+                                    switch (exe_symbol->GetType())
+                                    {
+                                        default:
+                                            break;
+                                            
+                                        case eSymbolTypeCode:
+                                        {
+                                            // For each N_FUN, or function that we run into in the debug map
+                                            // we make a new section that we add to the sections found in the
+                                            // .o file. This new section has the file address set to what the
+                                            // addresses are in the .o file, and the load address is adjusted
+                                            // to match where it ended up in the final executable! We do this
+                                            // before we parse any dwarf info so that when it goes get parsed
+                                            // all section/offset addresses that get registered will resolve
+                                            // correctly to the new addresses in the main executable.
+                                            
+                                            // First we find the original symbol in the .o file's symbol table
+                                            Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny);
+                                            if (oso_fun_symbol)
+                                            {
+                                                // If we found the symbol, then we
+                                                SectionSP exe_fun_section (exe_symbol->GetAddress().GetSection());
+                                                SectionSP oso_fun_section (oso_fun_symbol->GetAddress().GetSection());
+                                                if (oso_fun_section)
+                                                {
+                                                    // Now we create a section that we will add as a child of the
+                                                    // section in which the .o symbol (the N_FUN) exists.
+                                                    
+                                                    // We use the exe_symbol size because the one in the .o file
+                                                    // will just be a symbol with no size, and the exe_symbol
+                                                    // size will reflect any size changes (ppc has been known to
+                                                    // shrink function sizes when it gets rid of jump islands that
+                                                    // aren't needed anymore).
+                                                    SectionSP oso_fun_section_sp (new Section (oso_fun_symbol->GetAddress().GetSection(),
+                                                                                               oso_module_sp,                         // Module (the .o file)
+                                                                                               sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
+                                                                                               exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
+                                                                                               eSectionTypeDebug,
+                                                                                               oso_fun_symbol->GetAddress().GetOffset(),  // File VM address offset in the current section
+                                                                                               exe_symbol->GetByteSize(),          // File size (we need the size from the executable)
+                                                                                               0, 0, 0));
+                                                    
+                                                    oso_fun_section_sp->SetLinkedLocation (exe_fun_section,
+                                                                                           exe_symbol->GetAddress().GetFileAddress() - exe_fun_section->GetFileAddress());
+                                                    oso_fun_section->GetChildren().AddSection(oso_fun_section_sp);
+                                                }
+                                            }
+                                        }
+                                            break;
+                                            
+                                        case eSymbolTypeData:
+                                        {
+                                            // For each N_GSYM we remap the address for the global by making
+                                            // a new section that we add to the sections found in the .o file.
+                                            // This new section has the file address set to what the
+                                            // addresses are in the .o file, and the load address is adjusted
+                                            // to match where it ended up in the final executable! We do this
+                                            // before we parse any dwarf info so that when it goes get parsed
+                                            // all section/offset addresses that get registered will resolve
+                                            // correctly to the new addresses in the main executable. We
+                                            // initially set the section size to be 1 byte, but will need to
+                                            // fix up these addresses further after all globals have been
+                                            // parsed to span the gaps, or we can find the global variable
+                                            // sizes from the DWARF info as we are parsing.
+                                            
+                                            // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file
+                                            Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(),
+                                                                                                                  eSymbolTypeData,
+                                                                                                                  Symtab::eDebugNo,
+                                                                                                                  Symtab::eVisibilityAny);
+                                            
+                                            if (exe_symbol && oso_gsym_symbol && exe_symbol->ValueIsAddress() && oso_gsym_symbol->ValueIsAddress())
+                                            {
+                                                // If we found the symbol, then we
+                                                SectionSP exe_gsym_section (exe_symbol->GetAddress().GetSection());
+                                                SectionSP oso_gsym_section (oso_gsym_symbol->GetAddress().GetSection());
+                                                if (oso_gsym_section)
+                                                {
+                                                    SectionSP oso_gsym_section_sp (new Section (oso_gsym_symbol->GetAddress().GetSection(),
+                                                                                                oso_module_sp,                         // Module (the .o file)
+                                                                                                sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
+                                                                                                exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
+                                                                                                eSectionTypeDebug,
+                                                                                                oso_gsym_symbol->GetAddress().GetOffset(),  // File VM address offset in the current section
+                                                                                                1,                                   // We don't know the size of the global, just do the main address for now.
+                                                                                                0, 0, 0));
+                                                    
+                                                    oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section,
+                                                                                            exe_symbol->GetAddress().GetFileAddress() - exe_gsym_section->GetFileAddress());
+                                                    oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp);
+                                                }
+                                            }
+                                        }
+                                            break;
+                                    }
+                                }
+                            }
+                            oso_objfile->GetSectionList()->Finalize(); // Now that we're done adding sections, finalize to build fast-lookup caches
+#if defined(DEBUG_OSO_DMAP)
+                            s << "OSO sections after:\n";
+                            oso_objfile->GetSectionList()->Dump(&s, NULL, true);
+#endif
+                        }
+                    }
+                }
+            }
+        }
+        return m_objfile_sp.get();
+    }
+    
+    virtual SymbolVendor*
+    GetSymbolVendor(bool can_create = true)
+    {
+        // Scope for locker
+        if (m_symfile_ap.get() || can_create == false)
+            return m_symfile_ap.get();
+
+        ModuleSP exe_module_sp (m_exe_module_wp.lock());
+        if (exe_module_sp)
+        {
+            // Now get the object file outside of a locking scope
+            ObjectFile *oso_objfile = GetObjectFile ();
+            if (oso_objfile)
+            {
+                Mutex::Locker locker (m_mutex);
+                SymbolVendor* symbol_vendor = Module::GetSymbolVendor(can_create);
+                if (symbol_vendor)
+                {
+                    // Set a a pointer to this class to set our OSO DWARF file know
+                    // that the DWARF is being used along with a debug map and that
+                    // it will have the remapped sections that we do below.
+                    SymbolFileDWARF *oso_symfile = (SymbolFileDWARF *)symbol_vendor->GetSymbolFile();
+                    
+                    if (!oso_symfile)
+                        return NULL;
+
+                    ObjectFile *exe_objfile = exe_module_sp->GetObjectFile();
+                    SymbolVendor *exe_sym_vendor = exe_module_sp->GetSymbolVendor();
+                    
+                    if (exe_objfile && exe_sym_vendor)
+                    {
+                        if (oso_symfile->GetNumCompileUnits() == 1)
+                        {
+                            oso_symfile->SetDebugMapModule(exe_module_sp);
+                            // Set the ID of the symbol file DWARF to the index of the OSO
+                            // shifted left by 32 bits to provide a unique prefix for any
+                            // UserID's that get created in the symbol file.
+                            oso_symfile->SetID (((uint64_t)m_cu_idx + 1ull) << 32ull);
+                        }
+                        else
+                        {
+                            oso_symfile->SetID (UINT64_MAX);
+                        }
+                    }
+                    return symbol_vendor;
+                }
+            }
+        }
+        return NULL;
+    }
+
+protected:
+    ModuleWP m_exe_module_wp;
+    const uint32_t m_cu_idx;
+};
+
 void
 SymbolFileDWARFDebugMap::Initialize()
 {
@@ -93,7 +339,7 @@
 
 
 void
-SymbolFileDWARFDebugMap::InitOSO ()
+SymbolFileDWARFDebugMap::InitOSO()
 {
     if (m_flags.test(kHaveInitializedOSOs))
         return;
@@ -110,9 +356,10 @@
         LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
 
         std::vector<uint32_t> oso_indexes;
+#if defined(DEBUG_OSO_DMAP)
 //      StreamFile s(stdout);
 //      symtab->Dump(&s, NULL, eSortOrderNone);
-
+#endif
         // When a mach-o symbol is encoded, the n_type field is encoded in bits
         // 23:16, and the n_desc field is encoded in bits 15:0.
         // 
@@ -138,24 +385,30 @@
 
             for (uint32_t i=0; i<oso_index_count; ++i)
             {
-                m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1);
-                if (m_compile_unit_infos[i].so_symbol->GetSiblingIndex() == 0)
-                    m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 2);
-                m_compile_unit_infos[i].oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]);
-                uint32_t sibling_idx = m_compile_unit_infos[i].so_symbol->GetSiblingIndex();
+                const Symbol *so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1);
+                const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]);
+                assert (so_symbol);
+                assert (oso_symbol);
+                assert (so_symbol->GetType() == eSymbolTypeSourceFile);
+                assert (oso_symbol->GetType() == eSymbolTypeObjectFile);
+                m_compile_unit_infos[i].so_file.SetFile(so_symbol->GetName().AsCString(), true);
+                m_compile_unit_infos[i].oso_file.SetFile(oso_symbol->GetName().AsCString(), true);
+                uint32_t sibling_idx = so_symbol->GetSiblingIndex();
                 // The sibling index can't be less that or equal to the current index "i"
                 if (sibling_idx <= i)
                 {
-                    m_obj_file->GetModule()->ReportError ("N_SO in symbol with UID %u has invalid sibling in debug map, please file a bug and attach the binary listed in this error", m_compile_unit_infos[i].so_symbol->GetID());
+                    m_obj_file->GetModule()->ReportError ("N_SO in symbol with UID %u has invalid sibling in debug map, please file a bug and attach the binary listed in this error", so_symbol->GetID());
                 }
                 else
                 {
-                    m_compile_unit_infos[i].last_symbol = symtab->SymbolAtIndex (sibling_idx - 1);
-                    m_compile_unit_infos[i].first_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].so_symbol);
-                    m_compile_unit_infos[i].last_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].last_symbol);
+                    const Symbol* last_symbol = symtab->SymbolAtIndex (sibling_idx - 1);
+                    m_compile_unit_infos[i].first_symbol_index = symtab->GetIndexForSymbol(so_symbol);
+                    m_compile_unit_infos[i].last_symbol_index = symtab->GetIndexForSymbol(last_symbol);
+                    m_compile_unit_infos[i].first_symbol_id = so_symbol->GetID();
+                    m_compile_unit_infos[i].last_symbol_id = last_symbol->GetID();
                     
                     if (log)
-                        log->Printf("Initialized OSO 0x%8.8x: file=%s", i, m_compile_unit_infos[i].oso_symbol->GetName().GetCString());
+                        log->Printf("Initialized OSO 0x%8.8x: file=%s", i, oso_symbol->GetName().GetCString());
                 }
             }
         }
@@ -176,19 +429,33 @@
 {
     if (comp_unit_info->oso_module_sp.get() == NULL && comp_unit_info->symbol_file_supported)
     {
-        Symbol *oso_symbol = comp_unit_info->oso_symbol;
-        if (oso_symbol)
+        if (!comp_unit_info->oso_file.Exists())
         {
-            FileSpec oso_file_spec(oso_symbol->GetMangled().GetName().AsCString(), true);
-            // Always create a new module for .o files. Why? Because we
-            // use the debug map, to add new sections to each .o file and
-            // even though a .o file might not have changed, the sections
-            // that get added to the .o file can change.
-            comp_unit_info->oso_module_sp.reset (new Module (oso_file_spec, 
-                                                             m_obj_file->GetModule()->GetArchitecture(),
-                                                             NULL, 
-                                                             0));
+            char path[PATH_MAX*2];
+            comp_unit_info->oso_file.GetPath(path, sizeof(path));
+            if (ObjectFile::SplitArchivePathWithObject (path,
+                                                        comp_unit_info->oso_file,
+                                                        comp_unit_info->oso_object))
+            {
+                comp_unit_info->oso_file.GetPath(path, sizeof(path));
+                //printf ("resolved archive '%s' and object '%s'\n", path, comp_unit_info->oso_object.GetCString());
+            }
+            else
+            {
+                comp_unit_info->symbol_file_supported = false;
+                return false;
+            }
         }
+        // Always create a new module for .o files. Why? Because we
+        // use the debug map, to add new sections to each .o file and
+        // even though a .o file might not have changed, the sections
+        // that get added to the .o file can change.
+        comp_unit_info->oso_module_sp.reset (new DebugMapModule (GetObjectFile()->GetModule(),
+                                                                 GetCompUnitInfoIndex(comp_unit_info),
+                                                                 comp_unit_info->oso_file,
+                                                                 m_obj_file->GetModule()->GetArchitecture(),
+                                                                 comp_unit_info->oso_object ? &comp_unit_info->oso_object : NULL,
+                                                                 0));
     }
     return comp_unit_info->oso_module_sp.get();
 }
@@ -199,19 +466,11 @@
 {
     if (oso_idx < m_compile_unit_infos.size())
     {
-        if (!m_compile_unit_infos[oso_idx].so_file)
+        if (m_compile_unit_infos[oso_idx].so_file)
         {
-
-            if (m_compile_unit_infos[oso_idx].so_symbol == NULL)
-                return false;
-
-            std::string so_path (m_compile_unit_infos[oso_idx].so_symbol->GetMangled().GetName().AsCString());
-            if (m_compile_unit_infos[oso_idx].so_symbol[1].GetType() == eSymbolTypeSourceFile)
-                so_path += m_compile_unit_infos[oso_idx].so_symbol[1].GetMangled().GetName().AsCString();
-            m_compile_unit_infos[oso_idx].so_file.SetFile(so_path.c_str(), true);
+            file_spec = m_compile_unit_infos[oso_idx].so_file;
+            return true;
         }
-        file_spec = m_compile_unit_infos[oso_idx].so_file;
-        return true;
     }
     return false;
 }
@@ -270,182 +529,13 @@
 SymbolFileDWARF *
 SymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info)
 {
-    if (comp_unit_info->oso_symbol_vendor == NULL && comp_unit_info->symbol_file_supported)
+    Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info);
+    if (oso_module)
     {
-        ObjectFile *oso_objfile = GetObjectFileByCompUnitInfo (comp_unit_info);
-
-        if (oso_objfile)
-        {
-            comp_unit_info->oso_symbol_vendor = oso_objfile->GetModule()->GetSymbolVendor();
-//          SymbolFileDWARF *oso_dwarf = new SymbolFileDWARF(oso_objfile);
-//          comp_unit_info->oso_dwarf_sp.reset (oso_dwarf);
-            if (comp_unit_info->oso_symbol_vendor)
-            {
-                // Set a a pointer to this class to set our OSO DWARF file know
-                // that the DWARF is being used along with a debug map and that
-                // it will have the remapped sections that we do below.
-                SymbolFileDWARF *oso_symfile = (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile();
-                
-                if (!oso_symfile)
-                    return NULL;
-                
-                if (oso_symfile->GetNumCompileUnits() != 1)
-                {
-                    oso_symfile->GetObjectFile()->GetModule()->ReportError ("DWARF for object file '%s' contains multiple translation units!",
-                                                                            oso_symfile->GetObjectFile()->GetFileSpec().GetFilename().AsCString());
-                    comp_unit_info->symbol_file_supported = false;
-                    comp_unit_info->oso_module_sp.reset();
-                    comp_unit_info->oso_compile_unit_sp.reset();
-                    comp_unit_info->oso_symbol_vendor = NULL;
-                    return NULL;
-                }
-                
-                oso_symfile->SetDebugMapSymfile(this);
-                // Set the ID of the symbol file DWARF to the index of the OSO
-                // shifted left by 32 bits to provide a unique prefix for any
-                // UserID's that get created in the symbol file.
-                oso_symfile->SetID (((uint64_t)GetCompUnitInfoIndex(comp_unit_info) + 1ull) << 32ull);
-                comp_unit_info->debug_map_sections_sp.reset(new SectionList);
-
-                Symtab *exe_symtab = m_obj_file->GetSymtab();
-                ModuleSP oso_module_sp (oso_objfile->GetModule());
-                Symtab *oso_symtab = oso_objfile->GetSymtab();
-//#define DEBUG_OSO_DMAP    // Do not check in with this defined...
-#if defined(DEBUG_OSO_DMAP)
-                StreamFile s(stdout);
-                s << "OSO symtab:\n";
-                oso_symtab->Dump(&s, NULL);
-                s << "OSO sections before:\n";
-                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
-#endif
-
-                ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
-                //SectionList *oso_sections = oso_objfile->Sections();
-                // Now we need to make sections that map from zero based object
-                // file addresses to where things eneded up in the main executable.
-                uint32_t oso_start_idx = exe_symtab->GetIndexForSymbol (comp_unit_info->oso_symbol);
-                assert (oso_start_idx != UINT32_MAX);
-                oso_start_idx += 1;
-                const uint32_t oso_end_idx = comp_unit_info->so_symbol->GetSiblingIndex();
-                uint32_t sect_id = 0x10000;
-                for (uint32_t idx = oso_start_idx; idx < oso_end_idx; ++idx)
-                {
-                    Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
-                    if (exe_symbol)
-                    {
-                        if (exe_symbol->IsDebug() == false)
-                            continue;
-
-                        switch (exe_symbol->GetType())
-                        {
-                        default:
-                            break;
-
-                        case eSymbolTypeCode:
-                            {
-                                // For each N_FUN, or function that we run into in the debug map
-                                // we make a new section that we add to the sections found in the
-                                // .o file. This new section has the file address set to what the
-                                // addresses are in the .o file, and the load address is adjusted
-                                // to match where it ended up in the final executable! We do this
-                                // before we parse any dwarf info so that when it goes get parsed
-                                // all section/offset addresses that get registered will resolve
-                                // correctly to the new addresses in the main executable.
-
-                                // First we find the original symbol in the .o file's symbol table
-                                Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny);
-                                if (oso_fun_symbol)
-                                {
-                                    // If we found the symbol, then we
-                                    SectionSP exe_fun_section (exe_symbol->GetAddress().GetSection());
-                                    SectionSP oso_fun_section (oso_fun_symbol->GetAddress().GetSection());
-                                    if (oso_fun_section)
-                                    {
-                                        // Now we create a section that we will add as a child of the
-                                        // section in which the .o symbol (the N_FUN) exists.
-
-                                        // We use the exe_symbol size because the one in the .o file
-                                        // will just be a symbol with no size, and the exe_symbol
-                                        // size will reflect any size changes (ppc has been known to
-                                        // shrink function sizes when it gets rid of jump islands that
-                                        // aren't needed anymore).
-                                        SectionSP oso_fun_section_sp (new Section (oso_fun_symbol->GetAddress().GetSection(),
-                                                                                        oso_module_sp,                         // Module (the .o file)
-                                                                                        sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
-                                                                                        exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
-                                                                                        eSectionTypeDebug,
-                                                                                        oso_fun_symbol->GetAddress().GetOffset(),  // File VM address offset in the current section
-                                                                                        exe_symbol->GetByteSize(),          // File size (we need the size from the executable)
-                                                                                        0, 0, 0));
-
-                                        oso_fun_section_sp->SetLinkedLocation (exe_fun_section,
-                                                                               exe_symbol->GetAddress().GetFileAddress() - exe_fun_section->GetFileAddress());
-                                        oso_fun_section->GetChildren().AddSection(oso_fun_section_sp);
-                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp);
-                                    }
-                                }
-                            }
-                            break;
-
-                        case eSymbolTypeData:
-                            {
-                                // For each N_GSYM we remap the address for the global by making
-                                // a new section that we add to the sections found in the .o file.
-                                // This new section has the file address set to what the
-                                // addresses are in the .o file, and the load address is adjusted
-                                // to match where it ended up in the final executable! We do this
-                                // before we parse any dwarf info so that when it goes get parsed
-                                // all section/offset addresses that get registered will resolve
-                                // correctly to the new addresses in the main executable. We
-                                // initially set the section size to be 1 byte, but will need to
-                                // fix up these addresses further after all globals have been
-                                // parsed to span the gaps, or we can find the global variable
-                                // sizes from the DWARF info as we are parsing.
-
-                                // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file
-                                Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(), 
-                                                                                                      eSymbolTypeData, 
-                                                                                                      Symtab::eDebugNo, 
-                                                                                                      Symtab::eVisibilityAny);
-
-                                if (exe_symbol && oso_gsym_symbol && exe_symbol->ValueIsAddress() && oso_gsym_symbol->ValueIsAddress())
-                                {
-                                    // If we found the symbol, then we
-                                    SectionSP exe_gsym_section (exe_symbol->GetAddress().GetSection());
-                                    SectionSP oso_gsym_section (oso_gsym_symbol->GetAddress().GetSection());
-                                    if (oso_gsym_section)
-                                    {
-                                        SectionSP oso_gsym_section_sp (new Section (oso_gsym_symbol->GetAddress().GetSection(),
-                                                                                    oso_module_sp,                         // Module (the .o file)
-                                                                                    sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
-                                                                                    exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
-                                                                                    eSectionTypeDebug,
-                                                                                    oso_gsym_symbol->GetAddress().GetOffset(),  // File VM address offset in the current section
-                                                                                    1,                                   // We don't know the size of the global, just do the main address for now.
-                                                                                    0, 0, 0));
-
-                                        oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section,
-                                                                                exe_symbol->GetAddress().GetFileAddress() - exe_gsym_section->GetFileAddress());
-                                        oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp);
-                                        comp_unit_info->debug_map_sections_sp->AddSection(oso_gsym_section_sp);
-                                    }
-                                }
-                            }
-                            break;
-                        }
-                    }
-                }
-                oso_objfile->GetSectionList()->Finalize(); // Now that we're done adding sections, finalize to build fast-lookup caches
-                comp_unit_info->debug_map_sections_sp->Finalize();
-#if defined(DEBUG_OSO_DMAP)
-                s << "OSO sections after:\n";
-                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
-#endif
-            }
-        }
+        SymbolVendor *sym_vendor = oso_module->GetSymbolVendor();
+        if (sym_vendor)
+            return (SymbolFileDWARF *)sym_vendor->GetSymbolFile();
     }
-    if (comp_unit_info->oso_symbol_vendor)
-        return (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile();
     return NULL;
 }
 
@@ -468,16 +558,19 @@
                                          SymbolFile::VariableTypes |
                                          SymbolFile::LineTables;
 
-        for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx)
-        {
-            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
-            if (oso_dwarf)
-            {
-                uint32_t oso_abilities = oso_dwarf->GetAbilities();
-                if ((oso_abilities & dwarf_abilities) == dwarf_abilities)
-                    return oso_abilities;
-            }
-        }
+        InitOSO();
+        if (!m_compile_unit_infos.empty())
+            return dwarf_abilities;
+//        for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx)
+//        {
+//            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
+//            if (oso_dwarf)
+//            {
+//                uint32_t oso_abilities = oso_dwarf->GetAbilities();
+//                if ((oso_abilities & dwarf_abilities) == dwarf_abilities)
+//                    return oso_abilities;
+//            }
+//        }
     }
     return 0;
 }
@@ -501,30 +594,34 @@
         if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL &&
             m_compile_unit_infos[cu_idx].symbol_file_supported)
         {
-            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (cu_idx);
-            if (oso_dwarf)
+            FileSpec so_file_spec;
+            if (GetFileSpecForSO (cu_idx, so_file_spec))
             {
-                // There is only one compile unit for N_OSO entry right now, so
-                // it will always exist at index zero.
-                m_compile_unit_infos[cu_idx].oso_compile_unit_sp = m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetCompileUnitAtIndex (0);
-            }
+                Module *oso_module = GetModuleByOSOIndex (cu_idx);
+                if (oso_module)
+                {
+                     // User zero as the ID to match the compile unit at offset
+                     // zero in each .o file since each .o file can only have
+                     // one compile unit for now.
+                    lldb::user_id_t cu_id = 0;
+                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset (new CompileUnit (oso_module->shared_from_this(),
+                                                                                             NULL,
+                                                                                             so_file_spec,
+                                                                                             cu_id,
+                                                                                             eLanguageTypeUnknown));
+                }
 
-            if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL)
-            {
-                // We weren't able to get the DWARF for this N_OSO entry (the
-                // .o file may be missing or not at the specified path), make
-                // one up as best we can from the debug map. We set the uid
-                // of the compile unit to the symbol index with the MSBit set
-                // so that it doesn't collide with any uid values from the DWARF
-                Symbol *so_symbol = m_compile_unit_infos[cu_idx].so_symbol;
-                if (so_symbol)
+                if (!m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
                 {
                     m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(),
                                                                                             NULL,
-                                                                                            so_symbol->GetMangled().GetName().AsCString(),
+                                                                                            so_file_spec,
                                                                                             cu_idx,
                                                                                             eLanguageTypeUnknown));
-
+                }
+            
+                if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
+                {
                     // Let our symbol vendor know about this compile unit
                     m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (cu_idx,
                                                                                        m_compile_unit_infos[cu_idx].oso_compile_unit_sp);
@@ -549,6 +646,28 @@
     return NULL;
 }
 
+
+SymbolFileDWARFDebugMap::CompileUnitInfo *
+SymbolFileDWARFDebugMap::GetCompUnitInfo (const lldb_private::Module *module)
+{
+    const uint32_t cu_count = GetNumCompileUnits();
+    for (uint32_t i=0; i<cu_count; ++i)
+    {
+        if (module == m_compile_unit_infos[i].oso_module_sp.get())
+            return &m_compile_unit_infos[i];
+    }
+    return NULL;
+}
+
+lldb::LanguageType
+SymbolFileDWARFDebugMap::ParseCompileUnitLanguage (const SymbolContext& sc)
+{
+    SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
+    if (oso_dwarf)
+        return oso_dwarf->ParseCompileUnitLanguage (sc);
+    return eLanguageTypeUnknown;
+}
+
 size_t
 SymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc)
 {
@@ -602,7 +721,7 @@
 {
     SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
     if (oso_dwarf)
-        return oso_dwarf->ParseTypes (sc);
+        return oso_dwarf->ParseVariablesForContext (sc);
     return 0;
 }
 
@@ -669,24 +788,31 @@
 uint32_t
 SymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
 {
-    uint32_t initial = sc_list.GetSize();
+    const uint32_t initial = sc_list.GetSize();
     const uint32_t cu_count = GetNumCompileUnits();
 
-    FileSpec so_file_spec;
     for (uint32_t i=0; i<cu_count; ++i)
     {
-        if (GetFileSpecForSO (i, so_file_spec))
+        // If we are checking for inlines, then we need to look through all
+        // compile units no matter if "file_spec" matches.
+        bool resolve = check_inlines;
+        
+        if (!resolve)
         {
-            // By passing false to the comparison we will be able to match
-            // and files given a filename only. If both file_spec and
-            // so_file_spec have directories, we will still do a full match.
-            if (FileSpec::Compare (file_spec, so_file_spec, false) == 0)
+            FileSpec so_file_spec;
+            if (GetFileSpecForSO (i, so_file_spec))
             {
-                SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i);
-                if (oso_dwarf)
-                    oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list);
+                // Match the full path if the incoming file_spec has a directory (not just a basename)
+                const bool full_match = file_spec.GetDirectory();
+                resolve = FileSpec::Equal (file_spec, so_file_spec, full_match);
             }
         }
+        if (resolve)
+        {
+            SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i);
+            if (oso_dwarf)
+                oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list);
+        }
     }
     return sc_list.GetSize() - initial;
 }
@@ -825,10 +951,10 @@
 {
     const user_id_t symbol_id = *symbol_idx_ptr;
 
-    if (symbol_id < comp_unit_info->so_symbol->GetID())
+    if (symbol_id < comp_unit_info->first_symbol_id)
         return -1;
 
-    if (symbol_id <= comp_unit_info->last_symbol->GetID())
+    if (symbol_id <= comp_unit_info->last_symbol_id)
         return 0;
 
     return 1;
@@ -1113,23 +1239,49 @@
     return 1;
 }
 
+lldb::CompUnitSP
+SymbolFileDWARFDebugMap::GetCompileUnit (SymbolFileDWARF *oso_dwarf)
+{
+    if (oso_dwarf)
+    {
+        const uint32_t cu_count = GetNumCompileUnits();
+        for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
+        {
+            SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
+            if (oso_symfile == oso_dwarf)
+            {
+                if (!m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
+                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp = ParseCompileUnitAtIndex (cu_idx);
+
+                return m_compile_unit_infos[cu_idx].oso_compile_unit_sp;
+            }
+        }
+    }
+    assert(!"this shouldn't happen");
+    return lldb::CompUnitSP();
+}
+
+
 void
 SymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp)
 {
-    const uint32_t cu_count = GetNumCompileUnits();
-    for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
+    if (oso_dwarf)
     {
-        if (m_compile_unit_infos[cu_idx].oso_symbol_vendor &&
-            m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetSymbolFile() == oso_dwarf)
+        const uint32_t cu_count = GetNumCompileUnits();
+        for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
         {
-            if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
+            SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
+            if (oso_symfile == oso_dwarf)
             {
-                assert (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == cu_sp.get());
-            }
-            else
-            {
-                m_compile_unit_infos[cu_idx].oso_compile_unit_sp = cu_sp;
-                m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp);
+                if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
+                {
+                    assert (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == cu_sp.get());
+                }
+                else
+                {
+                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp = cu_sp;
+                    m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp);
+                }
             }
         }
     }
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
index d7b69e0..ecc6f67 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -24,10 +24,12 @@
 class DWARFCompileUnit;
 class DWARFDebugInfoEntry;
 class DWARFDeclContext;
+class DebugMapModule;
 
 class SymbolFileDWARFDebugMap : public lldb_private::SymbolFile
 {
 public:
+    
     //------------------------------------------------------------------
     // Static Functions
     //------------------------------------------------------------------
@@ -62,6 +64,7 @@
     virtual uint32_t        GetNumCompileUnits ();
     virtual lldb::CompUnitSP ParseCompileUnitAtIndex (uint32_t index);
 
+    virtual lldb::LanguageType ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc);
     virtual size_t          ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc);
     virtual bool            ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc);
     virtual bool            ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc, lldb_private::FileSpecList &support_files);
@@ -125,39 +128,41 @@
     };
 
     friend class SymbolFileDWARF;
-
+    friend class DebugMapModule;
     //------------------------------------------------------------------
     // Class specific types
     //------------------------------------------------------------------
     struct CompileUnitInfo
     {
         lldb_private::FileSpec so_file;
-        lldb_private::Symbol *so_symbol;
-        lldb_private::Symbol *oso_symbol;
-        lldb_private::Symbol *last_symbol;
+        lldb_private::FileSpec oso_file;
+        lldb_private::ConstString oso_object; // for archives this will be the .o file in the "oso_file"
+//        lldb_private::Symbol *so_symbol;
+//        lldb_private::Symbol *oso_symbol;
+//        lldb_private::Symbol *last_symbol;
         uint32_t first_symbol_index;
         uint32_t last_symbol_index;
+        uint32_t first_symbol_id;
+        uint32_t last_symbol_id;
         lldb::ModuleSP oso_module_sp;
         lldb::CompUnitSP oso_compile_unit_sp;
-        lldb_private::SymbolVendor *oso_symbol_vendor;
-        std::vector<uint32_t> function_indexes;
-        std::vector<uint32_t> static_indexes;
-        STD_SHARED_PTR(lldb_private::SectionList) debug_map_sections_sp;
+//        SymbolFileDWARF *oso_symfile;
         bool symbol_file_supported;
 
         CompileUnitInfo() :
             so_file (),
-            so_symbol (NULL),
-            oso_symbol (NULL),
-            last_symbol (NULL),
+            oso_file (),
+            oso_object (),
+//            so_symbol (NULL),
+//            oso_symbol (NULL),
+//            last_symbol (NULL),
             first_symbol_index (UINT32_MAX),
             last_symbol_index (UINT32_MAX),
+            first_symbol_id (UINT32_MAX),
+            last_symbol_id (UINT32_MAX),
             oso_module_sp (),
             oso_compile_unit_sp (),
-            oso_symbol_vendor (NULL),
-            function_indexes (),
-            static_indexes (),
-            debug_map_sections_sp (),
+//            oso_symfile (NULL),
             symbol_file_supported (true)
         {
         }
@@ -180,6 +185,9 @@
     CompileUnitInfo *
     GetCompUnitInfo (const lldb_private::SymbolContext& sc);
 
+    CompileUnitInfo *
+    GetCompUnitInfo (const lldb_private::Module *oso_module);
+    
     lldb_private::Module *
     GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info);
 
@@ -227,6 +235,9 @@
     void
     SetCompileUnit (SymbolFileDWARF *oso_dwarf, const lldb::CompUnitSP &cu_sp);
 
+    lldb::CompUnitSP
+    GetCompileUnit (SymbolFileDWARF *oso_dwarf);
+
     lldb::TypeSP
     FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx);    
 
diff --git a/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
index 5404ab0..1e1a0f2 100644
--- a/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
+++ b/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
@@ -12,13 +12,14 @@
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/RegularExpression.h"
 #include "lldb/Core/Timer.h"
+#include "lldb/Symbol/CompileUnit.h"
+#include "lldb/Symbol/Function.h"
 #include "lldb/Symbol/ObjectFile.h"
-#include "lldb/Symbol/Symtab.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/Symbol.h"
-#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Symbol/SymbolContext.h"
-#include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/Symtab.h"
+#include "lldb/Symbol/TypeList.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -157,6 +158,13 @@
     return cu_sp;
 }
 
+lldb::LanguageType
+SymbolFileSymtab::ParseCompileUnitLanguage (const SymbolContext& sc)
+{
+    return eLanguageTypeUnknown;
+}
+
+
 size_t
 SymbolFileSymtab::ParseCompileUnitFunctions (const SymbolContext &sc)
 {
diff --git a/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h b/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h
index bb40f12..3c90b11 100644
--- a/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h
+++ b/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h
@@ -54,6 +54,9 @@
     virtual lldb::CompUnitSP
     ParseCompileUnitAtIndex(uint32_t index);
 
+    virtual lldb::LanguageType
+    ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc);
+
     virtual size_t
     ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc);
 
diff --git a/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp b/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
index 4dc1d0a..53acf8d 100644
--- a/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
+++ b/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
@@ -16,6 +16,7 @@
 #include <AvailabilityMacros.h>
 
 #include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/Section.h"
 #include "lldb/Core/StreamString.h"
diff --git a/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp b/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
index 1a2b224..1a17647 100644
--- a/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
+++ b/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp
@@ -14,6 +14,7 @@
 #include "lldb/Core/Address.h"
 #include "lldb/Core/ArchSpec.h"
 #include "lldb/Core/DataBufferHeap.h"
+#include "lldb/Core/DataExtractor.h"
 #include "lldb/Core/Disassembler.h"
 #include "lldb/Core/Error.h"
 #include "lldb/Core/Log.h"
diff --git a/source/Symbol/CompileUnit.cpp b/source/Symbol/CompileUnit.cpp
index ac57d88..fbcf45b 100644
--- a/source/Symbol/CompileUnit.cpp
+++ b/source/Symbol/CompileUnit.cpp
@@ -8,8 +8,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "lldb/Symbol/CompileUnit.h"
-#include "lldb/Symbol/LineTable.h"
 #include "lldb/Core/Module.h"
+#include "lldb/Core/Language.h"
+#include "lldb/Symbol/LineTable.h"
 #include "lldb/Symbol/SymbolVendor.h"
 #include "lldb/Symbol/VariableList.h"
 
@@ -20,14 +21,16 @@
     ModuleChild(module_sp),
     FileSpec (pathname, false),
     UserID(cu_sym_id),
-    Language (language),
     m_user_data (user_data),
+    m_language (language),
     m_flags (0),
     m_functions (),
     m_support_files (),
     m_line_table_ap (),
     m_variables()
 {
+    if (language != eLanguageTypeUnknown)
+        m_flags.Set(flagsParsedLanguage);
     assert(module_sp);
 }
 
@@ -35,14 +38,16 @@
     ModuleChild(module_sp),
     FileSpec (fspec),
     UserID(cu_sym_id),
-    Language (language),
     m_user_data (user_data),
+    m_language (language),
     m_flags (0),
     m_functions (),
     m_support_files (),
     m_line_table_ap (),
     m_variables()
 {
+    if (language != eLanguageTypeUnknown)
+        m_flags.Set(flagsParsedLanguage);
     assert(module_sp);
 }
 
@@ -80,7 +85,8 @@
 void
 CompileUnit::GetDescription(Stream *s, lldb::DescriptionLevel level) const
 {
-    *s << "id = " << (const UserID&)*this << ", file = \"" << (const FileSpec&)*this << "\", language = \"" << (const Language&)*this << '"';
+    Language language(m_language);
+    *s << "id = " << (const UserID&)*this << ", file = \"" << (const FileSpec&)*this << "\", language = \"" << language << '"';
 }
 
 
@@ -208,6 +214,26 @@
 }
 
 
+lldb::LanguageType
+CompileUnit::GetLanguage()
+{
+    if (m_language == eLanguageTypeUnknown)
+    {
+        if (m_flags.IsClear(flagsParsedLanguage))
+        {
+            m_flags.Set(flagsParsedLanguage);
+            SymbolVendor* symbol_vendor = GetModule()->GetSymbolVendor();
+            if (symbol_vendor)
+            {
+                SymbolContext sc;
+                CalculateSymbolContext(&sc);
+                m_language = symbol_vendor->ParseCompileUnitLanguage(sc);
+            }
+        }
+    }
+    return m_language;
+}
+
 LineTable*
 CompileUnit::GetLineTable()
 {
@@ -298,7 +324,8 @@
     // "file_spec" has an empty directory, then only compare the basenames
     // when finding file indexes
     std::vector<uint32_t> file_indexes;
-    bool file_spec_matches_cu_file_spec = FileSpec::Equal(file_spec, *this, !file_spec.GetDirectory().IsEmpty());
+    const bool full_match = file_spec.GetDirectory();
+    bool file_spec_matches_cu_file_spec = FileSpec::Equal(file_spec, *this, full_match);
 
     // If we are not looking for inlined functions and our file spec doesn't
     // match then we are done...
diff --git a/source/Symbol/ObjectFile.cpp b/source/Symbol/ObjectFile.cpp
index 7469b10..a26ddce 100644
--- a/source/Symbol/ObjectFile.cpp
+++ b/source/Symbol/ObjectFile.cpp
@@ -15,11 +15,13 @@
 #include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/RegularExpression.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/Timer.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/ObjectContainer.h"
 #include "lldb/Symbol/SymbolFile.h"
 #include "lldb/Target/Process.h"
+#include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -39,7 +41,7 @@
         if (file)
         {
             // Memory map the entire file contents
-            if (!file_data_sp)
+            if (!file_data_sp && file_size > 0)
             {
                 assert (file_offset == 0);
                 file_data_sp = file->MemoryMapFileContents(file_offset, file_size);
@@ -51,22 +53,15 @@
                 char path_with_object[PATH_MAX*2];
                 module_sp->GetFileSpec().GetPath(path_with_object, sizeof(path_with_object));
 
-                RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$");
-                if (g_object_regex.Execute (path_with_object, 2))
+                FileSpec archive_file;
+                ConstString archive_object;
+                if (ObjectFile::SplitArchivePathWithObject (path_with_object, archive_file, archive_object))
                 {
-                    FileSpec archive_file;
-                    std::string path;
-                    std::string object;
-                    if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) &&
-                        g_object_regex.GetMatchAtIndex (path_with_object, 2, object))
+                    file_size = archive_file.GetByteSize();
+                    if (file_size > 0)
                     {
-                        archive_file.SetFile (path.c_str(), false);
-                        file_size = archive_file.GetByteSize();
-                        if (file_size > 0)
-                        {
-                            module_sp->SetFileSpecAndObjectName (archive_file, ConstString(object.c_str()));
-                            file_data_sp = archive_file.MemoryMapFileContents(file_offset, file_size);
-                        }
+                        module_sp->SetFileSpecAndObjectName (archive_file, archive_object);
+                        file_data_sp = archive_file.MemoryMapFileContents(file_offset, file_size);
                     }
                 }
             }
@@ -455,3 +450,23 @@
     return 0;
 }
 
+
+bool
+ObjectFile::SplitArchivePathWithObject (const char *path_with_object, FileSpec &archive_file, ConstString &archive_object)
+{
+    RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$");
+    if (g_object_regex.Execute (path_with_object, 2))
+    {
+        std::string path;
+        std::string obj;
+        if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) &&
+            g_object_regex.GetMatchAtIndex (path_with_object, 2, obj))
+        {
+            archive_file.SetFile (path.c_str(), false);
+            archive_object.SetCString(obj.c_str());
+            return true;
+        }
+    }
+    return false;
+}
+
diff --git a/source/Symbol/Symbol.cpp b/source/Symbol/Symbol.cpp
index 6f9d6d5..3a8a333 100644
--- a/source/Symbol/Symbol.cpp
+++ b/source/Symbol/Symbol.cpp
@@ -12,6 +12,8 @@
 #include "lldb/Core/Module.h"
 #include "lldb/Core/Section.h"
 #include "lldb/Core/Stream.h"
+#include "lldb/Symbol/ObjectFile.h"
+#include "lldb/Symbol/Symtab.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/Target.h"
 
diff --git a/source/Symbol/SymbolContext.cpp b/source/Symbol/SymbolContext.cpp
index b2bb97f..f0b5380 100644
--- a/source/Symbol/SymbolContext.cpp
+++ b/source/Symbol/SymbolContext.cpp
@@ -11,6 +11,7 @@
 
 #include "lldb/Core/Log.h"
 #include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Host/Host.h"
 #include "lldb/Interpreter/Args.h"
 #include "lldb/Symbol/Block.h"
diff --git a/source/Symbol/SymbolVendor.cpp b/source/Symbol/SymbolVendor.cpp
index 7443eae..32b0285 100644
--- a/source/Symbol/SymbolVendor.cpp
+++ b/source/Symbol/SymbolVendor.cpp
@@ -15,6 +15,8 @@
 // Project includes
 #include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Stream.h"
+#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Symbol/SymbolFile.h"
 
@@ -150,6 +152,20 @@
     return m_compile_units.size();
 }
 
+lldb::LanguageType
+SymbolVendor::ParseCompileUnitLanguage (const SymbolContext& sc)
+{
+    ModuleSP module_sp(GetModule());
+    if (module_sp)
+    {
+        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
+        if (m_sym_file_ap.get())
+            return m_sym_file_ap->ParseCompileUnitLanguage(sc);
+    }
+    return eLanguageTypeUnknown;
+}
+
+
 size_t
 SymbolVendor::ParseCompileUnitFunctions (const SymbolContext &sc)
 {
diff --git a/source/Symbol/Variable.cpp b/source/Symbol/Variable.cpp
index df00873..8172875 100644
--- a/source/Symbol/Variable.cpp
+++ b/source/Symbol/Variable.cpp
@@ -9,6 +9,7 @@
 
 #include "lldb/Symbol/Variable.h"
 
+#include "lldb/Core/Module.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Core/RegularExpression.h"
 #include "lldb/Core/ValueObject.h"
diff --git a/source/Symbol/VariableList.cpp b/source/Symbol/VariableList.cpp
index ad47c60..251fea8 100644
--- a/source/Symbol/VariableList.cpp
+++ b/source/Symbol/VariableList.cpp
@@ -52,9 +52,12 @@
 void
 VariableList::AddVariables(VariableList *variable_list)
 {
-    std::copy(  variable_list->m_variables.begin(), // source begin
-                variable_list->m_variables.end(),   // source end
-                back_inserter(m_variables));        // destination
+    if (variable_list)
+    {
+        std::copy(variable_list->m_variables.begin(), // source begin
+                  variable_list->m_variables.end(),   // source end
+                  back_inserter(m_variables));        // destination
+    }
 }
 
 void
diff --git a/source/Target/ObjCLanguageRuntime.cpp b/source/Target/ObjCLanguageRuntime.cpp
index db51729..c41db3c 100644
--- a/source/Target/ObjCLanguageRuntime.cpp
+++ b/source/Target/ObjCLanguageRuntime.cpp
@@ -9,10 +9,12 @@
 #include "clang/AST/Type.h"
 
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/ValueObject.h"
 #include "lldb/Symbol/ClangASTContext.h"
 #include "lldb/Symbol/Type.h"
+#include "lldb/Symbol/TypeList.h"
 #include "lldb/Target/ObjCLanguageRuntime.h"
 #include "lldb/Target/Target.h"
 
diff --git a/source/Target/Platform.cpp b/source/Target/Platform.cpp
index 3fcd9df..666daaa 100644
--- a/source/Target/Platform.cpp
+++ b/source/Target/Platform.cpp
@@ -16,6 +16,7 @@
 #include "lldb/Breakpoint/BreakpointIDList.h"
 #include "lldb/Core/Error.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/ModuleSpec.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Host/FileSpec.h"
 #include "lldb/Host/Host.h"
diff --git a/source/Target/Process.cpp b/source/Target/Process.cpp
index 454cf3a..b16a37d 100644
--- a/source/Target/Process.cpp
+++ b/source/Target/Process.cpp
@@ -18,6 +18,7 @@
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/InputReader.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/State.h"
 #include "lldb/Expression/ClangUserExpression.h"
diff --git a/source/Target/StackFrame.cpp b/source/Target/StackFrame.cpp
index 6099ed2..614223d 100644
--- a/source/Target/StackFrame.cpp
+++ b/source/Target/StackFrame.cpp
@@ -19,7 +19,10 @@
 #include "lldb/Core/Value.h"
 #include "lldb/Core/ValueObjectVariable.h"
 #include "lldb/Core/ValueObjectConstResult.h"
+#include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/Symbol.h"
+#include "lldb/Symbol/SymbolContextScope.h"
 #include "lldb/Symbol/VariableList.h"
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
diff --git a/source/Target/Target.cpp b/source/Target/Target.cpp
index 289944f..2298a1f 100644
--- a/source/Target/Target.cpp
+++ b/source/Target/Target.cpp
@@ -22,6 +22,9 @@
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/Event.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
+#include "lldb/Core/Section.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/Timer.h"
 #include "lldb/Core/ValueObject.h"
@@ -226,9 +229,9 @@
 
 BreakpointSP
 Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules,
-                  const FileSpecList *source_file_spec_list,
-                  RegularExpression &source_regex,
-                  bool internal)
+                                     const FileSpecList *source_file_spec_list,
+                                     RegularExpression &source_regex,
+                                     bool internal)
 {
     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list));
     BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex));
@@ -240,13 +243,37 @@
 Target::CreateBreakpoint (const FileSpecList *containingModules,
                           const FileSpec &file,
                           uint32_t line_no,
-                          bool check_inlines,
+                          LazyBool check_inlines,
                           LazyBool skip_prologue,
                           bool internal)
 {
     SearchFilterSP filter_sp(GetSearchFilterForModuleList (containingModules));
     
-    BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL, file, line_no, check_inlines,
+    if (check_inlines == eLazyBoolCalculate)
+    {
+        const InlineStrategy inline_strategy = GetInlineStrategy();
+        switch (inline_strategy)
+        {
+            case eInlineBreakpointsNever:
+                check_inlines = eLazyBoolNo;
+                break;
+                
+            case eInlineBreakpointsHeaders:
+                if (file.IsSourceImplementationFile())
+                    check_inlines = eLazyBoolNo;
+                else
+                    check_inlines = eLazyBoolYes;
+                break;
+
+            case eInlineBreakpointsAlways:
+                check_inlines = eLazyBoolYes;
+                break;
+        }
+    }
+    BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL,
+                                                                     file,
+                                                                     line_no,
+                                                                     check_inlines,
                                                                      skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue));
     return CreateBreakpoint (filter_sp, resolver_sp, internal);
 }
@@ -2092,6 +2119,15 @@
     { 0, NULL, NULL }
 };
 
+static OptionEnumValueElement
+g_inline_breakpoint_enums[] =
+{
+    { eInlineBreakpointsNever,   "never",     "Never look for inline breakpoint locations (fastest). This setting should only be used if you know that no inlining occurs in your programs."},
+    { eInlineBreakpointsHeaders, "headers",   "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."},
+    { eInlineBreakpointsAlways,  "always",    "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."},
+    { 0, NULL, NULL }
+};
+
 static PropertyDefinition
 g_properties[] =
 {
@@ -2117,6 +2153,13 @@
     { "error-path"                         , OptionValue::eTypeFileSpec  , false, 0                         , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." },
     { "disable-aslr"                       , OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" },
     { "disable-stdio"                      , OptionValue::eTypeBoolean   , false, false                     , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" },
+    { "inline-breakpoint-strategy"         , OptionValue::eTypeEnum      , false, eInlineBreakpointsHeaders , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. "
+        "Breakpoint locations can end up being inlined by the compiler, so that a compile unit 'a.c' might contain an inlined function from another source file. "
+        "Usually this is limitted to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. "
+        "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. "
+        "Always checking for inlined breakpoint locations can be expensive (memory and time), so we try to minimize the "
+        "times we look for inlined locations. This setting allows you to control exactly which strategy is used when settings "
+        "file and line breakpoints." },
     { NULL                                 , OptionValue::eTypeInvalid   , false, 0                         , NULL, NULL, NULL }
 };
 enum
@@ -2138,7 +2181,8 @@
     ePropertyOutputPath,
     ePropertyErrorPath,
     ePropertyDisableASLR,
-    ePropertyDisableSTDIO
+    ePropertyDisableSTDIO,
+    ePropertyInlineStrategy
 };
 
 
@@ -2314,6 +2358,13 @@
     m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
 }
 
+InlineStrategy
+TargetProperties::GetInlineStrategy () const
+{
+    const uint32_t idx = ePropertyInlineStrategy;
+    return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
+}
+
 bool
 TargetProperties::GetRunArguments (Args &args) const
 {
diff --git a/source/Target/TargetList.cpp b/source/Target/TargetList.cpp
index 850179a..94f0d7e 100644
--- a/source/Target/TargetList.cpp
+++ b/source/Target/TargetList.cpp
@@ -14,6 +14,7 @@
 #include "lldb/Core/Broadcaster.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/Event.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/State.h"
 #include "lldb/Core/Timer.h"
 #include "lldb/Host/Host.h"
diff --git a/source/Target/ThreadPlanCallFunction.cpp b/source/Target/ThreadPlanCallFunction.cpp
index c7ee799..0491d34 100644
--- a/source/Target/ThreadPlanCallFunction.cpp
+++ b/source/Target/ThreadPlanCallFunction.cpp
@@ -19,7 +19,9 @@
 #include "lldb/Breakpoint/BreakpointLocation.h"
 #include "lldb/Core/Address.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/Stream.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/LanguageRuntime.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
diff --git a/source/Target/ThreadPlanStepOut.cpp b/source/Target/ThreadPlanStepOut.cpp
index 44ede3a..4e628e7 100644
--- a/source/Target/ThreadPlanStepOut.cpp
+++ b/source/Target/ThreadPlanStepOut.cpp
@@ -18,6 +18,9 @@
 #include "lldb/Core/Log.h"
 #include "lldb/Core/Value.h"
 #include "lldb/Core/ValueObjectConstResult.h"
+#include "lldb/Symbol/Block.h"
+#include "lldb/Symbol/Function.h"
+#include "lldb/Symbol/Type.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
 #include "lldb/Target/StopInfo.h"
diff --git a/source/Target/ThreadPlanTracer.cpp b/source/Target/ThreadPlanTracer.cpp
index 5ae1791..87e5e19 100644
--- a/source/Target/ThreadPlanTracer.cpp
+++ b/source/Target/ThreadPlanTracer.cpp
@@ -19,6 +19,7 @@
 #include "lldb/Core/Debugger.h"
 #include "lldb/Core/Disassembler.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Module.h"
 #include "lldb/Core/State.h"
 #include "lldb/Core/Value.h"
 #include "lldb/Symbol/TypeList.h"
diff --git a/test/functionalities/breakpoint/inlined_breakpoints/TestInlinedBreakpoints.py b/test/functionalities/breakpoint/inlined_breakpoints/TestInlinedBreakpoints.py
index 3faa638..b4eeb02 100644
--- a/test/functionalities/breakpoint/inlined_breakpoints/TestInlinedBreakpoints.py
+++ b/test/functionalities/breakpoint/inlined_breakpoints/TestInlinedBreakpoints.py
@@ -37,9 +37,20 @@
         exe = os.path.join(os.getcwd(), "a.out")
         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
 
+        # Set a breakpoint and fail because it is in an inlined source implemenation file
         self.expect("breakpoint set -f basic_type.cpp -l %d" % self.line,
                     BREAKPOINT_CREATED,
-            startstr = "Breakpoint created: 1: file ='basic_type.cpp', line = %d, locations = 1" %
+            startstr = "Breakpoint created: 1: file ='basic_type.cpp', line = %d, locations = 0 (pending)" % self.line)
+
+        # Now enable breakpoints in implementation files and see the breakpoint set succeed
+        self.runCmd('settings set target.inline-breakpoint-strategy always')
+        # And add hooks to restore the settings during tearDown().
+        self.addTearDownHook(
+            lambda: self.runCmd("settings set target.inline-breakpoint-strategy headers"))
+
+        self.expect("breakpoint set -f basic_type.cpp -l %d" % self.line,
+                    BREAKPOINT_CREATED,
+            startstr = "Breakpoint created: 2: file ='basic_type.cpp', line = %d, locations = 1" %
                         self.line)
 
         self.runCmd("run", RUN_SUCCEEDED)
diff --git a/test/types/AbstractBase.py b/test/types/AbstractBase.py
index b48d074..2580d57 100644
--- a/test/types/AbstractBase.py
+++ b/test/types/AbstractBase.py
@@ -107,6 +107,13 @@
                 gl.append((var, val))
         #print "golden list:", gl
 
+        # This test uses a #include of a the "basic_type.cpp" so we need to enable
+        # always setting inlined breakpoints.
+        self.runCmd('settings set target.inline-breakpoint-strategy always')
+        # And add hooks to restore the settings during tearDown().
+        self.addTearDownHook(
+            lambda: self.runCmd("settings set target.inline-breakpoint-strategy headers"))
+
         # Bring the program to the point where we can issue a series of
         # 'frame variable -T' command.
         if blockCaptured:
@@ -184,6 +191,13 @@
                 gl.append((var, val))
         #print "golden list:", gl
 
+        # This test uses a #include of a the "basic_type.cpp" so we need to enable
+        # always setting inlined breakpoints.
+        self.runCmd('settings set target.inline-breakpoint-strategy always')
+        # And add hooks to restore the settings during tearDown().
+        self.addTearDownHook(
+            lambda: self.runCmd("settings set target.inline-breakpoint-strategy headers"))
+
         # Bring the program to the point where we can issue a series of
         # 'expr' command.
         if blockCaptured: