From 5de63703c234d3c4c41625dfef49eb29eebb6bbb Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Wed, 2 Jan 2019 18:13:14 +0000 Subject: [PATCH] [gn build] Add fuzzers in llvm/tools that are needed for check-llvm Also add a fuzzer() template for defining fuzzers that's similar to add_llvm_fuzzer in the CMake build, and a build file for dependency llvm/lib/FuzzMutate. Also make `assert(defined(...` error strings a bit more self-consistent. Differential Revision: https://reviews.llvm.org/D56194 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350238 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/gn/build/fuzzer.gni | 49 +++++++++++++++++++ utils/gn/secondary/BUILD.gn | 2 + .../llvm/include/llvm/Config/BUILD.gn | 4 +- .../gn/secondary/llvm/lib/FuzzMutate/BUILD.gn | 19 +++++++ .../llvm/tools/llvm-isel-fuzzer/BUILD.gn | 24 +++++++++ .../llvm/tools/llvm-opt-fuzzer/BUILD.gn | 31 ++++++++++++ .../llvm/utils/TableGen/tablegen.gni | 2 +- 7 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 utils/gn/build/fuzzer.gni create mode 100644 utils/gn/secondary/llvm/lib/FuzzMutate/BUILD.gn create mode 100644 utils/gn/secondary/llvm/tools/llvm-isel-fuzzer/BUILD.gn create mode 100644 utils/gn/secondary/llvm/tools/llvm-opt-fuzzer/BUILD.gn diff --git a/utils/gn/build/fuzzer.gni b/utils/gn/build/fuzzer.gni new file mode 100644 index 00000000000..b5aaf9425a4 --- /dev/null +++ b/utils/gn/build/fuzzer.gni @@ -0,0 +1,49 @@ +# This file introduces a templates for defining fuzzers. +# +# All parameters valid for executable() targets are valid (cflags, defines, +# deps, include_dirs, sources, ...). In addition to that: +# +# dummy_main (required) +# Path to a cpp file containing main(), used when neither +# llvm_use_sanitize_coverage nor llvm_use_sanitize_coverage are set. +# +# Example of usage: +# +# fuzzer("llvm-opt-fuzzer") { +# deps = [ ... ] +# dummy_main = "DummyOptFuzzer.cpp" +# sources = [ "llvm-opt-fuzzer.cpp" ] +# } + +declare_args() { + # Set to the path of a static library containing a fuzzing engine, e.g. + # oss-fuzz's $LIB_FUZZING_ENGINE. + llvm_lib_fuzzing_engine = "" + + # If true, pass -fsanitize=fuzzer to the compiler for fuzzer() targets. + # Likely only makes sense to set if you know that the host compiler is clang. + llvm_use_sanitize_coverage = false +} + +template("fuzzer") { + assert(defined(invoker.dummy_main), "must set 'dummy_main' in $target_name") + assert(defined(invoker.sources), "must set 'sources' for $target_name") + executable(target_name) { + forward_variables_from(invoker, "*", [ "dummy_main" ]) + if (llvm_lib_fuzzing_engine != "") { + if (!defined(libs)) { + libs = [] + } + libs += [ llvm_lib_fuzzing_engine ] + not_needed(invoker, [ "dummy_main" ]) + } else if (llvm_use_sanitize_coverage) { + if (!defined(cflags)) { + cflags = [] + } + cflags += [ "-fsanitize=fuzzer" ] + not_needed(invoker, [ "dummy_main" ]) + } else { + sources += [ invoker.dummy_main ] + } + } +} diff --git a/utils/gn/secondary/BUILD.gn b/utils/gn/secondary/BUILD.gn index 369e03fec2b..f31851386ed 100644 --- a/utils/gn/secondary/BUILD.gn +++ b/utils/gn/secondary/BUILD.gn @@ -20,9 +20,11 @@ group("default") { "//llvm/tools/llvm-dwp", "//llvm/tools/llvm-exegesis", "//llvm/tools/llvm-extract", + "//llvm/tools/llvm-isel-fuzzer", "//llvm/tools/llvm-link", "//llvm/tools/llvm-mca", "//llvm/tools/llvm-mt", + "//llvm/tools/llvm-opt-fuzzer", "//llvm/tools/llvm-opt-report", "//llvm/tools/llvm-rc", "//llvm/tools/llvm-rtdyld", diff --git a/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn b/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn index 08924e36dab..38ec86d82f3 100644 --- a/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn +++ b/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn @@ -370,8 +370,8 @@ action("llvm-config") { # .def files used by llvm/lib/Target template("write_target_def_file") { - assert(defined(invoker.key), "callers must set key") - assert(defined(invoker.value), "callers must set value") + assert(defined(invoker.key), "must set 'key' in $target_name") + assert(defined(invoker.value), "must set 'value' in $target_name") action(target_name) { visibility = [ ":write_target_def_files" ] diff --git a/utils/gn/secondary/llvm/lib/FuzzMutate/BUILD.gn b/utils/gn/secondary/llvm/lib/FuzzMutate/BUILD.gn new file mode 100644 index 00000000000..57a6b5702e8 --- /dev/null +++ b/utils/gn/secondary/llvm/lib/FuzzMutate/BUILD.gn @@ -0,0 +1,19 @@ +static_library("FuzzMutate") { + output_name = "LLVMFuzzMutate" + deps = [ + "//llvm/lib/Analysis", + "//llvm/lib/Bitcode/Reader", + "//llvm/lib/Bitcode/Writer", + "//llvm/lib/IR", + "//llvm/lib/Support", + "//llvm/lib/Target", + "//llvm/lib/Transforms/Scalar", + ] + sources = [ + "FuzzerCLI.cpp", + "IRMutator.cpp", + "OpDescriptor.cpp", + "Operations.cpp", + "RandomIRBuilder.cpp", + ] +} diff --git a/utils/gn/secondary/llvm/tools/llvm-isel-fuzzer/BUILD.gn b/utils/gn/secondary/llvm/tools/llvm-isel-fuzzer/BUILD.gn new file mode 100644 index 00000000000..d9ef7fcc315 --- /dev/null +++ b/utils/gn/secondary/llvm/tools/llvm-isel-fuzzer/BUILD.gn @@ -0,0 +1,24 @@ +import("//llvm/utils/gn/build/fuzzer.gni") + +fuzzer("llvm-isel-fuzzer") { + deps = [ + "//llvm/lib/Analysis", + "//llvm/lib/Bitcode/Reader", + "//llvm/lib/Bitcode/Writer", + "//llvm/lib/CodeGen", + "//llvm/lib/CodeGen/AsmPrinter", + "//llvm/lib/CodeGen/SelectionDAG", + "//llvm/lib/FuzzMutate", + "//llvm/lib/IR", + "//llvm/lib/IRReader", + "//llvm/lib/MC", + "//llvm/lib/Support", + "//llvm/lib/Target", + "//llvm/lib/Target:TargetsToBuild", + "//llvm/lib/Transforms/Scalar", + ] + dummy_main = "DummyISelFuzzer.cpp" + sources = [ + "llvm-isel-fuzzer.cpp", + ] +} diff --git a/utils/gn/secondary/llvm/tools/llvm-opt-fuzzer/BUILD.gn b/utils/gn/secondary/llvm/tools/llvm-opt-fuzzer/BUILD.gn new file mode 100644 index 00000000000..cb95dda81e8 --- /dev/null +++ b/utils/gn/secondary/llvm/tools/llvm-opt-fuzzer/BUILD.gn @@ -0,0 +1,31 @@ +import("//llvm/utils/gn/build/fuzzer.gni") + +fuzzer("llvm-opt-fuzzer") { + deps = [ + "//llvm/lib/Analysis", + "//llvm/lib/Bitcode/Reader", + "//llvm/lib/Bitcode/Writer", + "//llvm/lib/CodeGen", + "//llvm/lib/FuzzMutate", + "//llvm/lib/IR", + "//llvm/lib/IRReader", + "//llvm/lib/MC", + "//llvm/lib/Passes", + "//llvm/lib/Support", + "//llvm/lib/Target", + "//llvm/lib/Target:TargetsToBuild", + "//llvm/lib/Transforms/AggressiveInstCombine", + "//llvm/lib/Transforms/Coroutines", + "//llvm/lib/Transforms/IPO", + "//llvm/lib/Transforms/InstCombine", + "//llvm/lib/Transforms/Instrumentation", + "//llvm/lib/Transforms/ObjCARC", + "//llvm/lib/Transforms/Scalar", + "//llvm/lib/Transforms/Utils", + "//llvm/lib/Transforms/Vectorize", + ] + dummy_main = "DummyOptFuzzer.cpp" + sources = [ + "llvm-opt-fuzzer.cpp", + ] +} diff --git a/utils/gn/secondary/llvm/utils/TableGen/tablegen.gni b/utils/gn/secondary/llvm/utils/TableGen/tablegen.gni index 37629235982..d98ed6b376e 100644 --- a/utils/gn/secondary/llvm/utils/TableGen/tablegen.gni +++ b/utils/gn/secondary/llvm/utils/TableGen/tablegen.gni @@ -25,7 +25,7 @@ # } template("tablegen") { - assert(defined(invoker.args), "args must be defined for $target_name") + assert(defined(invoker.args), "must set 'args' in $target_name") config_name = "${target_name}_config" config(config_name) { -- 2.50.1