<div dir="ltr">Looks like this is causing <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/7530">print-func.test to fail</a>.  Could you please take a look?<div><pre style="font-family:"Courier New",courier,monotype,monospace;color:rgb(0,0,0);font-size:medium;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial"><span class="gmail-stdout" style="font-family:"Courier New",courier,monotype,monospace;color:black">FAIL: LLVMFuzzer :: print-func.test (1637 of 3721)
******************** TEST 'LLVMFuzzer :: print-func.test' FAILED ********************
Script:
--
/b/sanitizer-x86_64-linux/build/llvm_build64/bin/clang --driver-mode=g++ -std=c++11 -lstdc++ -gline-tables-only  -fsanitize=address,fuzzer -I/b/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/lib/fuzzer /b/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/fuzzer/PrintFuncTest.cpp -o /b/sanitizer-x86_64-linux/build/compiler_rt_build/test/fuzzer/Output/print-func.test.tmp
/b/sanitizer-x86_64-linux/build/compiler_rt_build/test/fuzzer/Output/print-func.test.tmp -seed=1 -runs=100000 2>&1 | FileCheck /b/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/fuzzer/print-func.test
/b/sanitizer-x86_64-linux/build/compiler_rt_build/test/fuzzer/Output/print-func.test.tmp -seed=1 -runs=100000 -print_funcs=0 2>&1 | FileCheck /b/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/fuzzer/print-func.test --check-prefix=NO
--
Exit Code: 1

Command Output (stderr):
--
/b/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/fuzzer/print-func.test:10:5: error: expected string not found in input
NO: BINGO
    ^
<stdin>:1:1: note: scanning from here
INFO: Seed: 1
^</span></pre></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 16, 2018 at 4:42 PM, Petr Hosek via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: phosek<br>
Date: Tue Jan 16 16:42:48 2018<br>
New Revision: 322604<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=322604&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=322604&view=rev</a><br>
Log:<br>
[libFuzzer] Support using libc++<br>
<br>
This is needed in case the users of libFuzzer use libc++ in their<br>
code, which the fuzz target (libFuzzer) will be linked against.<br>
When libc++ source is available, we build a private version of it<br>
and link it against libFuzzer which allows using the same static<br>
library against codebases which use both libc++ and libstdc++.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D37631" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D37631</a><br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/fuzzer/<wbr>CMakeLists.txt<br>
    compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerInterface.h<br>
    compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerLoop.cpp<br>
    compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerMain.cpp<br>
    compiler-rt/trunk/lib/fuzzer/<wbr>tests/CMakeLists.txt<br>
    compiler-rt/trunk/test/fuzzer/<wbr>CMakeLists.txt<br>
    compiler-rt/trunk/test/fuzzer/<wbr>lit.cfg<br>
    compiler-rt/trunk/test/fuzzer/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank"><wbr>lit.site.cfg.in</a><br>
<br>
Modified: compiler-rt/trunk/lib/fuzzer/<wbr>CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/fuzzer/CMakeLists.txt?rev=322604&r1=322603&r2=322604&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>fuzzer/CMakeLists.txt?rev=<wbr>322604&r1=322603&r2=322604&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/fuzzer/<wbr>CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/lib/fuzzer/<wbr>CMakeLists.txt Tue Jan 16 16:42:48 2018<br>
@@ -33,6 +33,10 @@ CHECK_CXX_SOURCE_COMPILES("<br>
<br>
 set(LIBFUZZER_CFLAGS ${SANITIZER_COMMON_CFLAGS})<br>
<br>
+if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND COMPILER_RT_LIBCXX_PATH)<br>
+  list(APPEND LIBFUZZER_CFLAGS -nostdinc++ -D_LIBCPP_ABI_VERSION=__<wbr>Fuzzer)<br>
+endif()<br>
+<br>
 append_list_if(COMPILER_RT_<wbr>HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer LIBFUZZER_CFLAGS)<br>
<br>
 if (CMAKE_CXX_FLAGS MATCHES "fsanitize-coverage")<br>
@@ -75,6 +79,38 @@ add_compiler_rt_runtime(clang_<wbr>rt.fuzzer_<br>
   CFLAGS ${LIBFUZZER_CFLAGS}<br>
   PARENT_TARGET fuzzer)<br>
<br>
+if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND COMPILER_RT_LIBCXX_PATH)<br>
+       macro(partially_link_libcxx name dir arch)<br>
+               set(cxx_${arch}_merge_dir "${CMAKE_CURRENT_BINARY_DIR}/<wbr>cxx_${arch}_merge.dir")<br>
+               file(MAKE_DIRECTORY ${cxx_${arch}_merge_dir})<br>
+               add_custom_command(TARGET clang_rt.${name}-${arch} POST_BUILD<br>
+                       COMMAND ${CMAKE_LINKER} --whole-archive "$<TARGET_LINKER_FILE:clang_<wbr>rt.${name}-${arch}>" --no-whole-archive ${dir}/lib/libc++.a -r -o ${name}.o<br>
+                       COMMAND ${CMAKE_OBJCOPY} --localize-hidden ${name}.o<br>
+                       COMMAND ${CMAKE_COMMAND} -E remove "$<TARGET_LINKER_FILE:clang_<wbr>rt.${name}-${arch}>"<br>
+                       COMMAND ${CMAKE_AR} qcs "$<TARGET_LINKER_FILE:clang_<wbr>rt.${name}-${arch}>" ${name}.o<br>
+                       WORKING_DIRECTORY ${cxx_${arch}_merge_dir}<br>
+               )<br>
+       endmacro()<br>
+<br>
+  foreach(arch ${FUZZER_SUPPORTED_ARCH})<br>
+    get_target_flags_for_arch(${<wbr>arch} TARGET_CFLAGS)<br>
+    set(LIBCXX_${arch}_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/<wbr>libcxx_fuzzer_${arch})<br>
+    add_custom_libcxx(libcxx_<wbr>fuzzer_${arch} ${LIBCXX_${arch}_PREFIX}<br>
+      CFLAGS ${TARGET_CFLAGS}<br>
+             -D_LIBCPP_ABI_VERSION=__Fuzzer<br>
+             -D_LIBCPP_DISABLE_VISIBILITY_<wbr>ANNOTATIONS=1<br>
+             -fvisibility=hidden<br>
+      CMAKE_ARGS -DLIBCXX_ENABLE_EXCEPTIONS=OFF<br>
+                 -DLIBCXX_CXX_ABI=none)<br>
+    target_compile_options(<wbr>RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/<wbr>include/c++/v1)<br>
+    add_dependencies(RTfuzzer.${<wbr>arch} libcxx_fuzzer_${arch})<br>
+    target_compile_options(<wbr>RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/<wbr>include/c++/v1)<br>
+    add_dependencies(RTfuzzer_<wbr>main.${arch} libcxx_fuzzer_${arch})<br>
+    partially_link_libcxx(fuzzer_<wbr>no_main ${LIBCXX_${arch}_PREFIX} ${arch})<br>
+    partially_link_libcxx(fuzzer ${LIBCXX_${arch}_PREFIX} ${arch})<br>
+  endforeach()<br>
+endif()<br>
+<br>
 if(COMPILER_RT_INCLUDE_TESTS)<br>
   add_subdirectory(tests)<br>
 endif()<br>
<br>
Modified: compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerInterface.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/fuzzer/FuzzerInterface.h?rev=322604&r1=322603&r2=322604&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>fuzzer/FuzzerInterface.h?rev=<wbr>322604&r1=322603&r2=322604&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerInterface.h (original)<br>
+++ compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerInterface.h Tue Jan 16 16:42:48 2018<br>
@@ -30,35 +30,39 @@ extern "C" {<br>
 // Executes the code under test with [Data, Data+Size) as the input.<br>
 // libFuzzer will invoke this function *many* times with different inputs.<br>
 // Must return 0.<br>
-int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);<br>
+__attribute__((visibility("<wbr>default"))) int<br>
+LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);<br>
<br>
 // Optional user-provided initialization function.<br>
 // If provided, this function will be called by libFuzzer once at startup.<br>
 // It may read and modify argc/argv.<br>
 // Must return 0.<br>
-int LLVMFuzzerInitialize(int *argc, char ***argv);<br>
+__attribute__((visibility("<wbr>default"))) int LLVMFuzzerInitialize(int *argc,<br>
+                                                                char ***argv);<br>
<br>
 // Optional user-provided custom mutator.<br>
 // Mutates raw data in [Data, Data+Size) inplace.<br>
 // Returns the new size, which is not greater than MaxSize.<br>
 // Given the same Seed produces the same mutation.<br>
-size_t LLVMFuzzerCustomMutator(uint8_<wbr>t *Data, size_t Size, size_t MaxSize,<br>
-                               unsigned int Seed);<br>
+__attribute__((visibility("<wbr>default"))) size_t<br>
+LLVMFuzzerCustomMutator(<wbr>uint8_t *Data, size_t Size, size_t MaxSize,<br>
+                        unsigned int Seed);<br>
<br>
 // Optional user-provided custom cross-over function.<br>
 // Combines pieces of Data1 & Data2 together into Out.<br>
 // Returns the new size, which is not greater than MaxOutSize.<br>
 // Should produce the same mutation given the same Seed.<br>
-size_t LLVMFuzzerCustomCrossOver(<wbr>const uint8_t *Data1, size_t Size1,<br>
-                                 const uint8_t *Data2, size_t Size2,<br>
-                                 uint8_t *Out, size_t MaxOutSize,<br>
-                                 unsigned int Seed);<br>
+__attribute__((visibility("<wbr>default"))) size_t<br>
+LLVMFuzzerCustomCrossOver(<wbr>const uint8_t *Data1, size_t Size1,<br>
+                          const uint8_t *Data2, size_t Size2, uint8_t *Out,<br>
+                          size_t MaxOutSize, unsigned int Seed);<br>
<br>
 // Experimental, may go away in future.<br>
 // libFuzzer-provided function to be used inside LLVMFuzzerCustomMutator.<br>
 // Mutates raw data in [Data, Data+Size) inplace.<br>
 // Returns the new size, which is not greater than MaxSize.<br>
-size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize);<br>
+__attribute__((visibility("<wbr>default"))) size_t<br>
+LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize);<br>
<br>
 #ifdef __cplusplus<br>
 }  // extern "C"<br>
<br>
Modified: compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerLoop.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/fuzzer/FuzzerLoop.cpp?rev=322604&r1=322603&r2=322604&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>fuzzer/FuzzerLoop.cpp?rev=<wbr>322604&r1=322603&r2=322604&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerLoop.cpp (original)<br>
+++ compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerLoop.cpp Tue Jan 16 16:42:48 2018<br>
@@ -826,13 +826,15 @@ void Fuzzer::AnnounceOutput(const uint8_<br>
<br>
 extern "C" {<br>
<br>
-size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize) {<br>
+__attribute__((visibility("<wbr>default"))) size_t<br>
+LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize) {<br>
   assert(fuzzer::F);<br>
   return fuzzer::F->GetMD().<wbr>DefaultMutate(Data, Size, MaxSize);<br>
 }<br>
<br>
 // Experimental<br>
-void LLVMFuzzerAnnounceOutput(const uint8_t *Data, size_t Size) {<br>
+__attribute__((visibility("<wbr>default"))) void<br>
+LLVMFuzzerAnnounceOutput(<wbr>const uint8_t *Data, size_t Size) {<br>
   assert(fuzzer::F);<br>
   fuzzer::F->AnnounceOutput(<wbr>Data, Size);<br>
 }<br>
<br>
Modified: compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerMain.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/fuzzer/FuzzerMain.cpp?rev=322604&r1=322603&r2=322604&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>fuzzer/FuzzerMain.cpp?rev=<wbr>322604&r1=322603&r2=322604&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerMain.cpp (original)<br>
+++ compiler-rt/trunk/lib/fuzzer/<wbr>FuzzerMain.cpp Tue Jan 16 16:42:48 2018<br>
@@ -16,6 +16,6 @@ extern "C" {<br>
 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);<br>
 }  // extern "C"<br>
<br>
-int main(int argc, char **argv) {<br>
+__attribute__ ((visibility("default"))) int main(int argc, char **argv) {<br>
   return fuzzer::FuzzerDriver(&argc, &argv, LLVMFuzzerTestOneInput);<br>
 }<br>
<br>
Modified: compiler-rt/trunk/lib/fuzzer/<wbr>tests/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/fuzzer/tests/CMakeLists.txt?rev=322604&r1=322603&r2=322604&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>fuzzer/tests/CMakeLists.txt?<wbr>rev=322604&r1=322603&r2=<wbr>322604&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/fuzzer/<wbr>tests/CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/lib/fuzzer/<wbr>tests/CMakeLists.txt Tue Jan 16 16:42:48 2018<br>
@@ -18,6 +18,10 @@ else()<br>
   list(APPEND LIBFUZZER_UNITTEST_LINK_FLAGS -lstdc++ -lpthread)<br>
 endif()<br>
<br>
+if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND COMPILER_RT_LIBCXX_PATH)<br>
+  list(APPEND LIBFUZZER_UNITTEST_CFLAGS -nostdinc++ -D_LIBCPP_ABI_VERSION=__<wbr>Fuzzer)<br>
+endif()<br>
+<br>
 foreach(arch ${FUZZER_SUPPORTED_ARCH})<br>
   set(LIBFUZZER_TEST_RUNTIME RTFuzzerTest.${arch})<br>
   if(APPLE)<br>
@@ -33,14 +37,20 @@ foreach(arch ${FUZZER_SUPPORTED_ARCH})<br>
     ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}<br>
     FOLDER "Compiler-RT Runtime tests")<br>
<br>
+       if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND COMPILER_RT_LIBCXX_PATH)<br>
+    set(LIBFUZZER_TEST_RUNTIME_<wbr>DEPS libcxx_fuzzer_${arch})<br>
+    set(LIBFUZZER_TEST_RUNTIME_<wbr>CFLAGS -isystem ${LIBCXX_${arch}_PREFIX}/<wbr>include/c++/v1)<br>
+    set(LIBFUZZER_TEST_RUNTIME_<wbr>LINK_FLAGS ${LIBCXX_${arch}_PREFIX}/lib/<wbr>libc++.a)<br>
+  endif()<br>
+<br>
   set(FuzzerTestObjects)<br>
   generate_compiler_rt_tests(<wbr>FuzzerTestObjects<br>
     FuzzerUnitTests "Fuzzer-${arch}-Test" ${arch}<br>
     SOURCES FuzzerUnittest.cpp ${COMPILER_RT_GTEST_SOURCE}<br>
     RUNTIME ${LIBFUZZER_TEST_RUNTIME}<br>
-    DEPS gtest<br>
-    CFLAGS ${LIBFUZZER_UNITTEST_CFLAGS}<br>
-    LINK_FLAGS ${LIBFUZZER_UNITTEST_LINK_<wbr>FLAGS})<br>
+    DEPS gtest ${LIBFUZZER_TEST_RUNTIME_DEPS}<br>
+    CFLAGS ${LIBFUZZER_UNITTEST_CFLAGS} ${LIBFUZZER_TEST_RUNTIME_<wbr>CFLAGS}<br>
+    LINK_FLAGS ${LIBFUZZER_UNITTEST_LINK_<wbr>FLAGS} ${LIBFUZZER_TEST_RUNTIME_LINK_<wbr>FLAGS})<br>
   set_target_properties(<wbr>FuzzerUnitTests PROPERTIES<br>
     RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})<br>
 endforeach()<br>
<br>
Modified: compiler-rt/trunk/test/fuzzer/<wbr>CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/fuzzer/CMakeLists.txt?rev=322604&r1=322603&r2=322604&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/fuzzer/CMakeLists.txt?<wbr>rev=322604&r1=322603&r2=<wbr>322604&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/fuzzer/<wbr>CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/test/fuzzer/<wbr>CMakeLists.txt Tue Jan 16 16:42:48 2018<br>
@@ -8,36 +8,65 @@ if(COMPILER_RT_INCLUDE_TESTS)<br>
   list(APPEND LIBFUZZER_TEST_DEPS FuzzerUnitTests)<br>
 endif()<br>
<br>
-set(LIBFUZZER_TESTSUITES)<br>
-<br>
+add_custom_target(check-<wbr>fuzzer)<br>
<br>
 if(COMPILER_RT_INCLUDE_TESTS)<br>
   # libFuzzer unit tests.<br>
   configure_lit_site_cfg(<br>
     ${CMAKE_CURRENT_SOURCE_DIR}/<wbr>unit/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
     ${CMAKE_CURRENT_BINARY_DIR}/<wbr>unit/lit.site.cfg)<br>
-  list(APPEND LIBFUZZER_TESTSUITES ${CMAKE_CURRENT_BINARY_DIR}/<wbr>unit)<br>
+  add_lit_testsuite(check-<wbr>fuzzer-unit "Running Fuzzer unit tests"<br>
+    ${CMAKE_CURRENT_BINARY_DIR}/<wbr>unit<br>
+    DEPENDS ${LIBFUZZER_TEST_DEPS})<br>
+  set_target_properties(check-<wbr>fuzzer-unit PROPERTIES FOLDER "Compiler-RT Tests")<br>
+  add_dependencies(check-fuzzer check-fuzzer-unit)<br>
 endif()<br>
<br>
-foreach(arch ${FUZZER_SUPPORTED_ARCH})<br>
-  set(LIBFUZZER_TEST_COMPILER ${COMPILER_RT_TEST_COMPILER})<br>
-  get_test_cc_for_arch(${arch} LIBFUZZER_TEST_COMPILER LIBFUZZER_TEST_FLAGS)<br>
-<br>
-  string(TOUPPER ${arch} ARCH_UPPER_CASE)<br>
-  set(CONFIG_NAME ${ARCH_UPPER_CASE}${OS_NAME}<wbr>Config)<br>
-<br>
-  # LIT-based libFuzzer tests.<br>
-  configure_lit_site_cfg(<br>
-    ${CMAKE_CURRENT_SOURCE_DIR}/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">li<wbr>t.site.cfg.in</a><br>
-    ${CMAKE_CURRENT_BINARY_DIR}/${<wbr>CONFIG_NAME}/lit.site.cfg<br>
-    )<br>
-  list(APPEND LIBFUZZER_TESTSUITES ${CMAKE_CURRENT_BINARY_DIR}/${<wbr>CONFIG_NAME})<br>
-<br>
-endforeach()<br>
+macro(test_fuzzer stdlib)<br>
+  cmake_parse_arguments(TEST "" "" "DEPS" ${ARGN})<br>
+  string(REPLACE "+" "x" stdlib_name ${stdlib})<br>
+  string(REPLACE "-" ";" stdlib_list ${stdlib_name})<br>
+  set(STDLIB_CAPITALIZED "")<br>
+  foreach(part IN LISTS stdlib_list)<br>
+    string(SUBSTRING ${part} 0 1 first_letter)<br>
+    string(TOUPPER ${first_letter} first_letter)<br>
+    string(REGEX REPLACE "^.(.*)" "${first_letter}\\1" part "${part}")<br>
+    set(STDLIB_CAPITALIZED "${STDLIB_CAPITALIZED}${part}"<wbr>)<br>
+  endforeach()<br>
+  foreach(arch ${FUZZER_SUPPORTED_ARCH})<br>
+    set(LIBFUZZER_TEST_COMPILER ${COMPILER_RT_TEST_COMPILER})<br>
+    get_test_cc_for_arch(${arch} LIBFUZZER_TEST_COMPILER LIBFUZZER_TEST_FLAGS)<br>
+<br>
+    set(LIBFUZZER_TEST_STDLIB ${stdlib})<br>
+<br>
+    string(TOUPPER ${arch} ARCH_UPPER_CASE)<br>
+    set(CONFIG_NAME ${ARCH_UPPER_CASE}${STDLIB_<wbr>CAPITALIZED}${OS_NAME}Config)<br>
+<br>
+    # LIT-based libFuzzer tests.<br>
+    configure_lit_site_cfg(<br>
+      ${CMAKE_CURRENT_SOURCE_DIR}/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">li<wbr>t.site.cfg.in</a><br>
+      ${CMAKE_CURRENT_BINARY_DIR}/${<wbr>CONFIG_NAME}/lit.site.cfg<br>
+      )<br>
+<br>
+    add_lit_testsuite(check-<wbr>fuzzer-${stdlib_name} "Running Fuzzer ${stdlib} tests"<br>
+      ${CMAKE_CURRENT_BINARY_DIR}/${<wbr>CONFIG_NAME}<br>
+      DEPENDS ${LIBFUZZER_TEST_DEPS})<br>
+    if(TEST_DEPS)<br>
+      add_dependencies(check-fuzzer-<wbr>${stdlib_name} ${TEST_DEPS})<br>
+    endif()<br>
+    set_target_properties(check-<wbr>fuzzer-${stdlib_name} PROPERTIES FOLDER "Compiler-RT Tests")<br>
+    add_dependencies(check-fuzzer check-fuzzer-${stdlib_name})<br>
+  endforeach()<br>
+endmacro()<br>
+<br>
+test_fuzzer("default")<br>
+if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")<br>
+  if(TARGET cxx_shared)<br>
+    test_fuzzer("libc++" DEPS cxx_shared)<br>
+  endif()<br>
+  if(TARGET cxx_static)<br>
+    test_fuzzer("static-libc++" DEPS cxx_static)<br>
+  endif()<br>
+endif()<br>
<br>
 set(EXCLUDE_FROM_ALL ON)<br>
-<br>
-add_lit_testsuite(check-<wbr>fuzzer "Running Fuzzer tests"<br>
-  ${LIBFUZZER_TESTSUITES}<br>
-  DEPENDS ${LIBFUZZER_TEST_DEPS})<br>
-set_target_properties(check-<wbr>fuzzer PROPERTIES FOLDER "Compiler-RT Tests")<br>
<br>
Modified: compiler-rt/trunk/test/fuzzer/<wbr>lit.cfg<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/fuzzer/lit.cfg?rev=322604&r1=322603&r2=322604&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/fuzzer/lit.cfg?rev=<wbr>322604&r1=322603&r2=322604&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/fuzzer/<wbr>lit.cfg (original)<br>
+++ compiler-rt/trunk/test/fuzzer/<wbr>lit.cfg Tue Jan 16 16:42:48 2018<br>
@@ -7,6 +7,8 @@ config.test_format = lit.formats.ShTest(<br>
 config.suffixes = ['.test']<br>
 config.test_source_root = os.path.dirname(__file__)<br>
<br>
+config.environment['LD_<wbr>LIBRARY_PATH'] = config.llvm_library_dir<br>
+<br>
 # Choose between lit's internal shell pipeline runner and a real shell.  If<br>
 # LIT_USE_INTERNAL_SHELL is in the environment, we use that as an override.<br>
 use_lit_shell = os.environ.get("LIT_USE_<wbr>INTERNAL_SHELL")<br>
@@ -51,8 +53,13 @@ config.substitutions.append(('<wbr>%libfuzzer<br>
<br>
 def generate_compiler_cmd(is_cpp=<wbr>True, fuzzer_enabled=True):<br>
   compiler_cmd = config.c_compiler<br>
-  link_cmd = '-lc++' if any(x in config.target_triple for x in ('darwin', 'freebsd')) else '-lstdc++'<br>
-  std_cmd = '-std=c++11' if is_cpp else ''<br>
+  if config.clang and config.stdlib == 'libc++':<br>
+    link_cmd = '-stdlib=libc++'<br>
+  elif config.clang and config.stdlib == 'static-libc++':<br>
+    link_cmd = '-stdlib=libc++ -lc++abi -static-libstdc++'<br>
+  else:<br>
+    link_cmd = '-lc++' if any(x in config.target_triple for x in ('darwin', 'freebsd')) else '-lstdc++'<br>
+  std_cmd = '--driver-mode=g++ -std=c++11' if is_cpp else ''<br>
   sanitizers = ['address']<br>
   if fuzzer_enabled:<br>
     sanitizers.append('fuzzer')<br>
<br>
Modified: compiler-rt/trunk/test/fuzzer/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank"><wbr>lit.site.cfg.in</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/fuzzer/lit.site.cfg.in?rev=322604&r1=322603&r2=322604&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/fuzzer/lit.site.cfg.in?<wbr>rev=322604&r1=322603&r2=<wbr>322604&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/fuzzer/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank"><wbr>lit.site.cfg.in</a> (original)<br>
+++ compiler-rt/trunk/test/fuzzer/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank"><wbr>lit.site.cfg.in</a> Tue Jan 16 16:42:48 2018<br>
@@ -5,9 +5,11 @@ config.test_exec_root = "@CMAKE_CURRENT_<br>
 config.cpp_compiler = "@LIBFUZZER_TEST_COMPILER@"<br>
 config.target_flags = "@LIBFUZZER_TEST_FLAGS@"<br>
 config.c_compiler = "@LIBFUZZER_TEST_COMPILER@"<br>
+config.stdlib = "@LIBFUZZER_TEST_STDLIB@"<br>
<br>
 config.osx_sysroot_flag = "@OSX_SYSROOT_FLAG@"<br>
 config.cmake_binary_dir = "@CMAKE_BINARY_DIR@"<br>
+config.llvm_library_dir = "@LLVM_LIBRARY_DIR@"<br>
 config.target_triple = "@TARGET_TRIPLE@"<br>
<br>
 # Load common config for all compiler-rt lit tests.<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>