Search code examples
rustinline-assemblymemory-barriers

How to build a barrier by rust asm?


In gcc, we can use asm volatile("":::"memory");

But I can't find a option similar to "memory" in document of rust inline asm.

Is there any way to do that?


Solution

  • In Rust, memory clobbering is the default. You should use options(nomem) to opt it out.

    For example:

    pub unsafe fn no_nomem() {
        std::arch::asm!("");
    }
    
    pub unsafe fn nomem() {
        std::arch::asm!("", options(nomem));
    }
    

    LLVM IR:

    define void @_ZN7example8no_nomem17h95b023e6c43118daE() unnamed_addr #0 !dbg !5 {
      call void asm sideeffect alignstack inteldialect "", "~{dirflag},~{fpsr},~{flags},~{memory}"(), !dbg !10, !srcloc !11
      br label %bb1, !dbg !10
    
    bb1:                                              ; preds = %start
      ret void, !dbg !12
    }
    
    define void @_ZN7example5nomem17hc75cf2d808290004E() unnamed_addr #0 !dbg !13 {
      call void asm sideeffect alignstack inteldialect "", "~{dirflag},~{fpsr},~{flags}"() #1, !dbg !14, !srcloc !15
      br label %bb1, !dbg !14
    
    bb1:                                              ; preds = %start
      ret void, !dbg !16
    }
    

    The function without nomem emits a ~{memory} barrier.