gpt4 book ai didi

llvm - 使用数组时的 Julia llvm 函数签名

转载 作者:行者123 更新时间:2023-12-04 08:57:18 27 4
gpt4 key购买 nike

当查看 julia 编译器生成的 LLVM IR(使用 code_llvm)时,我注意到使用数组作为参数时函数签名中有些奇怪。让我举个例子:

function test(a,b,c)
return nothing
end

(这是一个无用的例子,但结果与其他函数相同,这个例子的结果 IR 只是不那么困惑)

使用 code_llvm(test, (Int,Int,Int)),我得到以下输出:

; Function Attrs: sspreq
define void @julia_test14855(i64, i64, i64) #2 {
top:
ret void, !dbg !366
}

使用 code_llvm(test, (Array{Int},Array{Int},Array{Int})),我得到了一个(至少对我而言)意想不到的结果:

; Function Attrs: sspreq
define %jl_value_t* @julia_test14856(%jl_value_t*, %jl_value_t**, i32) #2 {
top:
%3 = icmp eq i32 %2, 3, !dbg !369
br i1 %3, label %ifcont, label %else, !dbg !369

else: ; preds = %top
call void @jl_error(i8* getelementptr inbounds ([26 x i8]* @_j_str0, i64 0, i64 0)), !dbg !369
unreachable, !dbg !369

ifcont: ; preds = %top
%4 = load %jl_value_t** inttoptr (i64 36005472 to %jl_value_t**), align 32, !dbg !370
ret %jl_value_t* %4, !dbg !370
}

为什么 llvm 函数的签名不只是将 3 个变量列为 i64* 或类似的东西?为什么函数不再返回 void

最佳答案

为什么 llvm 函数的签名不只是将 3 个变量列为 i64*

这个签名是通用的 Julia 调用约定(因为,正如@ivarne 提到的,类型不完整)。

@julia_test14856(%jl_value_t*, %jl_value_t**, i32) 参数是:

  1. 指向函数闭包的指针
  2. 指向盒装参数的指针(jl_value_t 是基本盒类型)
  3. 参数个数

签名@ivarne 显示的是专门的调用约定。参数仍然以装箱方式传递,但参数类型和计数已经已知(并且函数闭包是不必要的,因为它已经是专门的)。

关于示例函数的输出,这部分检查参数的数量(如果不是 3 -> goto label else:):

top:
%3 = icmp eq i32 %2, 3, !dbg !369
br i1 %3, label %ifcont, label %else, !dbg !369

此部分返回错误:

else:                                             ; preds = %top
call void @jl_error(i8* getelementptr inbounds ([26 x i8]* @_j_str0, i64 0, i64 0)), !dbg !369
unreachable, !dbg !369

最后,默认情况转到这一行,它提取存储在地址 36005472 中的 nothing 的值(在@ivarne 版本中,这是有保证的,因此可以返回 void 直接)。

%4 = 加载 %jl_value_t** inttoptr(i64 36005472 到 %jl_value_t**),对齐 32,!dbg !370

关于llvm - 使用数组时的 Julia llvm 函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21879355/

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