mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // 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<T>(_: *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
 | 
