//@ add-core-stubs //@ compile-flags: -Copt-level=3 --target x86_64-unknown-linux-gnu //@ needs-llvm-components: x86 #![crate_type = "rlib"] #![feature(no_core)] #![no_core] // Test that when an inline assembly block specifies `readonly` but not `pure`, a detailed // `MemoryEffects` is provided to LLVM: this assembly block is not allowed to perform writes, // but it may have side-effects. extern crate minicore; use minicore::*; pub static mut VAR: i32 = 0; // CHECK-LABEL: @no_options // CHECK: call i32 asm #[no_mangle] pub unsafe fn no_options() -> i32 { VAR = 1; let _ignored: i32; asm!("mov {0}, 1", out(reg) _ignored); VAR } // CHECK-LABEL: @readonly_pure // CHECK-NOT: call i32 asm #[no_mangle] pub unsafe fn readonly_pure() -> i32 { VAR = 1; let _ignored: i32; asm!("mov {0}, 1", out(reg) _ignored, options(pure, readonly)); VAR } // CHECK-LABEL: @readonly_not_pure // CHECK: call i32 asm {{.*}} #[[ATTR:[0-9]+]] #[no_mangle] pub unsafe fn readonly_not_pure() -> i32 { VAR = 1; let _ignored: i32; asm!("mov {0}, 1", out(reg) _ignored, options(readonly)); VAR } // CHECK: attributes #[[ATTR]] = { nounwind memory(read, inaccessiblemem: readwrite) }