Added the ability to get an abstract file type (executable, object file, 
shared library, etc) and strata (user/kernel) from an object file. This will
help with plug-in and platform selection when given a new binary with the
"target create <file>" command.

llvm-svn: 134779
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 2e300a1..6c55360 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -1421,3 +1421,74 @@
     return true;
 }
 
+ObjectFile::Type
+ObjectFileELF::CalculateType()
+{
+    switch (m_header.e_type)
+    {
+        case llvm::ELF::ET_NONE:
+            // 0 - No file type
+            return eTypeUnknown;
+
+        case llvm::ELF::ET_REL:
+            // 1 - Relocatable file
+            return eTypeObjectFile;
+
+        case llvm::ELF::ET_EXEC:
+            // 2 - Executable file
+            return eTypeExecutable;
+
+        case llvm::ELF::ET_DYN:
+            // 3 - Shared object file
+            return eTypeSharedLibrary;
+
+        case ET_CORE:
+            // 4 - Core file
+            return eTypeCoreFile;
+
+        default:
+            break;
+    }
+    return eTypeUnknown;
+}
+
+ObjectFile::Strata
+ObjectFileELF::CalculateStrata()
+{
+    switch (m_header.e_type)
+    {
+        case llvm::ELF::ET_NONE:    
+            // 0 - No file type
+            return eStrataUnknown;
+
+        case llvm::ELF::ET_REL:
+            // 1 - Relocatable file
+            return eStrataUnknown;
+
+        case llvm::ELF::ET_EXEC:
+            // 2 - Executable file
+            // TODO: is there any way to detect that an executable is a kernel
+            // related executable by inspecting the program headers, section 
+            // headers, symbols, or any other flag bits???
+            return eStrataUser;
+
+        case llvm::ELF::ET_DYN:
+            // 3 - Shared object file
+            // TODO: is there any way to detect that an shared library is a kernel
+            // related executable by inspecting the program headers, section 
+            // headers, symbols, or any other flag bits???
+            return eStrataUnknown;
+
+        case ET_CORE:
+            // 4 - Core file
+            // TODO: is there any way to detect that an core file is a kernel
+            // related executable by inspecting the program headers, section 
+            // headers, symbols, or any other flag bits???
+            return eStrataUnknown;
+
+        default:
+            break;
+    }
+    return eStrataUnknown;
+}
+
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
index f442ea2..78d2b5d 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
@@ -104,6 +104,12 @@
     
     virtual lldb_private::Address
     GetEntryPointAddress ();
+    
+    virtual ObjectFile::Type
+    CalculateType();
+    
+    virtual ObjectFile::Strata
+    CalculateStrata();
 
 private:
     ObjectFileELF(lldb_private::Module* module,
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 2169dbc..0b75a7a 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -1672,6 +1672,90 @@
 
 }
 
+ObjectFile::Type
+ObjectFileMachO::CalculateType()
+{
+    switch (m_header.filetype)
+    {
+        case HeaderFileTypeObject:                                          // 0x1u MH_OBJECT
+            if (GetAddressByteSize () == 4)
+            {
+                // 32 bit kexts are just object files, but they do have a valid
+                // UUID load command.
+                UUID uuid;
+                if (GetUUID(&uuid))
+                {
+                    // this checking for the UUID load command is not enough
+                    // we could eventually look for the symbol named 
+                    // "OSKextGetCurrentIdentifier" as this is required of kexts
+                    if (m_strata == eStrataInvalid)
+                        m_strata = eStrataKernel;
+                    return eTypeSharedLibrary;
+                }
+            }
+            return eTypeObjectFile;
+
+        case HeaderFileTypeExecutable:          return eTypeExecutable;     // 0x2u MH_EXECUTE
+        case HeaderFileTypeFixedVMShlib:        return eTypeSharedLibrary;  // 0x3u MH_FVMLIB
+        case HeaderFileTypeCore:                return eTypeCoreFile;       // 0x4u MH_CORE
+        case HeaderFileTypePreloadedExecutable: return eTypeSharedLibrary;  // 0x5u MH_PRELOAD
+        case HeaderFileTypeDynamicShlib:        return eTypeSharedLibrary;  // 0x6u MH_DYLIB
+        case HeaderFileTypeDynamicLinkEditor:   return eTypeDynamicLinker;  // 0x7u MH_DYLINKER
+        case HeaderFileTypeBundle:              return eTypeSharedLibrary;  // 0x8u MH_BUNDLE
+        case HeaderFileTypeDynamicShlibStub:    return eTypeStubLibrary;    // 0x9u MH_DYLIB_STUB
+        case HeaderFileTypeDSYM:                return eTypeDebugInfo;      // 0xAu MH_DSYM
+        case HeaderFileTypeKextBundle:          return eTypeSharedLibrary;  // 0xBu MH_KEXT_BUNDLE
+        default:
+            break;
+    }
+    return eTypeUnknown;
+}
+
+ObjectFile::Strata
+ObjectFileMachO::CalculateStrata()
+{
+    switch (m_header.filetype)
+    {
+        case HeaderFileTypeObject:      // 0x1u MH_OBJECT
+            {
+                // 32 bit kexts are just object files, but they do have a valid
+                // UUID load command.
+                UUID uuid;
+                if (GetUUID(&uuid))
+                {
+                    // this checking for the UUID load command is not enough
+                    // we could eventually look for the symbol named 
+                    // "OSKextGetCurrentIdentifier" as this is required of kexts
+                    if (m_type == eTypeInvalid)
+                        m_type = eTypeSharedLibrary;
+
+                    return eStrataKernel;
+                }
+            }
+            return eStrataUnknown;
+
+        case HeaderFileTypeExecutable:                                     // 0x2u MH_EXECUTE
+            // Check for the MH_DYLDLINK bit in the flags
+            if (m_header.flags & HeaderFlagBitIsDynamicLinkObject)
+                return eStrataUser;
+            return eStrataKernel;
+
+        case HeaderFileTypeFixedVMShlib:        return eStrataUser;         // 0x3u MH_FVMLIB
+        case HeaderFileTypeCore:                return eStrataUnknown;      // 0x4u MH_CORE
+        case HeaderFileTypePreloadedExecutable: return eStrataUser;         // 0x5u MH_PRELOAD
+        case HeaderFileTypeDynamicShlib:        return eStrataUser;         // 0x6u MH_DYLIB
+        case HeaderFileTypeDynamicLinkEditor:   return eStrataUser;         // 0x7u MH_DYLINKER
+        case HeaderFileTypeBundle:              return eStrataUser;         // 0x8u MH_BUNDLE
+        case HeaderFileTypeDynamicShlibStub:    return eStrataUser;         // 0x9u MH_DYLIB_STUB
+        case HeaderFileTypeDSYM:                return eStrataUnknown;      // 0xAu MH_DSYM
+        case HeaderFileTypeKextBundle:          return eStrataKernel;       // 0xBu MH_KEXT_BUNDLE
+        default:
+            break;
+    }
+    return eStrataUnknown;
+}
+
+
 bool
 ObjectFileMachO::GetArchitecture (ArchSpec &arch)
 {
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
index 0cd96ba..b1077fc 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
@@ -110,6 +110,12 @@
     virtual lldb_private::Address
     GetEntryPointAddress ();
 
+    virtual ObjectFile::Type
+    CalculateType();
+    
+    virtual ObjectFile::Strata
+    CalculateStrata();
+
 protected:
     mutable lldb_private::Mutex m_mutex;
     llvm::MachO::mach_header m_header;