在查看 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
不再返回?