![]() 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 |
||
---|---|---|
.. | ||
cfi | ||
kcfi | ||
aarch64-shadow-call-stack-with-fixed-x18.rs | ||
address-sanitizer-globals-tracking.rs | ||
dataflow-instrument-functions.rs | ||
kasan-emits-instrumentation.rs | ||
memory-track-origins.rs | ||
memtag-attr-check.rs | ||
no-sanitize-inlining.rs | ||
no-sanitize.rs | ||
riscv64-shadow-call-stack.rs | ||
safestack-attr-check.rs | ||
sanitizer-recover.rs | ||
scs-attr-check.rs |