// revisions: x64 A64 ppc64le // assembly-output: emit-asm // [x64] compile-flags: --target x86_64-unknown-linux-gnu -Crelocation-model=static // [x64] needs-llvm-components: x86 // [A64] compile-flags: --target aarch64-unknown-linux-gnu -Crelocation-model=static // [A64] needs-llvm-components: aarch64 // [ppc64le] compile-flags: --target powerpc64le-unknown-linux-gnu -Crelocation-model=static // [ppc64le] needs-llvm-components: powerpc // ignore-debug: alignment checks insert panics that we don't have a lang item for #![feature(no_core, lang_items)] #![no_core] #![crate_type="rlib"] #[lang="sized"] trait Sized {} #[lang="copy"] trait Copy {} #[lang="sync"] trait Sync {} #[lang = "drop_in_place"] fn drop_in_place(_: *mut T) {} impl Copy for u8 {} impl Sync for u8 {} #[no_mangle] pub static PIERIS: u8 = 42; extern "C" { static EXOCHORDA: *mut u8; fn chaenomeles(); } // CHECK-LABEL: banana: // On the next line LLVM 14 produces a `movb`, whereas LLVM 15+ produces a `movzbl`. // x64: {{movb|movzbl}} chaenomeles{{(\(%[a-z0-9]+\))?}}, %{{[a-z0-9]+}} // A64: adrp [[REG:[a-z0-9]+]], chaenomeles // A64-NEXT: ldrb {{[a-z0-9]+}}, {{\[}}[[REG]], :lo12:chaenomeles] #[no_mangle] pub fn banana() -> u8 { unsafe { *(chaenomeles as *mut u8) } } // CHECK-LABEL: peach: // x64: {{movb|movzbl}} banana{{(\(%[a-z0-9]+\))?}}, %{{[a-z0-9]+}} // A64: adrp [[REG2:[a-z0-9]+]], banana // A64-NEXT: ldrb {{[a-z0-9]+}}, {{\[}}[[REG2]], :lo12:banana] #[no_mangle] pub fn peach() -> u8 { unsafe { *(banana as *mut u8) } } // CHECK-LABEL: mango: // x64: movq EXOCHORDA{{(\(%[a-z0-9]+\))?}}, %[[REG:[a-z0-9]+]] // x64-NEXT: {{movb|movzbl}} (%[[REG]]), %{{[a-z0-9]+}} // A64: adrp [[REG2:[a-z0-9]+]], EXOCHORDA // A64-NEXT: ldr {{[a-z0-9]+}}, {{\[}}[[REG2]], :lo12:EXOCHORDA] #[no_mangle] pub fn mango() -> u8 { unsafe { *EXOCHORDA } } // CHECK-LABEL: orange: // x64: mov{{l|absq}} $PIERIS, %{{[a-z0-9]+}} // A64: adrp [[REG2:[a-z0-9]+]], PIERIS // A64-NEXT: add {{[a-z0-9]+}}, [[REG2]], :lo12:PIERIS #[no_mangle] pub fn orange() -> &'static u8 { &PIERIS } // For ppc64 we need to make sure to generate TOC entries even with the static relocation model // ppc64le: .tc chaenomeles[TC],chaenomeles // ppc64le: .tc banana[TC],banana // ppc64le: .tc EXOCHORDA[TC],EXOCHORDA // ppc64le: .tc PIERIS[TC],PIERIS