Am 01.07.2019 um 17:31 schrieb Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx>: > Do we still need clang | llc pipeline with new clang? Could the same > be achieved with single clang invocation? That would solve the problem > of not detecting pipeline failures. I’ve experimented with this a little, and found that new clang: - Does not understand -march, but -target is sufficient. - Understands -mcpu. - Understands -Xclang -target-feature -Xclang +foo as a replacement for -mattr=foo. However, there are two issues with that: - Don’t older clangs need to be supported? For example, right now alu32 progs are built conditionally. - It does not seem to be possible to build test_xdp.o without -target bpf. For now I'm attaching the new version of this patch, which introduces intermediate targets for LLVM bitcode and does not require bash. --- When compiling an eBPF prog fails, make still returns 0, because failing clang command's output is piped to llc and therefore its exit status is ignored. Create separate targets for clang and llc invocations, so that when clang fails, llc is not invoked at all, and make returns nonzero. Pull Kbuild.include for .SECONDARY target, which prevents make from deleting intermediate LLVM bitcode files. Adding .bc targets triggers the latent problem with depending on $(ALU32_BUILD_DIR): since directories are considered changed whenever a member is added or removed, now everything that depends on $(ALU32_BUILD_DIR) is always considered out-of-date. While removing $(ALU32_BUILD_DIR) target might be tempting, since most targets already depend on files inside it and therefore don't need it, it might create problems in the future, when such dependencies need to be removed. So, instead, add $(ALU32_BUILD_DIR) where needed as an order-only prerequisite. make provides this feature since version 3.80. Signed-off-by: Ilya Leoshkevich <iii@xxxxxxxxxxxxx> --- tools/testing/selftests/bpf/.gitignore | 1 + tools/testing/selftests/bpf/Makefile | 34 ++++++++++++++++---------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftests/bpf/.gitignore index a2f7f79c7908..4604a54e3ff2 100644 --- a/tools/testing/selftests/bpf/.gitignore +++ b/tools/testing/selftests/bpf/.gitignore @@ -42,3 +42,4 @@ xdping test_sockopt test_sockopt_sk test_sockopt_multi +*.bc diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index de1754a8f5fe..d60fee59fbd1 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -1,4 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 +include ../../../../scripts/Kbuild.include LIBDIR := ../../../lib BPFDIR := $(LIBDIR)/bpf @@ -179,12 +180,12 @@ TEST_CUSTOM_PROGS += $(ALU32_BUILD_DIR)/test_progs_32 $(ALU32_BUILD_DIR): mkdir -p $@ -$(ALU32_BUILD_DIR)/urandom_read: $(OUTPUT)/urandom_read +$(ALU32_BUILD_DIR)/urandom_read: $(OUTPUT)/urandom_read | $(ALU32_BUILD_DIR) cp $< $@ $(ALU32_BUILD_DIR)/test_progs_32: test_progs.c $(OUTPUT)/libbpf.a\ - $(ALU32_BUILD_DIR) \ - $(ALU32_BUILD_DIR)/urandom_read + $(ALU32_BUILD_DIR)/urandom_read \ + | $(ALU32_BUILD_DIR) $(CC) $(TEST_PROGS_CFLAGS) $(CFLAGS) \ -o $(ALU32_BUILD_DIR)/test_progs_32 \ test_progs.c test_stub.c trace_helpers.c prog_tests/*.c \ @@ -193,12 +194,15 @@ $(ALU32_BUILD_DIR)/test_progs_32: test_progs.c $(OUTPUT)/libbpf.a\ $(ALU32_BUILD_DIR)/test_progs_32: $(PROG_TESTS_H) $(ALU32_BUILD_DIR)/test_progs_32: prog_tests/*.c -$(ALU32_BUILD_DIR)/%.o: progs/%.c $(ALU32_BUILD_DIR) \ - $(ALU32_BUILD_DIR)/test_progs_32 +$(ALU32_BUILD_DIR)/%.bc: progs/%.c $(ALU32_BUILD_DIR)/test_progs_32 \ + | $(ALU32_BUILD_DIR) $(CLANG) $(CLANG_FLAGS) \ - -O2 -target bpf -emit-llvm -c $< -o - | \ + -O2 -target bpf -emit-llvm -c $< -o $@ + +$(ALU32_BUILD_DIR)/%.o: $(ALU32_BUILD_DIR)/%.bc \ + | $(ALU32_BUILD_DIR) $(LLC) -march=bpf -mattr=+alu32 -mcpu=$(CPU) $(LLC_FLAGS) \ - -filetype=obj -o $@ + -filetype=obj -o $@ $< ifeq ($(DWARF2BTF),y) $(BTF_PAHOLE) -J $@ endif @@ -206,18 +210,22 @@ endif # Have one program compiled without "-target bpf" to test whether libbpf loads # it successfully -$(OUTPUT)/test_xdp.o: progs/test_xdp.c +$(OUTPUT)/test_xdp.bc: progs/test_xdp.c $(CLANG) $(CLANG_FLAGS) \ - -O2 -emit-llvm -c $< -o - | \ - $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ + -O2 -emit-llvm -c $< -o $@ + +$(OUTPUT)/test_xdp.o: $(OUTPUT)/test_xdp.bc + $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ $< ifeq ($(DWARF2BTF),y) $(BTF_PAHOLE) -J $@ endif -$(OUTPUT)/%.o: progs/%.c +$(OUTPUT)/%.bc: progs/%.c $(CLANG) $(CLANG_FLAGS) \ - -O2 -target bpf -emit-llvm -c $< -o - | \ - $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ + -O2 -target bpf -emit-llvm -c $< -o $@ + +$(OUTPUT)/%.o: $(OUTPUT)/%.bc + $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ $< ifeq ($(DWARF2BTF),y) $(BTF_PAHOLE) -J $@ endif -- 2.21.0