我有以下(简化的)函数,使用内联程序集,目标是mips:
#[naked]
pub unsafe extern "C" fn test() {
asm!(
".set noreorder",
"jr $ra",
"li $v0, 0x123",
options(noreturn),
)
}我期望它只编译成两个指定的指令(在发布模式下),因为它是一个裸露的函数,但是一个break指令被追加到后面:
00000000 <test>:
0: 03e00008 jr ra
4: 24020123 li v0,291
8: 0000000d break我假设这是针对rustc或llvm的未定义行为的对策,但我需要生成函数中指定的确切程序集。
是否有任何方法可以防止rustc、llvm或汇编程序生成这个额外的指令?
我在现有的目标(如mipsel-unknown-none )上测试了它,它还生成了一个break指令,但我正在编译以下自定义目标(如果重要的话):
{
"arch": "mips",
"cpu": "mips1",
"data-layout": "e-m:m-p:32:32-i8:8:32-i16:16:32-i32:32-n32-S32",
"emit-debug-gdb-scripts": false,
"executables": false,
"features": "+mips32,+soft-float,+noabicalls",
"linker": "rust-lld",
"linker-flavor": "ld.lld",
"llvm-target": "mipsel-unknown-linux-gnu",
"relocation-model": "static",
"target-pointer-width": "32",
"panic-strategy": "abort",
"singlethread": true,
"dynamic-linking": false,
"function-sections": true
}我还使用了一个#![no_std]和#![no_core] staticlib机箱,实现了所需的lang项,并简单地使用cargo build --release --target=my-target.json编译
编辑:在Peter Cordes的建议之后,我在C中尝试了同样的方法
__attribute__((naked)) void test() {
__asm__(
".set noreorder\n"
"jr $ra\n"
"li $v0, 0x123\n"
);
}编译使用
clang -O3 test.c -c -o test.o -target mips-unknown-none结果是
00000000 <test>:
0: 03e00008 jr ra
4: 24020123 li v0,291没有break,所以它似乎包含在锈蚀编译器中。
发布于 2021-10-26 23:00:11
是!做以下其中之一:
"trap_unreachable": false添加到target.json中RUSTFLAGS=-Ztrap-unreachable=no构建。(每晚--不过)不幸的是,这并不是很好的记录。进一步阅读:其中增加了陷阱指令生成。 PR中增加了陷阱-不可达=no
https://stackoverflow.com/questions/69712756
复制相似问题