about summary refs log tree commit diff
path: root/src/doc/rustc-dev-guide
diff options
context:
space:
mode:
authorTomasz Miąsko <tomaszmiasko@gmail.com>2020-02-10 16:53:59 +0100
committerGitHub <noreply@github.com>2020-02-10 10:53:59 -0500
commit61a6004d68dd0db37d782ca5963cba70c5dfa717 (patch)
tree2bb521846a62e0b05308a834651e41e182aa7f62 /src/doc/rustc-dev-guide
parent843edfd4a4e2d8e94ce1c942fbaf9e8e71b37e00 (diff)
downloadrust-61a6004d68dd0db37d782ca5963cba70c5dfa717.tar.gz
rust-61a6004d68dd0db37d782ca5963cba70c5dfa717.zip
Update sanitizers documentation (#562)
Diffstat (limited to 'src/doc/rustc-dev-guide')
-rw-r--r--src/doc/rustc-dev-guide/src/sanitizers.md44
1 files changed, 25 insertions, 19 deletions
diff --git a/src/doc/rustc-dev-guide/src/sanitizers.md b/src/doc/rustc-dev-guide/src/sanitizers.md
index 6205433e594..5e1f396f51f 100644
--- a/src/doc/rustc-dev-guide/src/sanitizers.md
+++ b/src/doc/rustc-dev-guide/src/sanitizers.md
@@ -1,6 +1,6 @@
 # Sanitizers Support
 
-The rustc compiler contains basic support for following sanitizers:
+The rustc compiler contains support for following sanitizers:
 
 * [AddressSanitizer][clang-asan] a faster memory error detector. Can
   detect out-of-bounds access to heap, stack, and globals, use after free, use
@@ -17,13 +17,12 @@ sanitizers please refer to [the unstable book](https://doc.rust-lang.org/unstabl
 
 ## How are sanitizers implemented in rustc?
 
-The implementation of sanitizers relies entirely on LLVM. It consists of
-compile time instrumentation passes and runtime libraries. The role rustc plays
-in the implementation is limited to the execution of the following steps:
+The implementation of sanitizers relies almost entirely on LLVM. The rustc is
+an integration point for LLVM compile time instrumentation passes and runtime
+libraries. Highlight of the most important aspects of the implementation:
 
-1. The sanitizer runtime libraries are part of the [compiler-rt] project, and
-   [will be built as an LLVM subproject][sanitizer-build] when enabled in
-   `config.toml`:
+*  The sanitizer runtime libraries are part of the [compiler-rt] project, and
+   [will be built on supported targets][sanitizer-build] when enabled in `config.toml`:
 
    ```toml
    [build]
@@ -32,27 +31,34 @@ in the implementation is limited to the execution of the following steps:
 
    The runtimes are [placed into target libdir][sanitizer-copy].
 
-2. During LLVM code generation, the functions intended for instrumentation are
-   [marked][sanitizer-attribute] with `SanitizeAddress`, `SanitizeMemory`, or
-   `SanitizeThread` attribute. Currently those attributes are applied in
-   indiscriminate manner. but in principle they could be used to perform
-   instrumentation selectively.
+*  During LLVM code generation, the functions intended for instrumentation are
+   [marked][sanitizer-attribute] with appropriate LLVM attribute:
+   `SanitizeAddress`, `SanitizeMemory`, or `SanitizeThread`. By default all
+   functions are instrumented, but this behaviour can be changed with
+   `#[no_sanitize(...)]`.
 
-3. The LLVM IR generated by rustc is instrumented by [dedicated LLVM
+*  The decision whether to perform instrumentation or not is possible only at a
+   function granularity. In the cases were those decision differ between
+   functions it might be necessary to inhibit inlining, both at [MIR
+   level][inline-mir] and [LLVM level][inline-llvm].
+
+*  The LLVM IR generated by rustc is instrumented by [dedicated LLVM
    passes][sanitizer-pass], different for each sanitizer. Instrumentation
    passes are invoked after optimization passes.
 
-4. When producing an executable, the sanitizer specific runtime library is
+*  When producing an executable, the sanitizer specific runtime library is
    [linked in][sanitizer-link]. The libraries are searched for in target libdir
    relative to default system root, so that this process is not affected
    by sysroot overrides used for example by cargo `-Zbuild-std` functionality.
 
 [compiler-rt]: https://github.com/llvm/llvm-project/tree/master/compiler-rt
-[sanitizer-build]: https://github.com/rust-lang/rust/blob/87c3eedffba64830b67e54e75dd479f9fd83cc7d/src/bootstrap/native.rs#L220-L225
-[sanitizer-copy]: https://github.com/rust-lang/rust/blob/87c3eedffba64830b67e54e75dd479f9fd83cc7d/src/bootstrap/compile.rs#L269-L321
-[sanitizer-attribute]: https://github.com/rust-lang/rust/blob/1.38.0/src/librustc_codegen_llvm/declare.rs#L53-L66
-[sanitizer-pass]: https://github.com/rust-lang/rust/blob/1.38.0/src/librustc_codegen_ssa/back/write.rs#L406-L420
-[sanitizer-link]: https://github.com/rust-lang/rust/blob/87c3eedffba64830b67e54e75dd479f9fd83cc7d/src/librustc_codegen_ssa/back/link.rs#L729-L770
+[sanitizer-build]: https://github.com/rust-lang/rust/blob/a29424a2265411dda7d7446516ac5fd7499e2b55/src/bootstrap/native.rs#L566-L624
+[sanitizer-copy]: https://github.com/rust-lang/rust/blob/a29424a2265411dda7d7446516ac5fd7499e2b55/src/bootstrap/compile.rs#L270-L304
+[sanitizer-attribute]: https://github.com/rust-lang/rust/blob/a29424a2265411dda7d7446516ac5fd7499e2b55/src/librustc_codegen_llvm/attributes.rs#L49-L72
+[inline-mir]: https://github.com/rust-lang/rust/blob/a29424a2265411dda7d7446516ac5fd7499e2b55/src/librustc_mir/transform/inline.rs#L232-L252
+[inline-llvm]: https://github.com/rust-lang/llvm-project/blob/9330ec5a4c1df5fc1fa62f993ed6a04da68cb040/llvm/include/llvm/IR/Attributes.td#L225-L241
+[sanitizer-pass]: https://github.com/rust-lang/rust/blob/a29424a2265411dda7d7446516ac5fd7499e2b55/src/librustc_codegen_llvm/back/write.rs#L454-L475
+[sanitizer-link]: https://github.com/rust-lang/rust/blob/a29424a2265411dda7d7446516ac5fd7499e2b55/src/librustc_codegen_ssa/back/link.rs#L748-L787
 
 ## Additional Information