LLVM-GCC ASM для LLVM в XCode

Я получил следующее определение, которое прекрасно компилируется (и работает) с использованием компилятора XCode LLVM-GCC:

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

Однако, когда я меняю компилятор на Apple LLVM, я получаю следующую ошибку:

Expected '(' after 'asm'

Я заменяю {} на (), но это не помогает, я гуглюсь по этой ошибке не могу найти ничего полезного … кто-нибудь?

2

Решение

__asm {...} стиль встроенной сборки нестандартен и не поддерживается clang. Вместо этого C ++ определяет встроенный синтаксис сборки как asm("...")Обратите внимание на цитаты. Также лязг использует AT&Синтаксис T-сборки, поэтому макросы необходимо переписать для обеспечения безопасности.

Тем не менее, продолжается работа по улучшению поддержки нестандартного синтаксиса сборки Microsoft и сборки стиля Intel вместе с ней. Там есть вариант -fenable-experimental-ms-inline-asm это позволяет сделать то, что было сделано до сих пор, хотя я не уверен, когда это было введено или насколько хороша поддержка в версии clang, которую вы используете. Простая попытка с кодом, который вы показываете, кажется, работает с недавней версией Clang из ствола SVN.

#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-экспериментальный-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-экспериментальный-ms-inline-asm создает исполняемый файл, который запускается

Это все еще производит предупреждения как следующее все же.

предупреждение: встроенная сборка в стиле MS не поддерживается [-Wmicrosoft]

3

Другие решения

У меня проблема с использованием среды разработки XCode, следующий код скомпилирован правильно. Переключаясь на мой make-файл, я получил следующее сообщение об ошибке 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

1

По вопросам рекламы [email protected]