George Karpenkov via llvm-dev
2017-Jul-25 20:42 UTC
[llvm-dev] code duplication in cmake for sanitizer tests
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/c3896c93/attachment.html>
Kostya Serebryany via llvm-dev
2017-Jul-25 21:34 UTC
[llvm-dev] code duplication in cmake for sanitizer tests
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>