From a3a6c12c0315d03fd8139606793b0d22ef2a57f6 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Tue, 29 Jul 2014 18:04:57 +0000 Subject: [PATCH] When constructing an ArchSpec from a MachO cpu type and subtype, don't set the OS for x86_64 and x86 in case the binary ends up being for macosx or ios. llvm-svn: 214188 --- lldb/source/Core/ArchSpec.cpp | 9 +++++++++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 8 ++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lldb/source/Core/ArchSpec.cpp b/lldb/source/Core/ArchSpec.cpp index faedcb6..c4bca8b 100644 --- a/lldb/source/Core/ArchSpec.cpp +++ b/lldb/source/Core/ArchSpec.cpp @@ -752,6 +752,15 @@ ArchSpec::SetArchitecture (ArchitectureType arch_type, uint32_t cpu, uint32_t su case llvm::Triple::x86: case llvm::Triple::x86_64: + // Don't set the OS for x86_64 or for x86 as we want to leave it as an "unspecified unknown" + // which means if we ask for the OS from the llvm::Triple we get back llvm::Triple::UnknownOS, but + // if we ask for the string value for the OS it will come back empty (unspecified). + // We do this because we now have iOS and MacOSX as the OS values for x86 and x86_64 for + // normal desktop and simulator binaries. And if we compare a "x86_64-apple-ios" to a "x86_64-apple-" + // triple, it will say it is compatible (because the OS is unspecified in the second one and will match + // anything in the first + break; + default: m_triple.setOS (llvm::Triple::MacOSX); break; diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index 11b2796..fda38ea 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -4365,10 +4365,14 @@ ObjectFileMachO::GetArchitecture (const llvm::MachO::mach_header &header, offset = cmd_offset + load_cmd.cmdsize; } + // Only set the OS to iOS for ARM, we don't want to set it for x86 and x86_64. + // We do this because we now have MacOSX or iOS as the OS value for x86 and + // x86_64 for normal desktop (MacOSX) and simulator (iOS) binaries. And if + // we compare a "x86_64-apple-ios" to a "x86_64-apple-" triple, it will say + // it is compatible (because the OS is unspecified in the second one and will + // match anything in the first if (header.cputype == CPU_TYPE_ARM || header.cputype == CPU_TYPE_ARM64) triple.setOS (llvm::Triple::IOS); - else - triple.setOS (llvm::Triple::MacOSX); } } return arch.IsValid(); -- 2.7.4