mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // Checks that only functions with the compatible instruction_set attributes are inlined.
 | |
| //
 | |
| // A function is "compatible" when the *callee* has the same attribute or no attribute.
 | |
| //
 | |
| // compile-flags: --target thumbv4t-none-eabi
 | |
| // needs-llvm-components: arm
 | |
| 
 | |
| #![crate_type = "lib"]
 | |
| #![feature(rustc_attrs)]
 | |
| #![feature(no_core, lang_items)]
 | |
| #![feature(isa_attribute)]
 | |
| #![no_core]
 | |
| 
 | |
| #[rustc_builtin_macro]
 | |
| #[macro_export]
 | |
| macro_rules! asm {
 | |
|     ("assembly template",
 | |
|         $(operands,)*
 | |
|         $(options($(option),*))?
 | |
|     ) => {
 | |
|         /* compiler built-in */
 | |
|     };
 | |
| }
 | |
| 
 | |
| #[lang = "sized"]
 | |
| trait Sized {}
 | |
| #[lang = "copy"]
 | |
| trait Copy {}
 | |
| 
 | |
| #[instruction_set(arm::a32)]
 | |
| #[inline]
 | |
| fn instruction_set_a32() {}
 | |
| 
 | |
| #[instruction_set(arm::t32)]
 | |
| #[inline]
 | |
| fn instruction_set_t32() {}
 | |
| 
 | |
| #[inline]
 | |
| fn instruction_set_default() {}
 | |
| 
 | |
| #[inline(always)]
 | |
| fn inline_always_and_using_inline_asm() {
 | |
|     unsafe { asm!("/* do nothing */") };
 | |
| }
 | |
| 
 | |
| // EMIT_MIR inline_instruction_set.t32.Inline.diff
 | |
| #[instruction_set(arm::t32)]
 | |
| pub fn t32() {
 | |
|     // CHECK-LABEL: fn t32(
 | |
|     // CHECK-NOT: (inlined instruction_set_a32)
 | |
|     instruction_set_a32();
 | |
|     // CHECK: (inlined instruction_set_t32)
 | |
|     instruction_set_t32();
 | |
|     // CHECK: (inlined instruction_set_default)
 | |
|     instruction_set_default();
 | |
|     // CHECK-NOT: (inlined inline_always_and_using_inline_asm)
 | |
|     inline_always_and_using_inline_asm();
 | |
| }
 | |
| 
 | |
| // EMIT_MIR inline_instruction_set.default.Inline.diff
 | |
| pub fn default() {
 | |
|     // CHECK-LABEL: fn default(
 | |
|     // CHECK-NOT: (inlined instruction_set_a32)
 | |
|     instruction_set_a32();
 | |
|     // CHECK-NOT: (inlined instruction_set_t32)
 | |
|     instruction_set_t32();
 | |
|     // CHECK: (inlined instruction_set_default)
 | |
|     instruction_set_default();
 | |
|     // CHECK: (inlined inline_always_and_using_inline_asm)
 | |
|     inline_always_and_using_inline_asm();
 | |
| }
 | 
