LLVM-GCC ASM到XCode中的LLVM

时间:2012-11-09 02:44:07

标签: c++ c llvm xcode4.5 llvm-gcc

我得到了以下两个使用XCode LLVM-GCC编译器编译(和工作)的定义:

#define SAVE_STACK(v)__asm { mov v, ESP }
#define RESTORE_STACK __asm {sub ESP, s }

然而,当我将编译器更改为Apple LLVM时,我收到以下错误:

Expected '(' after 'asm'

我将{}替换为()但是没有做到这一点,我谷歌上的错误找不到任何有用的东西......任何人?

2 个答案:

答案 0 :(得分:3)

内联汇编的__asm {...}样式是非标准的,clang不支持。相反,C ++将内联汇编语法指定为asm("..."),请注意引号。 clang也使用AT& T汇编语法,因此需要重写宏以保证安全。

然而,一些工作一直在进行,以改进对微软非标准汇编语法和英特尔风格组件的支持。有一个选项-fenable-experimental-ms-inline-asm可以实现到目前为止所做的工作,虽然我不确定它何时被引入或者你正在使用的clang版本中的支持有多好。使用您显示的代码进行的简单尝试似乎与SVN中继的最新版本的clang一起使用。

#define SAVE_STACK(v)__asm { mov v, ESP }
#define RESTORE_STACK __asm {sub ESP, s }

int main() {
    int i;
    int s;
    SAVE_STACK(i);
    RESTORE_STACK;
}

clang ++ tmp.cpp -fms-extensions -fenable-experimental-ms-inline-asm -S -o -

        .def     main;
        .scl    2;
        .type   32;
        .endef
        .text
        .globl  main
        .align  16, 0x90
main:                                   # @main
# BB#0:                                 # %entry
        pushq   %rax
        #APP
        .intel_syntax
        mov dword ptr [rsp + 4], ESP
        .att_syntax
        #NO_APP
        #APP
        .intel_syntax
        sub ESP, dword ptr [rsp]
        .att_syntax
        #NO_APP
        xorl    %eax, %eax
        popq    %rdx
        ret

命令 clang ++ tmp.cpp -fms-extensions -fenable-experimental-ms-inline-asm 生成一个可运行的可执行文件。

它仍然会产生如下警告。

  

警告:不支持MS样式的内联汇编[-Wmicrosoft]

答案 1 :(得分:1)

我在使用XCode开发环境时遇到问题,以下代码编译正确。切换到我的makefile我收到以下错误消息Expected '(' after 'asm'

#define DebugBreak()  { __asm { int 3 }; }
int main(int argc, const char *argv[])
{
    DebugBreak();
}

请注意DebugBreak()的定义来自我在Visual Studio下编译的代码。

我在make文件中修复此问题的方法是添加参数-fasm-blocks

CFLAGS += -std=c++11 -stdlib=libc++ -O2 -fasm-blocks