如何使用Rust ASM构建屏障?

3

在gcc中,我们可以使用asm volatile("":::"memory");

但是我在Rust inline asm文档中找不到类似于"memory"的选项。

有没有办法实现相似的功能呢?

1个回答

5
在Rust中,默认情况下会进行内存破坏。您应该使用options(nomem)来选择退出。

例如:链接
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
}

没有nomem的函数会发出~{memory}屏障。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接