1import("//compiler-rt/target.gni") 2 3source_set("cxx_sources") { 4 configs -= [ "//llvm/utils/gn/build:llvm_code" ] 5 configs += [ "//llvm/utils/gn/build:crt_code" ] 6 sources = [ "rtl/tsan_new_delete.cpp" ] 7} 8 9if (current_os == "mac") { 10 tsan_target_type = "shared_library" 11} else { 12 tsan_target_type = "static_library" 13} 14 15target(tsan_target_type, "tsan") { 16 configs -= [ "//llvm/utils/gn/build:llvm_code" ] 17 configs += [ "//llvm/utils/gn/build:crt_code" ] 18 19 output_dir = crt_current_out_dir 20 if (current_os == "mac") { 21 output_name = "clang_rt.tsan_osx_dynamic" 22 } else { 23 assert(current_os != "win", "Tsan does not work on Windows") 24 output_name = "clang_rt.tsan$crt_current_target_suffix" 25 } 26 27 deps = [ 28 "//compiler-rt/lib/interception:sources", 29 "//compiler-rt/lib/sanitizer_common:sources", 30 "//compiler-rt/lib/ubsan:sources", 31 ] 32 33 if (tsan_target_type == "static_library") { 34 complete_static_lib = true 35 configs -= [ "//llvm/utils/gn/build:thin_archive" ] 36 deps += [ ":tsan_cxx" ] 37 } else { 38 deps += [ 39 ":cxx_sources", 40 "//compiler-rt/lib/ubsan:cxx_sources", 41 ] 42 } 43 44 # It's performance-critical for TSan runtime to be built with -fPIE to reduce 45 # the number of register spills. 46 cflags = [ "-fPIE" ] 47 48 sources = [ 49 "rtl/tsan_clock.cpp", 50 "rtl/tsan_clock.h", 51 "rtl/tsan_debugging.cpp", 52 "rtl/tsan_defs.h", 53 "rtl/tsan_dense_alloc.h", 54 "rtl/tsan_external.cpp", 55 "rtl/tsan_fd.cpp", 56 "rtl/tsan_fd.h", 57 "rtl/tsan_flags.cpp", 58 "rtl/tsan_flags.h", 59 "rtl/tsan_flags.inc", 60 "rtl/tsan_ignoreset.cpp", 61 "rtl/tsan_ignoreset.h", 62 "rtl/tsan_interceptors.h", 63 "rtl/tsan_interceptors_posix.cpp", 64 "rtl/tsan_interface.cpp", 65 "rtl/tsan_interface.h", 66 "rtl/tsan_interface_ann.cpp", 67 "rtl/tsan_interface_ann.h", 68 "rtl/tsan_interface_atomic.cpp", 69 "rtl/tsan_interface_inl.h", 70 "rtl/tsan_interface_java.cpp", 71 "rtl/tsan_interface_java.h", 72 "rtl/tsan_malloc_mac.cpp", 73 "rtl/tsan_md5.cpp", 74 "rtl/tsan_mman.cpp", 75 "rtl/tsan_mman.h", 76 "rtl/tsan_mutex.cpp", 77 "rtl/tsan_mutex.h", 78 "rtl/tsan_mutexset.cpp", 79 "rtl/tsan_mutexset.h", 80 "rtl/tsan_platform.h", 81 "rtl/tsan_ppc_regs.h", 82 "rtl/tsan_preinit.cpp", 83 "rtl/tsan_report.cpp", 84 "rtl/tsan_report.h", 85 "rtl/tsan_rtl.cpp", 86 "rtl/tsan_rtl.h", 87 "rtl/tsan_rtl_mutex.cpp", 88 "rtl/tsan_rtl_proc.cpp", 89 "rtl/tsan_rtl_report.cpp", 90 "rtl/tsan_rtl_thread.cpp", 91 "rtl/tsan_stack_trace.cpp", 92 "rtl/tsan_stack_trace.h", 93 "rtl/tsan_stat.cpp", 94 "rtl/tsan_stat.h", 95 "rtl/tsan_suppressions.cpp", 96 "rtl/tsan_suppressions.h", 97 "rtl/tsan_symbolize.cpp", 98 "rtl/tsan_symbolize.h", 99 "rtl/tsan_sync.cpp", 100 "rtl/tsan_sync.h", 101 "rtl/tsan_trace.h", 102 "rtl/tsan_update_shadow_word_inl.h", 103 ] 104 if (target_os == "mac") { 105 sources += [ 106 "rtl/tsan_interceptors_libdispatch.cpp", 107 "rtl/tsan_interceptors_mac.cpp", 108 "rtl/tsan_interceptors_mach_vm.cpp", 109 "rtl/tsan_platform_mac.cpp", 110 "rtl/tsan_platform_posix.cpp", 111 ] 112 cflags += [ "-fblocks" ] 113 } else { 114 # Assume Linux 115 sources += [ 116 "rtl/tsan_platform_linux.cpp", 117 "rtl/tsan_platform_posix.cpp", 118 ] 119 } 120 if (target_cpu == "x64") { 121 sources += [ "rtl/tsan_rtl_amd64.S" ] 122 } else if (target_cpu == "arm64") { 123 sources += [ "rtl/tsan_rtl_aarch64.S" ] 124 } else if (target_cpu == "powerpc64") { 125 sources += [ "rtl/tsan_rtl_ppc64.S" ] 126 } else if (target_cpu == "mips64") { 127 sources += [ "rtl/tsan_rtl_mips64.S" ] 128 } 129 130 # To be able to include sanitizer_common. 131 include_dirs = [ ".." ] 132 133 # FIXME: have SANITIZER_COMMON_CFLAGS thingy? should fno-builtin be in 134 # crt_code? 135 cflags += [ "-fno-builtin" ] 136 137 # FIXME: link rt dl m pthread log 138 # FIXME: dep on libcxx-headers? 139 # FIXME: add_sanitizer_rt_version_list (cf hwasan) 140 # FIXME: need libclang_rt.tsan*.a.syms? 141 # FIXME: tsan_ignorelist.txt 142 143 if (target_os == "mac") { 144 # The -U flags below correspond to the add_weak_symbols() calls in CMake. 145 ldflags = [ 146 "-lc++", 147 "-lc++abi", 148 "-lobjc", 149 150 # sanitizer_common 151 "-Wl,-U,___sanitizer_free_hook", 152 "-Wl,-U,___sanitizer_malloc_hook", 153 "-Wl,-U,___sanitizer_report_error_summary", 154 "-Wl,-U,___sanitizer_sandbox_on_notify", 155 "-Wl,-U,___sanitizer_symbolize_code", 156 "-Wl,-U,___sanitizer_symbolize_data", 157 "-Wl,-U,___sanitizer_symbolize_demangle", 158 "-Wl,-U,___sanitizer_symbolize_flush", 159 160 # FIXME: better 161 "-Wl,-install_name,@rpath/libclang_rt.tsan_osx_dynamic.dylib", 162 ] 163 # FIXME: -Wl,-rpath 164 # FIXME: codesign (??) 165 } 166} 167 168if (tsan_target_type == "static_library") { 169 static_library("tsan_cxx") { 170 assert(current_os != "win", "FIXME") 171 output_dir = crt_current_out_dir 172 output_name = "clang_rt.tsan_cxx$crt_current_target_suffix" 173 complete_static_lib = true 174 configs -= [ "//llvm/utils/gn/build:thin_archive" ] 175 deps = [ 176 ":cxx_sources", 177 "//compiler-rt/lib/ubsan:cxx_sources", 178 ] 179 } 180} 181# FIXME: 182# Build libcxx instrumented with TSan. 183