Don't use -ffunction-sections if -fno-function-sections is not supported in the compiler.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Mon, 3 Feb 2014 13:57:09 +0000 (13:57 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Mon, 3 Feb 2014 13:57:09 +0000 (13:57 +0000)
This will disable -ffunction-sections in older versions of Clang where it
breaks build of sanitizer runtime library.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200695 91177308-0d34-0410-b5e6-96231b3b80d8

cmake/modules/HandleLLVMOptions.cmake

index 47d3b2f79d491f353c1c78e580696b1e63935fd8..38bbd2ea7e10aabff58e358e8c69b96ce7f249aa 100644 (file)
@@ -350,13 +350,23 @@ if (UNIX AND
   append("-fcolor-diagnostics" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
 endif()
 
+# Clang prior to 3.5 ignored -fno-function-sections.
+# It's pretty hard to test directly, so we rely on the version number.
+if( ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5) )
+  set(LLVM_COMPILER_HAS_BROKEN_FNO_FUNCTION_SECTIONS ON)
+endif()
+
 # Add flags for add_dead_strip().
 # FIXME: With MSVS, consider compiling with /Gy and linking with /OPT:REF?
 # But MinSizeRel seems to add that automatically, so maybe disable these
 # flags instead if LLVM_NO_DEAD_STRIP is set.
 if(NOT CYGWIN AND NOT WIN32)
   if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
-    append("-ffunction-sections -fdata-sections" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+    # Don't add -ffunction-section if it can be disabled with -fno-function-sections.
+    # Doing so will break sanitizers.
+    if (NOT LLVM_COMPILER_HAS_BROKEN_FNO_FUNCTION_SECTIONS)
+      append("-ffunction-sections -fdata-sections" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+    endif()
   endif()
 endif()