gpt4 book ai didi

rust - rustc 生成的 LLVM 在使用 lli 运​​行时会给出有关 main 参数类型的错误

转载 作者:行者123 更新时间:2023-11-29 07:50:51 27 4
gpt4 key购买 nike

我正在尝试学习一些关于 LLVM IR 的知识,尤其是 rustc 输出的内容。即使是一个非常简单的案例,我也遇到了一些麻烦。

我将以下内容放入源文件 simple.rs:

fn main() {
let x = 7u32;
let y = x + 2;
}

然后运行rustc --emit llvm-ir simple.rs 得到文件simple.ll,包含

; ModuleID = 'simple.cgu-0.rs'
source_filename = "simple.cgu-0.rs"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Function Attrs: uwtable
define internal void @_ZN6simple4main17h8ac50d7470339b75E() unnamed_addr #0 {
start:
br label %bb1

bb1: ; preds = %start
ret void
}

define i64 @main(i64, i8**) unnamed_addr {
top:
%2 = call i64 @_ZN3std2rt10lang_start17ha09816a4e25587eaE(void ()* @_ZN6simple4main17h8ac50d7470339b75E, i64 %0, i8** %1)
ret i64 %2
}

declare i64 @_ZN3std2rt10lang_start17ha09816a4e25587eaE(void ()*, i64, i8**) unnamed_addr

attributes #0 = { uwtable }

!llvm.module.flags = !{!0}

!0 = !{i32 1, !"PIE Level", i32 2}

然后我尝试用命令运行它

lli-3.9 -load ~/.multirust/toolchains/nightly-x86_64-unknown-linux-gnu/lib/libstd-35ad9950c7e5074b.so simple.ll

但是我收到了错误信息

LLVM ERROR: Invalid type for first argument of main() supplied

我可以按如下方式对其进行最小复制:我制作了一个名为 s2.ll 的文件,其中包含

define i32 @main(i64, i8**) {
ret i32 42
}

并运行 lli-3.9 s2.ll 会给出相同的错误消息。 但是如果我将 s2.ll 的内容更改为

define i32 @main(i32, i8**) {
ret i32 42
}

(即我在 main 中更改了 argc 的类型)然后 lli-3.9 s2.ll 运行,并且 echo $?表明它确实返回了 42

我认为我不必显式地传递 i64 - 我的参数列表或 C 字符串应该放入内存中的某个地方,并将指针和长度传递给 main自动,对吧?因此,我假设我在调用 lli 时做错了什么——但我不知道是什么。

最佳答案

Rust 将其入口点(标有#[start] 属性的函数,默认为标准库中的函数lang_start)标记为采用 argc 类型的参数大小This is a bug因为它应该是C int的类型,所以在64位平台上应该是32位的,但是isize是64位的。但是,由于 64 位调用约定的工作方式,这恰好仍然可以正常工作。返回类型也存在同样的问题。

A fix因为它已于 2017-10-01 提交,应该出现在 Rust 1.22 中。

lli 显然更严格地检查 main 的类型,这就是它给出错误的原因。但是,如果您改用 llc,它应该可以正常工作。

要获得正确的 main 签名,您可以通过在模块顶部放置 #![no_main] 来取消默认的 main ,并提供您自己的 main 标记为 #[no_mangle]。但请注意,这将跳过标准库的初始化。

#![no_main]

#[no_mangle]
pub extern fn main(_argc: i32, _argv: *const *const u8) -> i32 {
0
}

另见:

关于rust - rustc 生成的 LLVM 在使用 lli 运​​行时会给出有关 main 参数类型的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45854134/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com