[PATCH] Add CMake option LLVM_USE_SANITIZER to allow bootstrap of LLVM/Clang under ASan/MSan.

Alexey Samsonov samsonov at google.com
Wed Mar 13 14:08:08 PDT 2013


  Simplify the patch as part of it was commited earlier.

Hi Bigcheese, chandlerc, eugenis,

http://llvm-reviews.chandlerc.com/D459

CHANGE SINCE LAST DIFF
  http://llvm-reviews.chandlerc.com/D459?vs=1095&id=1279#toc

Files:
  CMakeLists.txt
  cmake/modules/HandleLLVMOptions.cmake

Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt
+++ CMakeLists.txt
@@ -193,6 +193,9 @@
   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
 endif( LLVM_USE_OPROFILE )
 
+set(LLVM_USE_SANITIZER "" CACHE STRING
+  "Define the sanitizer used to build binaries and tests.")
+
 # Define an option controlling whether we should build for 32-bit on 64-bit
 # platforms, where supported.
 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
Index: cmake/modules/HandleLLVMOptions.cmake
===================================================================
--- cmake/modules/HandleLLVMOptions.cmake
+++ cmake/modules/HandleLLVMOptions.cmake
@@ -77,6 +77,13 @@
   endif()
 endfunction()
 
+function(add_flag_if_supported flag)
+  check_c_compiler_flag(${flag} C_SUPPORTS_${flag})
+  append_if(CMAKE_C_FLAGS "${flag}" C_SUPPORTS_${flag})
+  check_cxx_compiler_flag(${flag} CXX_SUPPORTS_${flag})
+  append_if(CMAKE_CXX_FLAGS "${flag}" CXX_SUPPORTS_${flag})
+endfunction()
+
 if( LLVM_ENABLE_PIC )
   if( XCODE )
     # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
@@ -217,6 +224,32 @@
   endif (LLVM_ENABLE_WERROR)
 endif( MSVC )
 
+function(append_common_sanitizer_flags)
+  if(NOT LLVM_ENABLE_PIC)
+    message(WARNING "LLVM_USE_SANITIZER can only be used with LLVM_ENABLE_PIC")
+  endif()
+  # Append -fno-omit-frame-pointer and -g to get better stack traces.
+  add_flag_if_supported("-fno-omit-frame-pointer")
+  add_flag_if_supported("-g")
+endfunction()
+
+if (LLVM_ON_UNIX)
+  # Turn on sanitizers if necessary.
+  string(TOUPPER "${LLVM_USE_SANITIZER}" uppercase_LLVM_USE_SANITIZER)
+  if (uppercase_LLVM_USE_SANITIZER STREQUAL "ADDRESS")
+    append_common_sanitizer_flags()
+    add_flag_or_print_warning("-fsanitize=address")
+  elseif (uppercase_LLVM_USE_SANITIZER MATCHES "MEMORY(WITHORIGINS)?")
+    append_common_sanitizer_flags()
+    add_flag_or_print_warning("-fsanitize=memory")
+    # -pie is required for MSan.
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie")
+    if(uppercase_LLVM_USE_SANITIZER STREQUAL "MEMORYWITHORIGINS")
+      add_flag_or_print_warning("-fsanitize-memory-track-origins")
+    endif()
+  endif()
+endif()
+
 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
 add_llvm_definitions( -D__STDC_FORMAT_MACROS )
 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D459.2.patch
Type: text/x-patch
Size: 2383 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130313/fb0d3091/attachment.bin>


More information about the llvm-commits mailing list