diff --git a/llvm/utils/gn/secondary/compiler-rt/gen_version_script.gni b/llvm/utils/gn/secondary/compiler-rt/gen_version_script.gni new file mode 100644 --- /dev/null +++ b/llvm/utils/gn/secondary/compiler-rt/gen_version_script.gni @@ -0,0 +1,37 @@ +import("//compiler-rt/target.gni") + +template("gen_version_script") { + if (current_os != "mac" && current_os != "win") { + action(target_name) { + script = "//compiler-rt/lib/sanitizer_common/scripts/gen_dynamic_list.py" + sources = [ invoker.extra ] + deps = invoker.libs + outputs = [ invoker.output ] + args = [ + "--version-list", + "--extra", + rebase_path(invoker.extra, root_build_dir), + ] + foreach(lib_name, invoker.lib_names) { + args += [ rebase_path( + "$crt_current_out_dir/libclang_rt.$lib_name$crt_current_target_suffix.a", + root_build_dir) ] + } + args += [ + "--nm-executable", + "nm", + "-o", + rebase_path(invoker.output, root_build_dir), + ] + } + } else { + source_set(target_name) {} + not_needed(invoker, + [ + "extra", + "lib_names", + "libs", + "output", + ]) + } +} diff --git a/llvm/utils/gn/secondary/compiler-rt/lib/BUILD.gn b/llvm/utils/gn/secondary/compiler-rt/lib/BUILD.gn --- a/llvm/utils/gn/secondary/compiler-rt/lib/BUILD.gn +++ b/llvm/utils/gn/secondary/compiler-rt/lib/BUILD.gn @@ -10,7 +10,10 @@ deps += [ "//compiler-rt/lib/ubsan_minimal" ] } if (current_os != "win" && current_os != "baremetal") { - deps += [ "//compiler-rt/lib/asan" ] + deps += [ + "//compiler-rt/lib/asan", + "//compiler-rt/lib/ubsan", + ] if (current_cpu == "x64" || current_cpu == "arm64") { deps += [ "//compiler-rt/lib/tsan/rtl" ] } diff --git a/llvm/utils/gn/secondary/compiler-rt/lib/hwasan/BUILD.gn b/llvm/utils/gn/secondary/compiler-rt/lib/hwasan/BUILD.gn --- a/llvm/utils/gn/secondary/compiler-rt/lib/hwasan/BUILD.gn +++ b/llvm/utils/gn/secondary/compiler-rt/lib/hwasan/BUILD.gn @@ -1,3 +1,4 @@ +import("//compiler-rt/gen_version_script.gni") import("//compiler-rt/target.gni") if (current_cpu == "x64") { @@ -6,28 +7,16 @@ hwasan_name = "hwasan" } -action("version_script") { - script = "//compiler-rt/lib/sanitizer_common/scripts/gen_dynamic_list.py" - sources = [ "hwasan.syms.extra" ] - deps = [ +gen_version_script("version_script") { + extra = "hwasan.syms.extra" + output = "$target_gen_dir/hwasan.vers" + libs = [ ":hwasan", ":hwasan_cxx", ] - outputs = [ "$target_gen_dir/hwasan.vers" ] - args = [ - "--version-list", - "--extra", - rebase_path(sources[0], root_build_dir), - rebase_path( - "$crt_current_out_dir/libclang_rt.$hwasan_name$crt_current_target_suffix.a", - root_build_dir), - rebase_path( - "$crt_current_out_dir/libclang_rt.${hwasan_name}_cxx$crt_current_target_suffix.a", - root_build_dir), - "--nm-executable", - "nm", - "-o", - rebase_path(outputs[0], root_build_dir), + lib_names = [ + "$hwasan_name", + "${hwasan_name}_cxx", ] } diff --git a/llvm/utils/gn/secondary/compiler-rt/lib/ubsan/BUILD.gn b/llvm/utils/gn/secondary/compiler-rt/lib/ubsan/BUILD.gn --- a/llvm/utils/gn/secondary/compiler-rt/lib/ubsan/BUILD.gn +++ b/llvm/utils/gn/secondary/compiler-rt/lib/ubsan/BUILD.gn @@ -1,3 +1,29 @@ +import("//compiler-rt/gen_version_script.gni") +import("//compiler-rt/target.gni") + +group("ubsan") { + deps = [ + ":ubsan_shared", + ":ubsan_static", + ] + if (current_os != "mac") { + deps += [ ":ubsan_static_cxx" ] + } +} + +gen_version_script("version_script") { + extra = "ubsan.syms.extra" + output = "$target_gen_dir/ubsan.vers" + libs = [ + ":ubsan_static", + ":ubsan_static_cxx", + ] + lib_names = [ + "ubsan_standalone", + "ubsan_standalone_cxx", + ] +} + source_set("sources") { configs -= [ "//llvm/utils/gn/build:llvm_code" ] configs += [ "//llvm/utils/gn/build:crt_code" ] @@ -46,7 +72,6 @@ sources = [ "ubsan_win_dynamic_runtime_thunk.cpp" ] } -# Unreferenced; at the moment exists to make sync_source_lists_from_cmake happy. source_set("standalone_sources") { configs -= [ "//llvm/utils/gn/build:llvm_code" ] configs -= [ "//llvm/utils/gn/build:no_rtti" ] @@ -72,3 +97,87 @@ "ubsan_type_hash_win.cpp", ] } + +static_library("ubsan_static") { + output_dir = crt_current_out_dir + if (current_os == "mac") { + output_name = "clang_rt.ubsan_osx" + } else { + output_name = "clang_rt.ubsan_standalone$crt_current_target_suffix" + } + complete_static_lib = true + configs -= [ + "//llvm/utils/gn/build:llvm_code", + "//llvm/utils/gn/build:thin_archive", + ] + configs += [ "//llvm/utils/gn/build:crt_code" ] + deps = [ + ":sources", + ":standalone_sources", + ] + if (current_os == "mac") { + deps += [ ":cxx_sources" ] + } +} + +if (current_os != "mac") { + static_library("ubsan_static_cxx") { + output_dir = crt_current_out_dir + output_name = "clang_rt.ubsan_standalone_cxx$crt_current_target_suffix" + complete_static_lib = true + configs -= [ + "//llvm/utils/gn/build:llvm_code", + "//llvm/utils/gn/build:thin_archive", + ] + configs += [ "//llvm/utils/gn/build:crt_code" ] + deps = [ ":cxx_sources" ] + } +} + +shared_library("ubsan_shared") { + output_dir = crt_current_out_dir + if (current_os == "mac") { + output_name = "clang_rt.ubsan_osx_dynamic" + } else { + output_name = "clang_rt.ubsan_standalone$crt_current_target_suffix" + } + configs -= [ "//llvm/utils/gn/build:llvm_code" ] + configs += [ "//llvm/utils/gn/build:crt_code" ] + if (current_os == "mac") { + ldflags = [ + "-lc++", + "-lc++abi", + + # ubsan + "-Wl,-U,___ubsan_default_options", + + # sanitizer_common + "-Wl,-U,___sanitizer_free_hook", + "-Wl,-U,___sanitizer_malloc_hook", + "-Wl,-U,___sanitizer_report_error_summary", + "-Wl,-U,___sanitizer_sandbox_on_notify", + "-Wl,-U,___sanitizer_symbolize_code", + "-Wl,-U,___sanitizer_symbolize_data", + "-Wl,-U,___sanitizer_symbolize_demangle", + "-Wl,-U,___sanitizer_symbolize_flush", + "-Wl,-U,___sanitizer_symbolize_set_demangle", + "-Wl,-U,___sanitizer_symbolize_set_inline_frames", + + # FIXME: better + "-Wl,-install_name,@rpath/libclang_rt.ubsan_osx_dynamic.dylib", + ] + # FIXME: -Wl,-rpath + # FIXME: codesign (??) + } + deps = [ + ":cxx_sources", + ":sources", + ":standalone_sources", + ":version_script", + ] + if (current_os != "mac") { + inputs = [ "$target_gen_dir/ubsan.vers" ] + ldflags = + [ "-Wl,--version-script," + rebase_path(inputs[0], root_build_dir) ] + } +}