Как использовать константу в макросе встроенной сборки Rust? - PullRequest
0 голосов
/ 28 сентября 2018

Я портирую некий устаревший ассемблерный код на Rust, и мне нужно вызвать его с помощью макроса asm!.Тем не менее, код сборки зависит от некоторых констант, хранящихся в файле заголовка C.Мне бы хотелось, чтобы он был похожим, определите константы в Rust и укажите имена констант в макросе asm.

Legacy C header:

#define HCR_VALUE 0xffff0000

Legacy ASM file:

.func
...
ldr    x0, =HCR_VALUE
...

Код ржавчины:

pub const HCR_VALUE: u32 = 0xffff0000;
unsafe { asm!("ldr x0, HCR_VALUE":::"x0"); }

При создании приложения возникает ошибка компоновщика:

lld-link: error: undefined symbol: HCR_VALUE

1 Ответ

0 голосов
/ 28 сентября 2018

Вам необходимо передать константу с подходящим ограничением, например так:

unsafe { asm!("ldr x0, =${0:c}" : : "i" (HCR_VALUE) : "x0"); }

Правильное ограничение зависит от архитектуры;в процессорах RISC не все константы могут быть представлены как непосредственные значения.Так что вам, возможно, придется использовать ограничение регистра вместо этого, и LLVM материализует константу там.

...