Skip to content

Conversation

@gbMattN
Copy link
Contributor

@gbMattN gbMattN commented Oct 31, 2025

…nd update docs

@gbMattN gbMattN requested review from fhahn and melver October 31, 2025 21:14
@llvmbot llvmbot added clang Clang issues not falling into any other category clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' labels Oct 31, 2025
@llvmbot
Copy link
Member

llvmbot commented Oct 31, 2025

@llvm/pr-subscribers-clang-driver

@llvm/pr-subscribers-clang

Author: Matthew Nagy (gbMattN)

Changes

…nd update docs


Full diff: https://github.com/llvm/llvm-project/pull/165920.diff

6 Files Affected:

  • (modified) clang/docs/TypeSanitizer.rst (+19-3)
  • (modified) clang/docs/UsersManual.rst (+9)
  • (modified) clang/include/clang/Driver/Options.td (+12)
  • (modified) clang/include/clang/Driver/SanitizerArgs.h (+2)
  • (modified) clang/lib/Driver/SanitizerArgs.cpp (+20)
  • (added) clang/test/CodeGen/sanitize-type-outlined.cpp (+13)
diff --git a/clang/docs/TypeSanitizer.rst b/clang/docs/TypeSanitizer.rst index 3c683a6c24bb4..451f6396a0039 100644 --- a/clang/docs/TypeSanitizer.rst +++ b/clang/docs/TypeSanitizer.rst @@ -20,9 +20,13 @@ code is build with ``-fno-strict-aliasing``, sacrificing performance. TypeSanitizer is built to catch when these strict aliasing rules have been violated, helping users find where such bugs originate in their code despite the code looking valid at first glance. -As TypeSanitizer is still experimental, it can currently have a large impact on runtime speed,  -memory use, and code size. It also has a large compile-time overhead. Work is being done to  -reduce these impacts. +Typical memory overhead introduced by TypeSanitizer is about **8x**. Runtime slowdown varies greatly  +depending on how often the instrumented code relies on type aliasing. In the best case slowdown is  +**2x-3x**. + +The compiler instrumentation also has an impact on code size and compilation overhead. There is an  +experimental instrumentation outlining option which can greatly reduce this (see sanitizer options)  +but this may decrease runtime performance. The TypeSanitizer Algorithm =========================== @@ -128,6 +132,18 @@ references to LLVM IR specific terms. Sanitizer features ================== +Instrumentation code outlining +------------------------------ + +By default TypeSanitizer inlines the instrumentation code. This leads to increased +binary size and compilation time.  + +By default AddressSanitizer inlines the instrumentation 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 instrumentation to be outlined, which reduces the size +of the generated code, but also reduces the run-time performance. + ``__has_feature(type_sanitizer)`` ------------------------------------ diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst index fb22ad3c90af4..e5d3a6b1dd0cb 100644 --- a/clang/docs/UsersManual.rst +++ b/clang/docs/UsersManual.rst @@ -2276,6 +2276,15 @@ are listed below. reduce the binary size, but might result in a worse run-time performance. See :doc: `AddressSanitizer` for more details. +  +.. option:: -f[no-]sanitize-type-outline-instrumentation + + Controls how type sanitizer code is generated. If enabled will always use + a function call instead of inlining the code. Turning this option on may + reduce the binary size and compilation overhead, but might result in a worse  + run-time performance. + + See :doc: `TypeSanitizer` for more details. .. option:: -f[no-]sanitize-stats diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 6e1c9425d8d75..adef9a592b55e 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2454,6 +2454,18 @@ 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_type_outline_instrumentation : Flag<["-"], "fsanitize-type-outline-instrumentation">, + Group<f_clang_Group>, + HelpText<"Always generate function calls for type sanitizer instrumentation">; +def fno_sanitize_type_outline_instrumentation : Flag<["-"], "fno-sanitize-type-outline-instrumentation">, + Group<f_clang_Group>, + HelpText<"Use default code inlining logic for the type sanitizer">; +def fsanitize_type_verify_outlined_instrumentation : Flag<["-"], "fsanitize_type_verify_outlined_instrumentation">, + Group<f_clang_Group>, + HelpText<"Use both inlined and outlined instrumentation for type sanitizer to verify equivilence">; +def fno_sanitize_type_verify_outlined_instrumentation : Flag<["-"], "fno_sanitize_type_verify_outlined_instrumentation">, + Group<f_clang_Group>, + HelpText<"Don't use both inlined and outlined instrumentation for type sanitizer to verify equivilence">; defm sanitize_stable_abi : OptInCC1FFlag<"sanitize-stable-abi", "Stable ", "Conventional ", "ABI instrumentation for sanitizer runtime. Default: Conventional">; diff --git a/clang/include/clang/Driver/SanitizerArgs.h b/clang/include/clang/Driver/SanitizerArgs.h index eea7897e96afd..29569bcf7fa25 100644 --- a/clang/include/clang/Driver/SanitizerArgs.h +++ b/clang/include/clang/Driver/SanitizerArgs.h @@ -67,6 +67,8 @@ class SanitizerArgs { bool TsanFuncEntryExit = true; bool TsanAtomics = true; bool MinimalRuntime = false; + bool TysanOutlineInstrumentation = false; + bool TysanVerifyOutlinedInstrumentation = false; // True if cross-dso CFI support if provided by the system (i.e. Android). bool ImplicitCfiRuntime = false; bool NeedsMemProfRt = false; diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index 5dd48f53b9069..889a7099eed54 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -1176,6 +1176,17 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended); } + if(AllAddedKinds & SanitizerKind::Type) { + TysanOutlineInstrumentation = + Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation, + options::OPT_fno_sanitize_type_outline_instrumentation, + TysanOutlineInstrumentation); + TysanVerifyOutlinedInstrumentation = + Args.hasFlag(options::OPT_fsanitize_type_verify_outlined_instrumentation, + options::OPT_fno_sanitize_type_verify_outlined_instrumentation, + TysanVerifyOutlinedInstrumentation); + } + LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime, options::OPT_fno_sanitize_link_runtime, !Args.hasArg(options::OPT_r)); @@ -1500,6 +1511,15 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, CmdArgs.push_back("-asan-instrumentation-with-call-threshold=0"); } + if (TysanOutlineInstrumentation || TysanVerifyOutlinedInstrumentation) { + CmdArgs.push_back("-mllvm"); + CmdArgs.push_back("-tysan-outline-instrumentation"); + } + if (TysanVerifyOutlinedInstrumentation) { + CmdArgs.push_back("-mllvm"); + CmdArgs.push_back("-tysan-verify-outlined-instrumentation"); + } + // When emitting Stable ABI instrumentation, force outlining calls and avoid // inlining shadow memory poisoning. While this is a big performance burden // for now it allows full abstraction from implementation details. diff --git a/clang/test/CodeGen/sanitize-type-outlined.cpp b/clang/test/CodeGen/sanitize-type-outlined.cpp new file mode 100644 index 0000000000000..a6c3915957c94 --- /dev/null +++ b/clang/test/CodeGen/sanitize-type-outlined.cpp @@ -0,0 +1,13 @@ +// RUN: %clang -S -fsanitize=type -emit-llvm -o - -fsanitize=type %s \ +// RUN: | FileCheck %s --check-prefixes=CHECK-NO-OUTLINE +// RUN: %clang -S -fsanitize=type -emit-llvm -o - -fsanitize=type %s \ +// RUN: -fsanitize-type-outline-instrumentation \ +// RUN: | FileCheck %s --check-prefixes=CHECK-OUTLINE + +// CHECK-NO-OUTLINE-NOT: call{{.*}}@__tysan_instrument_mem_inst +// CHECK-OUTLINE: call{{.*}}@__tysan_instrument_mem_inst + +float alias(int *ptr){ + float *aliasedPtr = (float *)ptr; + return *aliasedPtr; +} 
@gbMattN
Copy link
Contributor Author

gbMattN commented Oct 31, 2025

Oops, wrong branch sorry!

@gbMattN gbMattN closed this Oct 31, 2025
@github-actions
Copy link

⚠️ C/C++ code formatter, clang-format found issues in your code. ⚠️

You can test this locally with the following command:
git-clang-format --diff origin/main HEAD --extensions cpp,h -- clang/test/CodeGen/sanitize-type-outlined.cpp clang/include/clang/Driver/SanitizerArgs.h clang/lib/Driver/SanitizerArgs.cpp --diff_from_common_commit

⚠️
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing origin/main to the base branch/commit you want to compare against.
⚠️

View the diff from clang-format here.
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index 889a7099e..c106dd63c 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -1176,15 +1176,15 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended); } - if(AllAddedKinds & SanitizerKind::Type) { + if (AllAddedKinds & SanitizerKind::Type) { TysanOutlineInstrumentation = Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation, options::OPT_fno_sanitize_type_outline_instrumentation, TysanOutlineInstrumentation); - TysanVerifyOutlinedInstrumentation = - Args.hasFlag(options::OPT_fsanitize_type_verify_outlined_instrumentation, - options::OPT_fno_sanitize_type_verify_outlined_instrumentation, - TysanVerifyOutlinedInstrumentation); + TysanVerifyOutlinedInstrumentation = Args.hasFlag( + options::OPT_fsanitize_type_verify_outlined_instrumentation, + options::OPT_fno_sanitize_type_verify_outlined_instrumentation, + TysanVerifyOutlinedInstrumentation); } LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime, 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang Clang issues not falling into any other category

2 participants