Skip to content

Commit 703e446

Browse files
authored
[Clang] Add check for -mstack-alignment (#143124)
Currently the assertion in Alignment.h is triggered if a wrong value is passed -mstack-alignment option: ``` Assertion `(Value == 0 || llvm::isPowerOf2_64(Value)) && "Alignment is neither 0 nor a power of 2"' failed. ``` Added check in clang driver for the value of -mstack-alignment option, and emitted an error message when the wrong value was passed.
1 parent 2b8f82b commit 703e446

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6907,9 +6907,17 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
69076907
Args.addOptInFlag(CmdArgs, options::OPT_mstackrealign,
69086908
options::OPT_mno_stackrealign);
69096909

6910-
if (Args.hasArg(options::OPT_mstack_alignment)) {
6911-
StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
6912-
CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
6910+
if (const Arg *A = Args.getLastArg(options::OPT_mstack_alignment)) {
6911+
StringRef Value = A->getValue();
6912+
int64_t Alignment = 0;
6913+
if (Value.getAsInteger(10, Alignment) || Alignment < 0)
6914+
D.Diag(diag::err_drv_invalid_argument_to_option)
6915+
<< Value << A->getOption().getName();
6916+
else if (Alignment & (Alignment - 1))
6917+
D.Diag(diag::err_drv_alignment_not_power_of_two)
6918+
<< A->getAsString(Args) << Value;
6919+
else
6920+
CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + Value));
69136921
}
69146922

69156923
if (Args.hasArg(options::OPT_mstack_probe_size)) {

clang/test/Driver/stack-alignment.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// RUN: not %clang -### -mstack-alignment=-1 %s 2>&1 | FileCheck %s --check-prefix=CHECK_NEG_1
2+
// RUN: %clang -### -mstack-alignment=0 %s 2>&1 | FileCheck %s --check-prefix=CHECK_0
3+
// RUN: %clang -### -mstack-alignment=1 %s 2>&1 | FileCheck %s --check-prefix=CHECK_1
4+
// RUN: %clang -### -mstack-alignment=4 %s 2>&1 | FileCheck %s --check-prefix=CHECK_4
5+
// RUN: not %clang -### -mstack-alignment=5 %s 2>&1 | FileCheck %s --check-prefix=CHECK_5
6+
7+
// CHECK_NEG_1: error: invalid argument '-1' to -mstack-alignment=
8+
// CHECK_0: -mstack-alignment=0
9+
// CHECK_1: -mstack-alignment=1
10+
// CHECK_4: -mstack-alignment=4
11+
// CHECK_5: error: alignment is not a power of 2 in '-mstack-alignment=5'

0 commit comments

Comments
 (0)