Fix the -*-version-min option to not try and use the current OS version for iOS and...
authorGreg Clayton <gclayton@apple.com>
Thu, 22 Jan 2015 18:25:49 +0000 (18:25 +0000)
committerGreg Clayton <gclayton@apple.com>
Thu, 22 Jan 2015 18:25:49 +0000 (18:25 +0000)
llvm-svn: 226846

lldb/include/lldb/Target/Platform.h
lldb/source/Expression/ClangModulesDeclVendor.cpp
lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
lldb/source/Plugins/Platform/MacOSX/PlatformRemoteiOS.h
lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h
lldb/source/Target/Platform.cpp

index 8b14cc2..9a91c79 100644 (file)
@@ -569,7 +569,7 @@ namespace lldb_private {
         
         // Appends the platform-specific options required to find the modules for the current platform.
         virtual void
-        AddClangModuleCompilationOptions (std::vector<std::string> &options);
+        AddClangModuleCompilationOptions (Target *target, std::vector<std::string> &options);
 
         ConstString
         GetWorkingDirectory ();
index 46adaaf..b1ce44a 100644 (file)
@@ -289,7 +289,7 @@ ClangModulesDeclVendor::Create(Target &target)
         "-Werror=non-modular-include-in-framework-module"
     };
     
-    target.GetPlatform()->AddClangModuleCompilationOptions(compiler_invocation_arguments);
+    target.GetPlatform()->AddClangModuleCompilationOptions(&target, compiler_invocation_arguments);
 
     compiler_invocation_arguments.push_back(ModuleImportBufferName);
 
index cf1d152..5fb43c6 100644 (file)
@@ -1419,7 +1419,7 @@ PlatformDarwin::GetSDKDirectoryForModules (SDKType sdk_type)
 }
 
 void
-PlatformDarwin::AddClangModuleCompilationOptionsForSDKType (std::vector<std::string> &options, SDKType sdk_type)
+PlatformDarwin::AddClangModuleCompilationOptionsForSDKType (Target *target, std::vector<std::string> &options, SDKType sdk_type)
 {
     const std::vector<std::string> apple_arguments =
     {
@@ -1435,28 +1435,67 @@ PlatformDarwin::AddClangModuleCompilationOptionsForSDKType (std::vector<std::str
                    apple_arguments.end());
     
     StreamString minimum_version_option;
-    unsigned int major = 0, minor = 0, micro = 0;
-    GetOSVersion(major, minor, micro);
-    if (micro == UINT32_MAX)
-        micro = 0; // FIXME who actually likes this behavior?
-    
+    uint32_t versions[3] = { 0, 0, 0 };
+    bool use_current_os_version = false;
     switch (sdk_type)
     {
-    case SDKType::iPhoneOS:
-        minimum_version_option.PutCString("-mios-version-min=");
-        minimum_version_option.PutCString(clang::VersionTuple(major, minor, micro).getAsString().c_str());
-        break;
-    case SDKType::iPhoneSimulator:
-        minimum_version_option.PutCString("-mios-simulator-version-min=");
-        minimum_version_option.PutCString(clang::VersionTuple(major, minor, micro).getAsString().c_str());
-        break;
-    case SDKType::MacOSX:
-        minimum_version_option.PutCString("-mmacosx-version-min=");
-        minimum_version_option.PutCString(clang::VersionTuple(major, minor, micro).getAsString().c_str());
+        case SDKType::iPhoneOS:
+#if defined (__arm__) || defined (__arm64__) || defined (__aarch64__)
+            use_current_os_version = true;
+#else
+            use_current_os_version = false;
+#endif
+            break;
+
+        case SDKType::iPhoneSimulator:
+            use_current_os_version = false;
+            break;
+
+        case SDKType::MacOSX:
+#if defined (__i386__) || defined (__x86_64__)
+            use_current_os_version = true;
+#else
+            use_current_os_version = false;
+#endif
+            break;
     }
-    
-    options.push_back(minimum_version_option.GetString());
-    
+
+    if (use_current_os_version)
+        GetOSVersion(versions[0], versions[1], versions[2]);
+    else if (target)
+    {
+        // Our OS doesn't match our executable so we need to get the min OS version from the object file
+        ModuleSP exe_module_sp = target->GetExecutableModule();
+        if (exe_module_sp)
+        {
+            ObjectFile *object_file = exe_module_sp->GetObjectFile();
+            if (object_file)
+                object_file->GetMinimumOSVersion(versions, 3);
+        }
+    }
+    // Only add the version-min options if we got a version from somewhere
+    if (versions[0])
+    {
+        if (versions[2] == UINT32_MAX)
+            versions[2] = 0; // FIXME who actually likes this behavior?
+        
+        switch (sdk_type)
+        {
+        case SDKType::iPhoneOS:
+            minimum_version_option.PutCString("-mios-version-min=");
+            minimum_version_option.PutCString(clang::VersionTuple(versions[0], versions[1], versions[2]).getAsString().c_str());
+            break;
+        case SDKType::iPhoneSimulator:
+            minimum_version_option.PutCString("-mios-simulator-version-min=");
+            minimum_version_option.PutCString(clang::VersionTuple(versions[0], versions[1], versions[2]).getAsString().c_str());
+            break;
+        case SDKType::MacOSX:
+            minimum_version_option.PutCString("-mmacosx-version-min=");
+            minimum_version_option.PutCString(clang::VersionTuple(versions[0], versions[1], versions[2]).getAsString().c_str());
+        }
+        options.push_back(minimum_version_option.GetString());
+    }
+
     FileSpec sysroot_spec = GetSDKDirectoryForModules(sdk_type);
     
     if (sysroot_spec.IsDirectory())
index 980d8a8..cdc69a6 100644 (file)
@@ -130,7 +130,7 @@ protected:
     GetSDKDirectoryForModules (PlatformDarwin::SDKType sdk_type);
 
     void
-    AddClangModuleCompilationOptionsForSDKType (std::vector<std::string> &options, SDKType sdk_type);
+    AddClangModuleCompilationOptionsForSDKType (lldb_private::Target *target, std::vector<std::string> &options, SDKType sdk_type);
 
     std::string                 m_developer_directory;
 
index 37768bc..bef8e98 100644 (file)
@@ -99,9 +99,9 @@ public:
     GetSDKDirectory (lldb_private::Target &target) override;
     
     void
-    AddClangModuleCompilationOptions (std::vector<std::string> &options) override
+    AddClangModuleCompilationOptions (lldb_private::Target *target, std::vector<std::string> &options) override
     {
-        return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType(options, PlatformDarwin::SDKType::MacOSX);
+        return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType(target, options, PlatformDarwin::SDKType::MacOSX);
     }
 
 private:
index ba8c0af..2911b7f 100644 (file)
@@ -97,9 +97,9 @@ public:
                                      lldb_private::ArchSpec &arch) override;
     
     void
-    AddClangModuleCompilationOptions (std::vector<std::string> &options) override
+    AddClangModuleCompilationOptions (lldb_private::Target *target, std::vector<std::string> &options) override
     {
-        return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType(options, PlatformDarwin::SDKType::iPhoneOS);
+        return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType(target, options, PlatformDarwin::SDKType::iPhoneOS);
     }
 
 protected:
index 9b24e33..4cb336a 100644 (file)
@@ -99,9 +99,9 @@ public:
                                      lldb_private::ArchSpec &arch) override;
     
     void
-    AddClangModuleCompilationOptions (std::vector<std::string> &options) override
+    AddClangModuleCompilationOptions (lldb_private::Target *target, std::vector<std::string> &options) override
     {
-        return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType(options, PlatformDarwin::SDKType::iPhoneSimulator);
+        return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType(target, options, PlatformDarwin::SDKType::iPhoneSimulator);
     }
 
 protected:
index f9f289e..83a8769 100644 (file)
@@ -463,7 +463,7 @@ Platform::GetOSKernelDescription (std::string &s)
 }
 
 void
-Platform::AddClangModuleCompilationOptions (std::vector<std::string> &options)
+Platform::AddClangModuleCompilationOptions (Target *target, std::vector<std::string> &options)
 {
     std::vector<std::string> default_compilation_options =
     {