| // Copyright 2020 The Fuchsia Authors |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #ifndef ZIRCON_KERNEL_LIB_SPECIAL_SECTIONS_INCLUDE_LIB_SPECIAL_SECTIONS_SPECIAL_SECTIONS_H_ |
| #define ZIRCON_KERNEL_LIB_SPECIAL_SECTIONS_INCLUDE_LIB_SPECIAL_SECTIONS_SPECIAL_SECTIONS_H_ |
| |
| // This is used as a C++ attribute on a variable definition to specify it goes |
| // into a special section. The section name is given as a string. The type is |
| // the element type of the section, for determining alignment. Variables in |
| // special sections get precise alignment so that the whole section is packed |
| // as an array. Without the alignas attribute, the compiler is allowed to |
| // overalign any variable, which would break the array-like layout. Without |
| // the used attribute, the compiler will remove it (and maybe warn) if it's not |
| // referenced in the file. Without the retain attribute, the linker might |
| // remove it if it's not referenced by anything else in the link. Using them |
| // all ensures that just the declaration being compiled in will guarantee the |
| // element appears in the special section at runtime. |
| #define SPECIAL_SECTION(name, type) \ |
| alignas(type) [[gnu::used, gnu::retain, gnu::section(SPECIAL_SECTION_NAME(name)), \ |
| SPECIAL_SECTION_NO_ASAN]] |
| |
| #ifdef _WIN32 |
| #define SPECIAL_SECTION_NAME(name) "." name "$M" |
| #else |
| #define SPECIAL_SECTION_NAME(name) name |
| #endif |
| |
| // AddressSanitizer instrumentation normally places red zones around global |
| // variables. This must be suppressed in special sections so as not to break |
| // the array-like layout. |
| #ifdef __clang__ |
| #define SPECIAL_SECTION_NO_ASAN clang::no_sanitize("address") |
| #else |
| #define SPECIAL_SECTION_NO_ASAN |
| #endif |
| |
| #endif // ZIRCON_KERNEL_LIB_SPECIAL_SECTIONS_INCLUDE_LIB_SPECIAL_SECTIONS_SPECIAL_SECTIONS_H_ |