about summary refs log tree commit diff
path: root/tests/codegen-llvm/sanitizer/cfi/external_weak_symbols.rs
blob: 893b016769368d5f5d1cd27b043363adeef80ebe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Verifies that type metadata identifiers for for weakly-linked symbols are
// emitted correctly.
//
//@ needs-sanitizer-cfi
//@ compile-flags: -Clinker-plugin-lto -Copt-level=0 -Zsanitizer=cfi -Ctarget-feature=-crt-static -C unsafe-allow-abi-mismatch=sanitizer
#![crate_type = "bin"]
#![feature(linkage)]

unsafe extern "C" {
    #[linkage = "extern_weak"]
    static FOO: Option<unsafe extern "C" fn(f64) -> ()>;
}
// CHECK: @_rust_extern_with_linkage_{{.*}}_FOO = internal global ptr @FOO

fn main() {
    unsafe {
        if let Some(method) = FOO {
            method(4.2);
            // CHECK: call i1 @llvm.type.test(ptr {{%method|%0}}, metadata !"_ZTSFvdE")
        }
    }
}

// CHECK: declare !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}} extern_weak void @FOO(double) unnamed_addr #{{[0-9]+}}