LLVM IR调用@snprintf触发函数类型定义报错如何解决?
问题原因
LLVM IR调用C标准库的可变参数函数时,需要遵循C语言的默认参数提升ABI规则:所有宽度小于int的整型参数在传入可变参数列表时,会被自动提升为int(对应LLVM IR的i32类型)。
你当前代码中传给snprintf的第四个可变参数是i8类型的%12,不符合上述规则,因此触发类型不匹配报错。另外你call语句里函数类型末尾多余的*也不符合LLVM IR语法规范,需要删除。
修复方案
先将i8类型的字符值扩展为i32类型,再传入snprintf:
- 若对应C的无符号
char,使用零扩展指令zext - 若对应C的有符号
char,使用符号扩展指令sext
修改后的代码示例:
%12 = load i8, i8* %11 ; 新增类型扩展步骤,这里以无符号char为例 %12_ext = zext i8 %12 to i32 ; 调用时传入扩展后的i32类型参数,删除函数类型后多余的* %13 = call i32 (i8*, i32, i8*, ...) @snprintf(i8* %10, i32 3, i8* %9, i32 %12_ext)
内容的提问来源于stack exchange,提问作者David Ragazzi
相关产品推荐
相关产品推荐

