Allow generic ARM cores to match any more specific ARM architecture.
authorGreg Clayton <gclayton@apple.com>
Sat, 12 Jul 2014 00:11:34 +0000 (00:11 +0000)
committerGreg Clayton <gclayton@apple.com>
Sat, 12 Jul 2014 00:11:34 +0000 (00:11 +0000)
<rdar://problem/15932248>

llvm-svn: 212863

lldb/source/Core/ArchSpec.cpp
lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp

index 97ae497..bfe8b62 100644 (file)
@@ -905,6 +905,10 @@ cores_match (const ArchSpec::Core core1, const ArchSpec::Core core2, bool try_in
     case ArchSpec::kCore_any:
         return true;
 
+    case ArchSpec::eCore_arm_generic:
+        if (enforce_exact_match)
+            break;
+        // Fall through to case below
     case ArchSpec::kCore_arm_any:
         if (core2 >= ArchSpec::kCore_arm_first && core2 <= ArchSpec::kCore_arm_last)
             return true;
@@ -932,6 +936,8 @@ cores_match (const ArchSpec::Core core1, const ArchSpec::Core core2, bool try_in
     case ArchSpec::eCore_arm_armv6m:
         if (!enforce_exact_match)
         {
+            if (core2 == ArchSpec::eCore_arm_generic)
+                return true;
             try_inverse = false;
             if (core2 == ArchSpec::eCore_arm_armv7)
                 return true;
@@ -949,9 +955,11 @@ cores_match (const ArchSpec::Core core1, const ArchSpec::Core core2, bool try_in
     case ArchSpec::eCore_arm_armv7s:
         if (!enforce_exact_match)
         {
-            try_inverse = false;
+            if (core2 == ArchSpec::eCore_arm_generic)
+                return true;
             if (core2 == ArchSpec::eCore_arm_armv7)
                 return true;
+            try_inverse = false;
         }
         break;
 
index e7266d2..50cdd18 100644 (file)
@@ -1251,8 +1251,29 @@ ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
     if (arch_spec.GetTriple ().getOS () == llvm::Triple::OSType::UnknownOS)
     {
         arch_spec.SetArchitecture (eArchTypeELF, header.e_machine, LLDB_INVALID_CPUTYPE);
-        arch_spec.GetTriple().setOSName (Host::GetOSString().GetCString());
-        arch_spec.GetTriple().setVendorName(Host::GetVendorString().GetCString());
+        switch (arch_spec.GetAddressByteSize())
+        {
+        case 4:
+            {
+                const ArchSpec host_arch32 = Host::GetArchitecture (Host::eSystemDefaultArchitecture32);
+                if (host_arch32.GetCore() == arch_spec.GetCore())
+                {
+                    arch_spec.GetTriple().setOSName (Host::GetOSString().GetCString());
+                    arch_spec.GetTriple().setVendorName(Host::GetVendorString().GetCString());
+                }
+            }
+            break;
+        case 8:
+            {
+                const ArchSpec host_arch64 = Host::GetArchitecture (Host::eSystemDefaultArchitecture64);
+                if (host_arch64.GetCore() == arch_spec.GetCore())
+                {
+                    arch_spec.GetTriple().setOSName (Host::GetOSString().GetCString());
+                    arch_spec.GetTriple().setVendorName(Host::GetVendorString().GetCString());
+                }
+            }
+            break;
+        }
     }
 
     // If there are no section headers we are done.