diff options
| author | Matthias Krüger <476013+matthiaskrgr@users.noreply.github.com> | 2025-03-17 16:34:50 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-17 16:34:50 +0100 |
| commit | 8f5c09b37cd42bbad105bc6f81eaa681bc157259 (patch) | |
| tree | b4a249269b1d0cf84dd61fef444af0f6fc3dccbb /compiler/rustc_pattern_analysis/src | |
| parent | fd4ad332422e7c7c2cb61cbb8cb63029367eb710 (diff) | |
| parent | b30cf11b9672cf9d938654a75aded1a2084b9980 (diff) | |
| download | rust-8f5c09b37cd42bbad105bc6f81eaa681bc157259.tar.gz rust-8f5c09b37cd42bbad105bc6f81eaa681bc157259.zip | |
Rollup merge of #138349 - 1c3t3a:external-weak-cfi, r=rcvalle
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
Diffstat (limited to 'compiler/rustc_pattern_analysis/src')
0 files changed, 0 insertions, 0 deletions
