From 56b038f887f37f69afac2d3abe02b46dcb9305ec Mon Sep 17 00:00:00 2001 From: Eduard Zingerman Date: Fri, 20 Jan 2023 15:11:00 -0800 Subject: [PATCH] [BPF][clang] Ignore stack protector options for BPF target Stack protector builtin functions are not implemented for BPF target, thus compiling programs with one of the following options would result in an error: -fstack-protector -fstack-protector-all -fstack-protector-strong This commit adds logic to ignore these options for BPF target. Searching through DiagnosticDriverKinds.td shows that all messages for such kind of behavior are implemented as warnings, this commit follows the suit. Here is an example of the diagnostic message: clang-16: warning: ignoring '-fstack-protector' option as it is not currently supported for target 'bpf' [-Woption-ignored] Differential Revision: https://reviews.llvm.org/D142046 --- clang/lib/Driver/ToolChains/Clang.cpp | 6 ++++++ clang/test/CodeGen/bpf-stack-protector.c | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 clang/test/CodeGen/bpf-stack-protector.c diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d4a0772..3d40e19 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3239,6 +3239,12 @@ static void RenderSSPOptions(const Driver &D, const ToolChain &TC, StackProtectorLevel = LangOptions::SSPStrong; else if (A->getOption().matches(options::OPT_fstack_protector_all)) StackProtectorLevel = LangOptions::SSPReq; + + if (EffectiveTriple.isBPF() && StackProtectorLevel != LangOptions::SSPOff) { + D.Diag(diag::warn_drv_unsupported_option_for_target) + << A->getSpelling() << EffectiveTriple.getTriple(); + StackProtectorLevel = DefaultStackProtectorLevel; + } } else { StackProtectorLevel = DefaultStackProtectorLevel; } diff --git a/clang/test/CodeGen/bpf-stack-protector.c b/clang/test/CodeGen/bpf-stack-protector.c new file mode 100644 index 0000000..a005bb9 --- /dev/null +++ b/clang/test/CodeGen/bpf-stack-protector.c @@ -0,0 +1,34 @@ +// REQUIRES: bpf-registered-target + +// RUN %clang -target bpf -S -emit-llvm -o - %s -fno-stack-protector 2>&1 \ +// RUN | FileCheck -check-prefix=OFF -check-prefix=COMMON %s + +// RUN: %clang -target bpf -S -emit-llvm -o - %s -fstack-protector 2>&1 \ +// RUN: | FileCheck -check-prefix=ON -check-prefix=COMMON %s + +// RUN: %clang -target bpf -S -emit-llvm -o - %s -fstack-protector-all 2>&1 \ +// RUN: | FileCheck -check-prefix=ALL -check-prefix=COMMON %s + +// RUN: %clang -target bpf -S -emit-llvm -o - %s -fstack-protector-strong 2>&1 \ +// RUN: | FileCheck -check-prefix=STRONG -check-prefix=COMMON %s + +typedef __SIZE_TYPE__ size_t; + +int printf(const char * _Format, ...); +size_t strlen(const char *s); +char *strcpy(char *s1, const char *s2); + +// OFF-NOT: warning +// ON: warning: ignoring '-fstack-protector' +// ALL: warning: ignoring '-fstack-protector-all' +// STRONG: warning: ignoring '-fstack-protector-strong' +// COMMON-SAME: option as it is not currently supported for target 'bpf' + +// COMMON: define {{.*}}void @test1(ptr noundef %msg) #[[A:.*]] { +void test1(const char *msg) { + char a[strlen(msg) + 1]; + strcpy(a, msg); + printf("%s\n", a); +} + +// COMMON-NOT: attributes #[[A]] = {{.*}} ssp -- 2.7.4