Skip to content

Commit 5b25674

Browse files
[AArch64] Make the memtag sanitizer require the memtag extension
... or otherwise we get an ICE. Differential Revision: https://reviews.llvm.org/D65508 llvm-svn: 368696
1 parent a23b250 commit 5b25674

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

clang/include/clang/Basic/DiagnosticDriverKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,9 @@ def err_drv_ropi_rwpi_incompatible_with_pic : Error<
368368
def err_drv_ropi_incompatible_with_cxx : Error<
369369
"ROPI is not compatible with c++">;
370370

371+
def err_stack_tagging_requires_hardware_feature : Error<
372+
"'-fsanitize=memtag' requires hardware support (+memtag)">;
373+
371374
def warn_target_unsupported_nan2008 : Warning<
372375
"ignoring '-mnan=2008' option because the '%0' architecture does not support it">,
373376
InGroup<UnsupportedNan>;

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,18 @@ static void addIncludeLinkerOption(const ToolChain &TC,
873873
CmdArgs.push_back(Args.MakeArgString(LinkerOptionFlag));
874874
}
875875

876+
static bool hasTargetFeatureMTE(const llvm::opt::ArgStringList &CmdArgs) {
877+
for (auto Start = CmdArgs.begin(), End = CmdArgs.end(); Start != End; ++Start) {
878+
auto It = std::find(Start, End, StringRef("+mte"));
879+
if (It == End)
880+
break;
881+
if (It > Start && *std::prev(It) == StringRef("-target-feature"))
882+
return true;
883+
Start = It;
884+
}
885+
return false;
886+
}
887+
876888
void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
877889
llvm::opt::ArgStringList &CmdArgs,
878890
types::ID InputType) const {
@@ -1043,6 +1055,9 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
10431055
Sanitizers.Mask & CFIClasses)
10441056
<< "-fvisibility=";
10451057
}
1058+
1059+
if (Sanitizers.has(SanitizerKind::MemTag) && !hasTargetFeatureMTE(CmdArgs))
1060+
TC.getDriver().Diag(diag::err_stack_tagging_requires_hardware_feature);
10461061
}
10471062

10481063
SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A,

clang/test/Driver/fsanitize.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,16 @@
191191
// RUN: %clang -target x86_64-linux-android -fsanitize=memtag -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANMT-BAD-ARCH
192192
// CHECK-SANMT-BAD-ARCH: unsupported option '-fsanitize=memtag' for target
193193

194+
// RUN: %clang -target aarch64-linux -fsanitize=memtag -march=armv8-a+memtag %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANMT-MT
195+
// CHECK-SANMT-MT: "-target-feature" "+mte"
196+
// CHECK-SANMT-MT-SAME: "-fsanitize=memtag"
197+
198+
// RUN: %clang -target aarch64-linux -fsanitize=memtag %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANMT-NOMT-0
199+
// CHECK-SANMT-NOMT-0: '-fsanitize=memtag' requires hardware support (+memtag)
200+
201+
// RUN: %clang -target aarch64-linux -fsanitize=memtag -I +mte %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANMT-NOMT-1
202+
// CHECK-SANMT-NOMT-1: '-fsanitize=memtag' requires hardware support (+memtag)
203+
194204
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-use-after-scope %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-USE-AFTER-SCOPE
195205
// RUN: %clang_cl --target=x86_64-windows -fsanitize=address -fsanitize-address-use-after-scope -### -- %s 2>&1 | FileCheck %s --check-prefix=CHECK-USE-AFTER-SCOPE
196206
// CHECK-USE-AFTER-SCOPE: -cc1{{.*}}-fsanitize-address-use-after-scope

0 commit comments

Comments
 (0)