你如何标记ASM代码?

How do you Mark ASM code?

我正在尝试标记我的 ASM(由编译器生成)以在标记我的分析与相应的 .s 文件之间进行延迟分析。以下 MACRO 适用于 GCC

#define ASM_LABEL(label) asm ("#" label "\n\t")

尽管如此,对于 CLANG,标签已被删除。

void kernel(double const * x, double * y){
    ASM_LABEL (START)
    y[0]+=x[1]+x[3]/x[4];
    y[1] = std::exp(x[0]);
    ASM_LABEL (STOP)
}

生成的 ASM (clang -O3 -S) 给出:

    movq    %rdi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    ## InlineAsm Start
    ## InlineAsm End <---- no START mark
    movq    -8(%rbp), %rsi
    movsd   8(%rsi), %xmm0
    movq    -8(%rbp), %rsi
    ..............

标签已删除。你有什么建议吗?是否存在通用提示?

谢谢

默认情况下,clang 将使用其集成的 llvm 汇编程序,但这可以通过命令行选项 -fno-integrated-as.

禁用

将此与 -S 一起指定应该会保留内联 asm 中的注释。 运行 clang -S -O3 -fno-integrated-as 代码示例

#include <cmath>
#define ASM_LABEL(label) asm ("#" label "\n\t" ::: "memory");

void kernel(double const * x, double * y){
    ASM_LABEL("START")
    y[0]+=x[1]+x[3]/x[4];
    y[1] = std::exp(x[0]);
    ASM_LABEL("STOP")
}

给出程序集(省略指令和标签):

pushq   %rbx
movq    %rsi, %rbx
#APP
#START

#NO_APP
movsd   24(%rdi), %xmm0
divsd   32(%rdi), %xmm0
addsd   8(%rdi), %xmm0
addsd   (%rbx), %xmm0
movsd   %xmm0, (%rbx)
movsd   (%rdi), %xmm0
callq   exp
movsd   %xmm0, 8(%rbx)
#APP
#STOP

#NO_APP
popq    %rbx
retq