Следующее утверждение взято из iPXE. Он прекрасно компилируется с gcc 7.3, но не работает с gcc 8.2 на архитектуре aarch64. Здесь я получаю ошибку
error: invalid 'asm': invalid address mode
Аргумент макроса einfo представляет собой список из 5 параметров.
#define __einfo_error( einfo ) ( {
__asm__ ( ".section \".einfo\", \"\", " PROGBITS_OPS "\n\t" \
".align 8\n\t" \
"\n1:\n\t" \
".long ( 4f - 1b )\n\t" \
".long %a0\n\t" \
".long ( 2f - 1b )\n\t" \
".long ( 3f - 1b )\n\t" \
".long %a1\n\t" \
"\n2:\t.asciz \"" __einfo_desc ( einfo ) "\"\n\t" \
"\n3:\t.asciz \"" __FILE__ "\"\n\t" \
".align 8\n\t" \
"\n4:\n\t" \
".previous\n\t" : : \
"i" ( __einfo_errno ( einfo ) ), \
"i" ( __LINE__ ) ); \
Откуда
.long %a0
принять его значение?
- Что делает оператор "i"?
- Где ссылка на этот синтаксис? - Изменился ли он с gcc 8.2?