Как написать .Syntax унифицированную UAL ARMv7 встроенную сборку в GCC? - PullRequest
0 голосов
/ 07 января 2019

Я хочу написать унифицированную сборку, чтобы избавиться от надоедливых # перед моими литералами, как указано в: Требуется ли хэш для непосредственных значений в сборке ARM?

Это минимальный неунифицированный код с #:

#include <assert.h>
#include <inttypes.h>

int main(void) {
    uint32_t io = 0;
    __asm__ (
        "add %0, %0, #1;"
        : "+r" (io)
        :
        :
    );
    assert(io == 1);
}

, который компилируется и позже работает нормально под QEMU:

arm-linux-gnueabihf-gcc -c -ggdb3 -march=armv7-a -pedantic -std=c99 -Wall -Wextra \
  -fno-pie -no-pie -marm -o 'tmp.o' 'tmp.c'

Если я попытаюсь удалить #, код завершится неудачно с:

/tmp/user/20321/ccoBzpSK.s: Assembler messages:
/tmp/user/20321/ccoBzpSK.s:51: Error: shift expression expected -- `add r3,r3,1'

, как и ожидалось, поскольку неунифицированный, по умолчанию, кажется.

Как заставить это работать?

Я нашел многообещающий вариант:

gcc -masm-syntax-unified

но добавление не помогло.

Если я вместо этого напишу:

".syntax unified; add %0, %0, #1;"

тогда это работает, но я должен был бы делать это для каждого __asm__, что не практично.

Пользовательский интерфейс также обнаружил, что без -marm тогда он использует унифицированную сборку, но генерирует код большого пальца, который мне не нужен.

Возможно, эта ошибка является основной причиной проблемы: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88648

Протестировано в arm-linux-gnueabi-gcc 5.4.0, Ubuntu 18.04.

1 Ответ

0 голосов
/ 10 января 2019

Разработчики вскоре снова ответили на вопрос: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88648#c3, и было исправлено исправление: https://github.com/gcc-mirror/gcc/commit/2fd2b9b8425f9fc4ad98d48a0ca41b921dd75bd9 (пост 8.2.0) исправление -masm-syntax-unified. Отлично!

...