forked from OSchip/llvm-project
[asan][clang] Add flag to outline instrumentation
Summary This option can be used to reduce the size of the binary. The trade-off in this case would be the run-time performance. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D105726
This commit is contained in:
parent
de448c0a9e
commit
ac500fd18f
|
@ -276,6 +276,18 @@ library name in the symbolized stack trace of the leak report. See
|
||||||
<https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer#suppressions>`_
|
<https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer#suppressions>`_
|
||||||
for more details.
|
for more details.
|
||||||
|
|
||||||
|
Code generation control
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Instrumentation code outlining
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
By default AddressSanitizer inlines the instumentation code to improve the
|
||||||
|
run-time performance, which leads to increased binary size. Using the
|
||||||
|
(clang flag ``-fsanitize-address-outline-instrumentation` default: ``false``)
|
||||||
|
flag forces all code instumentation to be outlined, which reduces the size
|
||||||
|
of the binary, but also reduces the run-time performace.
|
||||||
|
|
||||||
Limitations
|
Limitations
|
||||||
===========
|
===========
|
||||||
|
|
||||||
|
|
|
@ -1649,6 +1649,14 @@ are listed below.
|
||||||
Enable simple code coverage in addition to certain sanitizers.
|
Enable simple code coverage in addition to certain sanitizers.
|
||||||
See :doc:`SanitizerCoverage` for more details.
|
See :doc:`SanitizerCoverage` for more details.
|
||||||
|
|
||||||
|
**-f[no-]sanitize-address-outline-instrumentation**
|
||||||
|
|
||||||
|
Controls how address sanitizer code is generated. If enabled will always use
|
||||||
|
a function call instead of inlining the code. Turning this option on could
|
||||||
|
reduce the binary size, but might result in a worse run-time performance.
|
||||||
|
|
||||||
|
See :doc: `AddressSanitizer` for more details.
|
||||||
|
|
||||||
**-f[no-]sanitize-stats**
|
**-f[no-]sanitize-stats**
|
||||||
|
|
||||||
Enable simple statistics gathering for the enabled sanitizers.
|
Enable simple statistics gathering for the enabled sanitizers.
|
||||||
|
|
|
@ -1558,6 +1558,12 @@ def fno_sanitize_memory_track_origins : Flag<["-"], "fno-sanitize-memory-track-o
|
||||||
Group<f_clang_Group>,
|
Group<f_clang_Group>,
|
||||||
Flags<[CoreOption, NoXarchOption]>,
|
Flags<[CoreOption, NoXarchOption]>,
|
||||||
HelpText<"Disable origins tracking in MemorySanitizer">;
|
HelpText<"Disable origins tracking in MemorySanitizer">;
|
||||||
|
def fsanitize_address_outline_instrumentation : Flag<["-"], "fsanitize-address-outline-instrumentation">,
|
||||||
|
Group<f_clang_Group>,
|
||||||
|
HelpText<"Always generate function calls for address sanitizer instrumentation">;
|
||||||
|
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_hwaddress_experimental_aliasing
|
def fsanitize_hwaddress_experimental_aliasing
|
||||||
: Flag<["-"], "fsanitize-hwaddress-experimental-aliasing">,
|
: Flag<["-"], "fsanitize-hwaddress-experimental-aliasing">,
|
||||||
Group<f_clang_Group>,
|
Group<f_clang_Group>,
|
||||||
|
|
|
@ -44,6 +44,7 @@ class SanitizerArgs {
|
||||||
bool AsanUseOdrIndicator = false;
|
bool AsanUseOdrIndicator = false;
|
||||||
bool AsanInvalidPointerCmp = false;
|
bool AsanInvalidPointerCmp = false;
|
||||||
bool AsanInvalidPointerSub = false;
|
bool AsanInvalidPointerSub = false;
|
||||||
|
bool AsanOutlineInstrumentation = false;
|
||||||
llvm::AsanDtorKind AsanDtorKind = llvm::AsanDtorKind::Invalid;
|
llvm::AsanDtorKind AsanDtorKind = llvm::AsanDtorKind::Invalid;
|
||||||
std::string HwasanAbi;
|
std::string HwasanAbi;
|
||||||
bool LinkRuntimes = true;
|
bool LinkRuntimes = true;
|
||||||
|
|
|
@ -805,6 +805,11 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
|
||||||
options::OPT_fno_sanitize_address_poison_custom_array_cookie,
|
options::OPT_fno_sanitize_address_poison_custom_array_cookie,
|
||||||
AsanPoisonCustomArrayCookie);
|
AsanPoisonCustomArrayCookie);
|
||||||
|
|
||||||
|
AsanOutlineInstrumentation =
|
||||||
|
Args.hasFlag(options::OPT_fsanitize_address_outline_instrumentation,
|
||||||
|
options::OPT_fno_sanitize_address_outline_instrumentation,
|
||||||
|
AsanOutlineInstrumentation);
|
||||||
|
|
||||||
// As a workaround for a bug in gold 2.26 and earlier, dead stripping of
|
// As a workaround for a bug in gold 2.26 and earlier, dead stripping of
|
||||||
// globals in ASan is disabled by default on ELF targets.
|
// globals in ASan is disabled by default on ELF targets.
|
||||||
// See https://sourceware.org/bugzilla/show_bug.cgi?id=19002
|
// See https://sourceware.org/bugzilla/show_bug.cgi?id=19002
|
||||||
|
@ -1118,6 +1123,11 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
|
||||||
CmdArgs.push_back("-asan-detect-invalid-pointer-sub");
|
CmdArgs.push_back("-asan-detect-invalid-pointer-sub");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (AsanOutlineInstrumentation) {
|
||||||
|
CmdArgs.push_back("-mllvm");
|
||||||
|
CmdArgs.push_back("-asan-instrumentation-with-call-threshold=0");
|
||||||
|
}
|
||||||
|
|
||||||
// Only pass the option to the frontend if the user requested,
|
// Only pass the option to the frontend if the user requested,
|
||||||
// otherwise the frontend will just use the codegen default.
|
// otherwise the frontend will just use the codegen default.
|
||||||
if (AsanDtorKind != llvm::AsanDtorKind::Invalid) {
|
if (AsanDtorKind != llvm::AsanDtorKind::Invalid) {
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
// RUN: %clang -S -fsanitize=address -emit-llvm -o - -fsanitize=address %s \
|
||||||
|
// RUN: | FileCheck %s --check-prefixes=CHECK-NO-OUTLINE
|
||||||
|
// RUN: %clang -S -fsanitize=address -emit-llvm -o - -fsanitize=address %s \
|
||||||
|
// RUN: -fsanitize-address-outline-instrumentation \
|
||||||
|
// RUN: | FileCheck %s --check-prefixes=CHECK-OUTLINE
|
||||||
|
|
||||||
|
// CHECK-NO-OUTLINE-NOT: call{{.*}}@__asan_load4
|
||||||
|
// CHECK-OUTLINE: call{{.*}}@__asan_load4
|
||||||
|
|
||||||
|
int deref(int *p) {
|
||||||
|
return *p;
|
||||||
|
}
|
|
@ -247,6 +247,20 @@
|
||||||
// CHECK-ASAN-GLOBALS: -cc1{{.*}}-fsanitize-address-globals-dead-stripping
|
// CHECK-ASAN-GLOBALS: -cc1{{.*}}-fsanitize-address-globals-dead-stripping
|
||||||
// CHECK-NO-ASAN-GLOBALS-NOT: -cc1{{.*}}-fsanitize-address-globals-dead-stripping
|
// CHECK-NO-ASAN-GLOBALS-NOT: -cc1{{.*}}-fsanitize-address-globals-dead-stripping
|
||||||
|
|
||||||
|
// RUN: %clang -target x86_64-linux-gnu -fsanitize-address-outline-instrumentation %s -### 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=CHECK-ASAN-OUTLINE-WARN
|
||||||
|
// CHECK-ASAN-OUTLINE-WARN: warning: argument unused during compilation: '-fsanitize-address-outline-instrumentation'
|
||||||
|
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-outline-instrumentation %s -### 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=CHECK-ASAN-OUTLINE-OK
|
||||||
|
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fno-sanitize-address-outline-instrumentation -fsanitize-address-outline-instrumentation %s -### 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=CHECK-ASAN-OUTLINE-OK
|
||||||
|
// CHECK-ASAN-OUTLINE-OK: "-mllvm" "-asan-instrumentation-with-call-threshold=0"
|
||||||
|
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fno-sanitize-address-outline-instrumentation %s -### 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=CHECK-NO-CHECK-ASAN-CALLBACK
|
||||||
|
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-outline-instrumentation -fno-sanitize-address-outline-instrumentation %s -### 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=CHECK-NO-CHECK-ASAN-CALLBACK
|
||||||
|
// CHECK-NO-CHECK-ASAN-CALLBACK-NOT: "-mllvm" "-asan-instrumentation-with-call-threshold=0"
|
||||||
|
|
||||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-use-odr-indicator %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-ODR-INDICATOR
|
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-use-odr-indicator %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-ODR-INDICATOR
|
||||||
// RUN: %clang_cl --target=x86_64-windows -fsanitize=address -fsanitize-address-use-odr-indicator -### -- %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-ODR-INDICATOR
|
// RUN: %clang_cl --target=x86_64-windows -fsanitize=address -fsanitize-address-use-odr-indicator -### -- %s 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-ODR-INDICATOR
|
||||||
// CHECK-ASAN-ODR-INDICATOR: -cc1{{.*}}-fsanitize-address-use-odr-indicator
|
// CHECK-ASAN-ODR-INDICATOR: -cc1{{.*}}-fsanitize-address-use-odr-indicator
|
||||||
|
|
Loading…
Reference in New Issue