首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移除内联mips组件中附加的“断开”指令

移除内联mips组件中附加的“断开”指令
EN

Stack Overflow用户
提问于 2021-10-25 18:00:36
回答 1查看 139关注 0票数 3

我有以下(简化的)函数,使用内联程序集,目标是mips:

代码语言:javascript
复制
#[naked]
pub unsafe extern "C" fn test() {
    asm!(
        ".set noreorder",
        "jr $ra",
        "li $v0, 0x123",
        options(noreturn),
    )
}

我期望它只编译成两个指定的指令(在发布模式下),因为它是一个裸露的函数,但是一个break指令被追加到后面:

代码语言:javascript
复制
00000000 <test>:
   0:   03e00008        jr      ra
   4:   24020123        li      v0,291
   8:   0000000d        break

我假设这是针对rustc或llvm的未定义行为的对策,但我需要生成函数中指定的确切程序集。

是否有任何方法可以防止rustc、llvm或汇编程序生成这个额外的指令?

我在现有的目标(如mipsel-unknown-none )上测试了它,它还生成了一个break指令,但我正在编译以下自定义目标(如果重要的话):

代码语言:javascript
复制
{
    "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中尝试了同样的方法

代码语言:javascript
复制
__attribute__((naked)) void test() {
    __asm__(
        ".set noreorder\n"
        "jr $ra\n"
        "li $v0, 0x123\n"
    );
}

编译使用

代码语言:javascript
复制
clang -O3 test.c -c -o test.o -target mips-unknown-none

结果是

代码语言:javascript
复制
00000000 <test>:
   0:   03e00008    jr  ra
   4:   24020123    li  v0,291

没有break,所以它似乎包含在锈蚀编译器中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-26 23:00:11

是!做以下其中之一:

  • "trap_unreachable": false添加到target.json中
  • 使用RUSTFLAGS=-Ztrap-unreachable=no构建。(每晚--不过)

不幸的是,这并不是很好的记录。进一步阅读:其中增加了陷阱指令生成。 PR中增加了陷阱-不可达=no

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69712756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档