mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-16 05:56:56 +00:00
![]() Emit function declarations for functions with `#[linkage="extern_weak"]` Currently, when declaring an extern weak function in Rust, we use the following syntax: ```rust unsafe extern "C" { #[linkage = "extern_weak"] static FOO: Option<unsafe extern "C" fn() -> ()>; } ``` This allows runtime-checking the extern weak symbol through the Option. When emitting LLVM-IR, the Rust compiler currently emits this static as an i8, and a pointer that is initialized with the value of the global i8 and represents the nullabilty e.g. ``` `@FOO` = extern_weak global i8 `@_rust_extern_with_linkage_FOO` = internal global ptr `@FOO` ``` This approach does not work well with CFI, where we need to attach CFI metadata to a concrete function declaration, which was pointed out in https://github.com/rust-lang/rust/issues/115199. This change switches to emitting a proper function declaration instead of a global i8. This allows CFI to work for extern_weak functions. Example: ``` `@_rust_extern_with_linkage_FOO` = internal global ptr `@FOO` ... declare !type !61 !type !62 !type !63 !type !64 extern_weak void `@FOO(double)` unnamed_addr #6 ``` We keep initializing the Rust internal symbol with the function declaration, which preserves the correct behavior for runtime checking the Option. r? `@rcvalle` cc `@jakos-sec` try-job: test-various |
||
---|---|---|
.. | ||
add-canonical-jump-tables-flag.rs | ||
add-cfi-normalize-integers-flag.rs | ||
add-enable-split-lto-unit-flag.rs | ||
dbg-location-on-cfi-blocks.rs | ||
emit-type-checks-attr-no-sanitize.rs | ||
emit-type-checks.rs | ||
emit-type-metadata-attr-cfi-encoding.rs | ||
emit-type-metadata-id-itanium-cxx-abi-const-generics.rs | ||
emit-type-metadata-id-itanium-cxx-abi-drop-in-place.rs | ||
emit-type-metadata-id-itanium-cxx-abi-function-types.rs | ||
emit-type-metadata-id-itanium-cxx-abi-lifetimes.rs | ||
emit-type-metadata-id-itanium-cxx-abi-method-secondary-typeid.rs | ||
emit-type-metadata-id-itanium-cxx-abi-paths.rs | ||
emit-type-metadata-id-itanium-cxx-abi-pointer-types.rs | ||
emit-type-metadata-id-itanium-cxx-abi-primitive-types.rs | ||
emit-type-metadata-id-itanium-cxx-abi-repr-transparent-types.rs | ||
emit-type-metadata-id-itanium-cxx-abi-sequence-types.rs | ||
emit-type-metadata-id-itanium-cxx-abi-trait-types.rs | ||
emit-type-metadata-id-itanium-cxx-abi-user-defined-types.rs | ||
emit-type-metadata-itanium-cxx-abi-generalized.rs | ||
emit-type-metadata-itanium-cxx-abi-normalized-generalized.rs | ||
emit-type-metadata-itanium-cxx-abi-normalized.rs | ||
emit-type-metadata-itanium-cxx-abi.rs | ||
emit-type-metadata-trait-objects.rs | ||
external_weak_symbols.rs | ||
generalize-pointers.rs | ||
normalize-integers.rs |