https://github.com/momchil-velikov updated https://github.com/llvm/llvm-project/pull/68993
>From 553f647e3f8460e376b8a09233b23a0bd6b12ead Mon Sep 17 00:00:00 2001 From: Momchil Velikov <momchil.veli...@arm.com> Date: Wed, 11 Oct 2023 17:22:51 +0100 Subject: [PATCH 1/2] [clang][AArch64] Pass down stack clash protection options to LLVM/Backend --- clang/lib/CodeGen/CodeGenModule.cpp | 12 +++++++++++- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- clang/test/CodeGen/stack-clash-protection.c | 16 ++++++++++++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 7cdf50a281cd278..f4416f298b71188 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1085,6 +1085,16 @@ void CodeGenModule::Release() { "sign-return-address-with-bkey", 1); } + if (Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be) { + auto *InlineAsm = llvm::MDString::get(TheModule.getContext(), "inline-asm"); + if (CodeGenOpts.StackClashProtector) + getModule().addModuleFlag(llvm::Module::Override, "probe-stack", + InlineAsm); + if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096) + getModule().addModuleFlag(llvm::Module::Min, "stack-probe-size", + CodeGenOpts.StackProbeSize); + } + if (!CodeGenOpts.MemoryProfileOutput.empty()) { llvm::LLVMContext &Ctx = TheModule.getContext(); getModule().addModuleFlag( @@ -2296,7 +2306,7 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, if ((!D || !D->hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables) B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables)); - if (CodeGenOpts.StackClashProtector) + if (CodeGenOpts.StackClashProtector && !getTarget().getTriple().isAArch64()) B.addAttribute("probe-stack", "inline-asm"); if (!hasUnwindExceptions(LangOpts)) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 6dec117aed1056b..5da573a6e13b2c8 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3507,7 +3507,7 @@ static void RenderSCPOptions(const ToolChain &TC, const ArgList &Args, return; if (!EffectiveTriple.isX86() && !EffectiveTriple.isSystemZ() && - !EffectiveTriple.isPPC64()) + !EffectiveTriple.isPPC64() && !EffectiveTriple.isAArch64()) return; Args.addOptInFlag(CmdArgs, options::OPT_fstack_clash_protection, diff --git a/clang/test/CodeGen/stack-clash-protection.c b/clang/test/CodeGen/stack-clash-protection.c index 67571f5cdb2c14c..2f502ef453d42f4 100644 --- a/clang/test/CodeGen/stack-clash-protection.c +++ b/clang/test/CodeGen/stack-clash-protection.c @@ -1,10 +1,12 @@ // Check the correct function attributes are generated -// RUN: %clang_cc1 -triple x86_64-linux -O0 -S -emit-llvm -o- %s -fstack-clash-protection | FileCheck %s -// RUN: %clang_cc1 -triple s390x-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection | FileCheck %s -// RUN: %clang_cc1 -triple powerpc64le-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection | FileCheck %s -// RUN: %clang_cc1 -triple powerpc64-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-linux -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s +// RUN: %clang_cc1 -triple s390x-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s +// RUN: %clang_cc1 -triple powerpc64le-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s +// RUN: %clang_cc1 -triple powerpc64-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s +// RUN: %clang_cc1 -triple aarch64-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s --check-prefixes CHECK-AARCH64 // CHECK: define{{.*}} void @large_stack() #[[A:.*]] { +// CHECK-AARCH64: define{{.*}} void @large_stack() #[[A:.*]] { void large_stack(void) { volatile int stack[20000], i; for (i = 0; i < sizeof(stack) / sizeof(int); ++i) @@ -12,14 +14,20 @@ void large_stack(void) { } // CHECK: define{{.*}} void @vla({{.*}}) #[[A:.*]] { +// CHECK-AARCH64: define{{.*}} void @vla({{.*}}) #[[A:.*]] { void vla(int n) { volatile int vla[n]; __builtin_memset(&vla[0], 0, 1); } // CHECK: define{{.*}} void @builtin_alloca({{.*}}) #[[A:.*]] { +// CHECK-AARCH64: define{{.*}} void @builtin_alloca({{.*}}) #[[A:.*]] { void builtin_alloca(int n) { volatile void *mem = __builtin_alloca(n); } // CHECK: attributes #[[A]] = {{.*}} "probe-stack"="inline-asm" +// CHECK-AARCH64-NOT: attributes #[[A]] = {{.*}} "probe-stack" + +// CHECK-AARCH64: !{i32 4, !"probe-stack", !"inline-asm"} +// CHECK-AARCH64: !{i32 8, !"stack-probe-size", i32 8192} >From f303bb6062d7449b737833eb24e44f219fc0b387 Mon Sep 17 00:00:00 2001 From: Momchil Velikov <momchil.veli...@arm.com> Date: Thu, 23 Nov 2023 12:03:45 +0000 Subject: [PATCH 2/2] [fixup] Emit both module and function attributes for stack clash protection --- clang/lib/CodeGen/CodeGenModule.cpp | 23 ++++++++++++--------- clang/test/CodeGen/stack-clash-protection.c | 16 ++++++-------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index f4416f298b71188..13a94a6f7edb115 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1085,15 +1085,14 @@ void CodeGenModule::Release() { "sign-return-address-with-bkey", 1); } - if (Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be) { - auto *InlineAsm = llvm::MDString::get(TheModule.getContext(), "inline-asm"); - if (CodeGenOpts.StackClashProtector) - getModule().addModuleFlag(llvm::Module::Override, "probe-stack", - InlineAsm); - if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096) - getModule().addModuleFlag(llvm::Module::Min, "stack-probe-size", - CodeGenOpts.StackProbeSize); - } + if (CodeGenOpts.StackClashProtector) + getModule().addModuleFlag( + llvm::Module::Override, "probe-stack", + llvm::MDString::get(TheModule.getContext(), "inline-asm")); + + if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096) + getModule().addModuleFlag(llvm::Module::Min, "stack-probe-size", + CodeGenOpts.StackProbeSize); if (!CodeGenOpts.MemoryProfileOutput.empty()) { llvm::LLVMContext &Ctx = TheModule.getContext(); @@ -2306,9 +2305,13 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, if ((!D || !D->hasAttr<NoUwtableAttr>()) && CodeGenOpts.UnwindTables) B.addUWTableAttr(llvm::UWTableKind(CodeGenOpts.UnwindTables)); - if (CodeGenOpts.StackClashProtector && !getTarget().getTriple().isAArch64()) + if (CodeGenOpts.StackClashProtector) B.addAttribute("probe-stack", "inline-asm"); + if (CodeGenOpts.StackProbeSize && CodeGenOpts.StackProbeSize != 4096) + B.addAttribute("stack-probe-size", + std::to_string(CodeGenOpts.StackProbeSize)); + if (!hasUnwindExceptions(LangOpts)) B.addAttribute(llvm::Attribute::NoUnwind); diff --git a/clang/test/CodeGen/stack-clash-protection.c b/clang/test/CodeGen/stack-clash-protection.c index 2f502ef453d42f4..dab9ee768c28745 100644 --- a/clang/test/CodeGen/stack-clash-protection.c +++ b/clang/test/CodeGen/stack-clash-protection.c @@ -3,31 +3,27 @@ // RUN: %clang_cc1 -triple s390x-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s // RUN: %clang_cc1 -triple powerpc64le-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s // RUN: %clang_cc1 -triple powerpc64-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s -// RUN: %clang_cc1 -triple aarch64-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s --check-prefixes CHECK-AARCH64 +// RUN: %clang_cc1 -triple aarch64-linux-gnu -O0 -S -emit-llvm -o- %s -fstack-clash-protection -mstack-probe-size=8192 | FileCheck %s // CHECK: define{{.*}} void @large_stack() #[[A:.*]] { -// CHECK-AARCH64: define{{.*}} void @large_stack() #[[A:.*]] { void large_stack(void) { volatile int stack[20000], i; for (i = 0; i < sizeof(stack) / sizeof(int); ++i) stack[i] = i; } -// CHECK: define{{.*}} void @vla({{.*}}) #[[A:.*]] { -// CHECK-AARCH64: define{{.*}} void @vla({{.*}}) #[[A:.*]] { +// CHECK: define{{.*}} void @vla({{.*}}) #[[A]] { void vla(int n) { volatile int vla[n]; __builtin_memset(&vla[0], 0, 1); } -// CHECK: define{{.*}} void @builtin_alloca({{.*}}) #[[A:.*]] { -// CHECK-AARCH64: define{{.*}} void @builtin_alloca({{.*}}) #[[A:.*]] { +// CHECK: define{{.*}} void @builtin_alloca({{.*}}) #[[A]] { void builtin_alloca(int n) { volatile void *mem = __builtin_alloca(n); } -// CHECK: attributes #[[A]] = {{.*}} "probe-stack"="inline-asm" -// CHECK-AARCH64-NOT: attributes #[[A]] = {{.*}} "probe-stack" +// CHECK: attributes #[[A]] = {{.*}}"probe-stack"="inline-asm" {{.*}}"stack-probe-size"="8192" -// CHECK-AARCH64: !{i32 4, !"probe-stack", !"inline-asm"} -// CHECK-AARCH64: !{i32 8, !"stack-probe-size", i32 8192} +// CHECK: !{i32 4, !"probe-stack", !"inline-asm"} +// CHECK: !{i32 8, !"stack-probe-size", i32 8192} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits