[llvm-dev] code duplication in cmake for sanitizer tests

Kostya Serebryany via llvm-dev llvm-dev at lists.llvm.org
Tue Jul 25 14:34:44 PDT 2017


I think both 'extract to common' and 'fifth copy' would be fine here, up to
you.

On Tue, Jul 25, 2017 at 1:42 PM, George Karpenkov <ekarpenkov at apple.com>
wrote:

> Good day,
>
> As part of a project of moving libFuzzer to compiler-rt I am trying to
> port libFuzzer tests to the new system.
> I have a question about CMake structure for sanitizer tests:
> compilation macros across different sanitizers are structured in
> almost-the-same-but-not-quite-way.
> For instance, across tsan/msan/asan/xray we have:
>
>  1 # tsan_compile(obj_list, source, arch, {headers})
>  2 *macro*(tsan_compile obj_list source arch)
>  3   *get_filename_component*(basename ${source} NAME)
>  4   *set*(output_obj "${basename}.${arch}.o")
>  5   get_target_flags_for_arch(${arch} TARGET_CFLAGS)
>  6   *set*(COMPILE_DEPS ${TSAN_RTL_HEADERS} ${ARGN})
>  7   *if*(NOT COMPILER_RT_STANDALONE_BUILD)
>  8     *list*(APPEND COMPILE_DEPS gtest tsan)
>  9   *endif*()
> 10   clang_compile(${output_obj} ${source}
> 11           CFLAGS ${TSAN_UNITTEST_CFLAGS} ${TARGET_CFLAGS}
> 12           DEPS ${COMPILE_DEPS})
> 13   *list*(APPEND ${obj_list} ${output_obj})
> 14 *endmacro*()
>
>  1 # Compile source for the given architecture, using compiler
>  2 # options in ${ARGN}, and add it to the object list.
>  3 *macro*(asan_compile obj_list source arch kind)
>  4   *get_filename_component*(basename ${source} NAME)
>  5   *if*(CMAKE_CONFIGURATION_TYPES)
>  6     *set*(output_obj "${CMAKE_CFG_INTDIR}/${obj_list}.${basename}.
> ${arch}${kind}.o")
>  7   *else*()
>  8     *set*(output_obj "${obj_list}.${basename}.${arch}${kind}.o")
>  9   *endif*()
> 10   get_target_flags_for_arch(${arch} TARGET_CFLAGS)
> 11   *set*(COMPILE_DEPS ${ASAN_UNITTEST_HEADERS} ${ASAN_BLACKLIST_FILE})
> 12   *if*(NOT COMPILER_RT_STANDALONE_BUILD)
> 13     *list*(APPEND COMPILE_DEPS gtest asan)
> 14   *endif*()
> 15   clang_compile(${output_obj} ${source}
> 16                 CFLAGS ${ARGN} ${TARGET_CFLAGS}
> 17                 DEPS ${COMPILE_DEPS})
> 18   *list*(APPEND ${obj_list} ${output_obj})
> 19 *endmacro*()
>
>  1 # Compile source for the given architecture, using compiler
>  2 # options in ${ARGN}, and add it to the object list.
>  3 *macro*(msan_compile obj_list source arch kind)
>  4   *get_filename_component*(basename ${source} NAME)
>  5   *set*(output_obj "${basename}.${arch}${kind}.o")
>  6   get_target_flags_for_arch(${arch} TARGET_CFLAGS)
>  7   *set*(COMPILE_DEPS ${MSAN_UNITTEST_HEADERS})
>  8   *if*(NOT COMPILER_RT_STANDALONE_BUILD)
>  9     *list*(APPEND COMPILE_DEPS gtest msan)
> 10   *endif*()
> 11   clang_compile(${output_obj} ${source}
> 12                 CFLAGS ${ARGN} ${TARGET_CFLAGS}
> 13                 DEPS ${COMPILE_DEPS})
> 14   *list*(APPEND ${obj_list} ${output_obj})
> 15 *endmacro*()
>
>  1 *macro*(xray_compile obj_list source arch)
>  2   *get_filename_component*(basename ${source} NAME)
>  3   *set*(output_obj "${basename}.${arch}.o")
>  4   get_target_flags_for_arch(${arch} TARGET_CFLAGS)
>  5   *if*(NOT COMPILER_RT_STANDALONE_BUILD)
>  6     *list*(APPEND COMPILE_DEPS gtest_main xray)
>  7   *endif*()
>  8   clang_compile(${output_obj} ${source}
>  9     CFLAGS ${XRAY_UNITTEST_CFLAGS} ${TARGET_CFLAGS}
> 10     DEPS ${COMPILE_DEPS})
> 11   *list*(APPEND ${obj_list} ${output_obj})
> 12 *endmacro*()
>
> The code is duplicated, yet with minor differences, begging question e.g.
> why CMAKE_CFG_INTDIR path workaround is applied to asan, but not to others.
>
> For future libraries in compiler-rt, should yet fifth copy of the function
> be added, or would it be better to extract it into a common macro which
> could be reused?
> I can do the latter if agreed that it is a good idea.
>
> George
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170725/0303e725/attachment-0001.html>


More information about the llvm-dev mailing list