Skip to content

Commit

Permalink
Revert "[MTE] Add -fsanitize=memtag* and friends."
Browse files Browse the repository at this point in the history
  • Loading branch information
AaronBallman committed Apr 8, 2022
1 parent c3d0205 commit 4aaf25b
Show file tree
Hide file tree
Showing 16 changed files with 33 additions and 150 deletions.
3 changes: 1 addition & 2 deletions clang/include/clang/Basic/DiagnosticDriverKinds.td
Expand Up @@ -483,8 +483,7 @@ def err_drv_ropi_incompatible_with_cxx : Error<
"ROPI is not compatible with c++">;

def err_stack_tagging_requires_hardware_feature : Error<
"'-fsanitize=memtag-stack' requires hardware support (+memtag). For Armv8 or "
"Armv9, try compiling with -march=armv8a+memtag or -march=armv9a+memtag">;
"'-fsanitize=memtag' requires hardware support (+memtag)">;

def err_cmse_pi_are_incompatible : Error<
"cmse is not compatible with %select{RWPI|ROPI}0">;
Expand Down
5 changes: 1 addition & 4 deletions clang/include/clang/Basic/Features.def
Expand Up @@ -45,10 +45,7 @@ FEATURE(leak_sanitizer,
FEATURE(hwaddress_sanitizer,
LangOpts.Sanitize.hasOneOf(SanitizerKind::HWAddress |
SanitizerKind::KernelHWAddress))
FEATURE(memtag_stack,
LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
FEATURE(memtag_heap,
LangOpts.Sanitize.has(SanitizerKind::MemtagHeap))
FEATURE(memtag_sanitizer, LangOpts.Sanitize.has(SanitizerKind::MemTag))
FEATURE(xray_instrument, LangOpts.XRayInstrument)
FEATURE(undefined_behavior_sanitizer,
LangOpts.Sanitize.hasOneOf(SanitizerKind::Undefined))
Expand Down
4 changes: 1 addition & 3 deletions clang/include/clang/Basic/Sanitizers.def
Expand Up @@ -56,9 +56,7 @@ SANITIZER("hwaddress", HWAddress)
SANITIZER("kernel-hwaddress", KernelHWAddress)

// A variant of AddressSanitizer using AArch64 MTE extension.
SANITIZER("memtag-stack", MemtagStack)
SANITIZER("memtag-heap", MemtagHeap)
SANITIZER_GROUP("memtag", MemTag, MemtagStack | MemtagHeap)
SANITIZER("memtag", MemTag)

// MemorySanitizer
SANITIZER("memory", Memory)
Expand Down
3 changes: 0 additions & 3 deletions clang/include/clang/Driver/Options.td
Expand Up @@ -1641,9 +1641,6 @@ def fsanitize_address_outline_instrumentation : Flag<["-"], "fsanitize-address-o
def fno_sanitize_address_outline_instrumentation : Flag<["-"], "fno-sanitize-address-outline-instrumentation">,
Group<f_clang_Group>,
HelpText<"Use default code inlining logic for the address sanitizer">;
def fsanitize_memtag_mode_EQ : Joined<["-"], "fsanitize-memtag-mode=">,
Group<f_clang_Group>,
HelpText<"Set default MTE mode to 'sync' (default) or 'async'">;
def fsanitize_hwaddress_experimental_aliasing
: Flag<["-"], "fsanitize-hwaddress-experimental-aliasing">,
Group<f_clang_Group>,
Expand Down
14 changes: 0 additions & 14 deletions clang/include/clang/Driver/SanitizerArgs.h
Expand Up @@ -64,8 +64,6 @@ class SanitizerArgs {
llvm::AsanDetectStackUseAfterReturnMode AsanUseAfterReturn =
llvm::AsanDetectStackUseAfterReturnMode::Invalid;

std::string MemtagMode;

public:
/// Parses the sanitizer arguments from an argument list.
SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
Expand Down Expand Up @@ -99,18 +97,6 @@ class SanitizerArgs {
bool needsStatsRt() const { return Stats; }
bool needsScudoRt() const { return Sanitizers.has(SanitizerKind::Scudo); }

bool hasMemTag() const { return hasMemtagHeap() || hasMemtagStack(); }
bool hasMemtagHeap() const {
return Sanitizers.has(SanitizerKind::MemtagHeap);
}
bool hasMemtagStack() const {
return Sanitizers.has(SanitizerKind::MemtagStack);
}
const std::string &getMemtagMode() const {
assert(!MemtagMode.empty());
return MemtagMode;
}

bool requiresPIE() const;
bool needsUnwindTables() const;
bool needsLTO() const;
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/CodeGen/CGDeclCXX.cpp
Expand Up @@ -458,8 +458,8 @@ llvm::Function *CodeGenModule::CreateGlobalInitOrCleanUpFunction(
!isInNoSanitizeList(SanitizerKind::KernelHWAddress, Fn, Loc))
Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);

if (getLangOpts().Sanitize.has(SanitizerKind::MemtagStack) &&
!isInNoSanitizeList(SanitizerKind::MemtagStack, Fn, Loc))
if (getLangOpts().Sanitize.has(SanitizerKind::MemTag) &&
!isInNoSanitizeList(SanitizerKind::MemTag, Fn, Loc))
Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);

if (getLangOpts().Sanitize.has(SanitizerKind::Thread) &&
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/CodeGenFunction.cpp
Expand Up @@ -780,7 +780,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
if (SanOpts.hasOneOf(SanitizerKind::HWAddress |
SanitizerKind::KernelHWAddress))
Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
if (SanOpts.has(SanitizerKind::MemtagStack))
if (SanOpts.has(SanitizerKind::MemTag))
Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
if (SanOpts.has(SanitizerKind::Thread))
Fn->addFnAttr(llvm::Attribute::SanitizeThread);
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/CodeGenModule.cpp
Expand Up @@ -735,7 +735,7 @@ void CodeGenModule::Release() {
LangOptions::SignReturnAddressScopeKind::None)
getModule().addModuleFlag(llvm::Module::Override,
"sign-return-address-buildattr", 1);
if (LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
if (LangOpts.Sanitize.has(SanitizerKind::MemTag))
getModule().addModuleFlag(llvm::Module::Override,
"tag-stack-memory-buildattr", 1);

Expand Down
20 changes: 4 additions & 16 deletions clang/lib/Driver/SanitizerArgs.cpp
Expand Up @@ -44,8 +44,8 @@ static const SanitizerMask NeedsUnwindTables =
static const SanitizerMask SupportsCoverage =
SanitizerKind::Address | SanitizerKind::HWAddress |
SanitizerKind::KernelAddress | SanitizerKind::KernelHWAddress |
SanitizerKind::MemtagStack | SanitizerKind::MemtagHeap |
SanitizerKind::Memory | SanitizerKind::KernelMemory | SanitizerKind::Leak |
SanitizerKind::MemTag | SanitizerKind::Memory |
SanitizerKind::KernelMemory | SanitizerKind::Leak |
SanitizerKind::Undefined | SanitizerKind::Integer | SanitizerKind::Bounds |
SanitizerKind::ImplicitConversion | SanitizerKind::Nullability |
SanitizerKind::DataFlow | SanitizerKind::Fuzzer |
Expand Down Expand Up @@ -73,7 +73,7 @@ static const SanitizerMask CFIClasses =
SanitizerKind::CFIUnrelatedCast;
static const SanitizerMask CompatibleWithMinimalRuntime =
TrappingSupported | SanitizerKind::Scudo | SanitizerKind::ShadowCallStack |
SanitizerKind::MemtagStack | SanitizerKind::MemtagHeap;
SanitizerKind::MemTag;

enum CoverageFeature {
CoverageFunc = 1 << 0,
Expand Down Expand Up @@ -651,17 +651,6 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
MsanParamRetval = false;
}

if (AllAddedKinds & SanitizerKind::MemTag) {
StringRef S =
Args.getLastArgValue(options::OPT_fsanitize_memtag_mode_EQ, "sync");
if (S == "async" || S == "sync") {
MemtagMode = S.str();
} else {
D.Diag(clang::diag::err_drv_invalid_value_with_suggestion)
<< "-fsanitize-memtag-mode=" << S << "{async, sync}";
}
}

if (AllAddedKinds & SanitizerKind::Thread) {
TsanMemoryAccess = Args.hasFlag(
options::OPT_fsanitize_thread_memory_access,
Expand Down Expand Up @@ -1242,8 +1231,7 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
<< "-fvisibility=";
}

if (Sanitizers.has(SanitizerKind::MemtagStack) &&
!hasTargetFeatureMTE(CmdArgs))
if (Sanitizers.has(SanitizerKind::MemTag) && !hasTargetFeatureMTE(CmdArgs))
TC.getDriver().Diag(diag::err_stack_tagging_requires_hardware_feature);
}

Expand Down
13 changes: 0 additions & 13 deletions clang/lib/Driver/ToolChains/CommonArgs.cpp
Expand Up @@ -1014,19 +1014,6 @@ bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
if (SanArgs.hasCrossDsoCfi() && !AddExportDynamic)
CmdArgs.push_back("--export-dynamic-symbol=__cfi_check");

if (SanArgs.hasMemTag()) {
if (!TC.getTriple().isAndroid()) {
TC.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
<< "-fsanitize=memtag*" << TC.getTriple().str();
}
CmdArgs.push_back(
Args.MakeArgString("--android-memtag-mode=" + SanArgs.getMemtagMode()));
if (SanArgs.hasMemtagHeap())
CmdArgs.push_back("--android-memtag-heap");
if (SanArgs.hasMemtagStack())
CmdArgs.push_back("--android-memtag-stack");
}

return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
}

Expand Down
25 changes: 7 additions & 18 deletions clang/test/CodeGen/memtag-attr.cpp
Expand Up @@ -4,27 +4,16 @@
// RUN: %clang_cc1 -triple aarch64-unknown-linux -disable-O0-optnone \
// RUN: -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-NO %s

// RUN: %clang_cc1 -triple aarch64-unknown-linux -fsanitize=memtag-stack \
// RUN: %clang_cc1 -triple aarch64-unknown-linux -fsanitize=memtag \
// RUN: -disable-O0-optnone -emit-llvm -o - %s | \
// RUN: FileCheck -check-prefix=CHECK-MEMTAG %s

// RUN: %clang --target=aarch64-unknown-linux -march=armv8a+memtag \
// RUN: -fsanitize=memtag -disable-O0-optnone -S -emit-llvm -o - %s | \
// RUN: FileCheck -check-prefix=CHECK-MEMTAG %s

extern "C" int HasSanitizeMemTag() { return 1; }
// CHECK-NO: Function Attrs
// CHECK-NO-NOT: sanitize_memtag
// CHECK-NO-NEXT: define {{.*}} @HasSanitizeMemTag(
// CHECK-MEMTAG: Function Attrs: {{.*}} sanitize_memtag
// CHECK-MEMTAG-NEXT: define {{.*}} @HasSanitizeMemTag(
int HasSanitizeMemTag() { return 1; }
// CHECK-NO: {{Function Attrs: mustprogress noinline nounwind$}}
// CHECK-MEMTAG: Function Attrs: mustprogress noinline nounwind sanitize_memtag

extern "C" __attribute__((no_sanitize("memtag"))) int NoSanitizeQuoteAddress() {
__attribute__((no_sanitize("memtag"))) int NoSanitizeQuoteAddress() {
return 0;
}
// CHECK-NO: Function Attrs
// CHECK-NO-NOT: sanitize_memtag
// CHECK-NO-NEXT: define {{.*}} @NoSanitizeQuoteAddress(
// CHECK-MEMTAG: Function Attrs
// CHECK-MEMTAG-NOT: sanitize_memtag
// CHECK-MEMTAG-NEXT: define {{.*}} @NoSanitizeQuoteAddress(
// CHECK-NO: {{Function Attrs: mustprogress noinline nounwind$}}
// CHECK-MEMTAG: {{Function Attrs: mustprogress noinline nounwind$}}
8 changes: 4 additions & 4 deletions clang/test/Driver/fsanitize.c
Expand Up @@ -195,13 +195,13 @@

// RUN: %clang -target aarch64-linux -fsanitize=memtag -march=armv8-a+memtag %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANMT-MT
// CHECK-SANMT-MT: "-target-feature" "+mte"
// CHECK-SANMT-MT-SAME: "-fsanitize=memtag-stack,memtag-heap"
// CHECK-SANMT-MT-SAME: "-fsanitize=memtag"

// RUN: %clang -target aarch64-linux -fsanitize=memtag %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANMT-NOMT-0
// CHECK-SANMT-NOMT-0: '-fsanitize=memtag-stack' requires hardware support (+memtag)
// CHECK-SANMT-NOMT-0: '-fsanitize=memtag' requires hardware support (+memtag)

// RUN: %clang -target aarch64-linux -fsanitize=memtag -I +mte %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANMT-NOMT-1
// CHECK-SANMT-NOMT-1: '-fsanitize=memtag-stack' requires hardware support (+memtag)
// CHECK-SANMT-NOMT-1: '-fsanitize=memtag' requires hardware support (+memtag)

// 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
// 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
Expand Down Expand Up @@ -801,7 +801,7 @@
// CHECK-INTSAN-MINIMAL: "-fsanitize-minimal-runtime"

// RUN: %clang -target aarch64-linux-android -march=armv8-a+memtag -fsanitize=memtag -fsanitize-minimal-runtime %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MEMTAG-MINIMAL
// CHECK-MEMTAG-MINIMAL: "-fsanitize=memtag-stack,memtag-heap"
// CHECK-MEMTAG-MINIMAL: "-fsanitize=memtag"
// CHECK-MEMTAG-MINIMAL: "-fsanitize-minimal-runtime"

// RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined -fsanitize=function -fsanitize-minimal-runtime %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UBSAN-FUNCTION-MINIMAL
Expand Down
46 changes: 0 additions & 46 deletions clang/test/Driver/memtag-ld.c

This file was deleted.

File renamed without changes.
23 changes: 0 additions & 23 deletions clang/test/Lexer/has_feature_memtag.cpp

This file was deleted.

11 changes: 11 additions & 0 deletions clang/test/Lexer/has_feature_memtag_sanitizer.cpp
@@ -0,0 +1,11 @@
// RUN: %clang_cc1 -E -fsanitize=memtag %s -o - | FileCheck --check-prefix=CHECK-MEMTAG %s
// RUN: %clang_cc1 -E %s -o - | FileCheck --check-prefix=CHECK-NO-MEMTAG %s

#if __has_feature(memtag_sanitizer)
int MemTagSanitizerEnabled();
#else
int MemTagSanitizerDisabled();
#endif

// CHECK-MEMTAG: MemTagSanitizerEnabled
// CHECK-NO-MEMTAG: MemTagSanitizerDisabled

0 comments on commit 4aaf25b

Please sign in to comment.