将 `[<length> x i8]*` 转换为 `i8 *`
Casting `[<length> x i8]*` to `i8 *`
我正在尝试替换现有函数调用的参数。初始参数是一个全局字符串,我正在尝试用本地字符串替换它。
无论我尝试什么,我都会遇到 Call parameter type does not match function signature!
运行时错误。
具体来说,我想替换 printf
函数的参数 - declare dso_local i32 @printf(i8*, ...) #1
。在代码中对它的调用如下所示:
@message = dso_local global [12 x i8] c"Hello World[=11=]", align 1
...
%call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @message, i64 0, i64 0))
我这样分配和 GEP 本地替换字符串:
%0 = alloca [12 x i8], align 1
%1 = getelementptr inbounds [12 x i8], [12 x i8]* %0, i64 0
但是当我在 %call
上使用 setOperand()
将参数替换为 %1
时,我得到了上述错误。我想 [12 x i8]*
与 i8*
不同,但我找不到有效的转换方法。
我试过使用 CreatePointerCast()
进行转换,它创建了这个:
%2 = addrspacecast [12 x i8]* %1 to i8 addrspace(8)*
但得到同样的错误(%2
的类型是 i8 addrspace(8)*
,我猜这与 i8*
不同)。
还尝试在创建 GEP 时明确指定 i8*
类型:
Builder->CreateInBoundsGEP(llvm::Type::getInt8PtrTy(Ctx, 8), ...)
无济于事。
我认为您错误地使用了 GEP
指令。
记住第一个索引跨越 [12 x i8]*
类型的指针,这是您提供的,第二个索引指定帮助计算字符串第一个字符的起始地址,这可能是您错过了。
我正在尝试替换现有函数调用的参数。初始参数是一个全局字符串,我正在尝试用本地字符串替换它。
无论我尝试什么,我都会遇到 Call parameter type does not match function signature!
运行时错误。
具体来说,我想替换 printf
函数的参数 - declare dso_local i32 @printf(i8*, ...) #1
。在代码中对它的调用如下所示:
@message = dso_local global [12 x i8] c"Hello World[=11=]", align 1
...
%call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @message, i64 0, i64 0))
我这样分配和 GEP 本地替换字符串:
%0 = alloca [12 x i8], align 1
%1 = getelementptr inbounds [12 x i8], [12 x i8]* %0, i64 0
但是当我在 %call
上使用 setOperand()
将参数替换为 %1
时,我得到了上述错误。我想 [12 x i8]*
与 i8*
不同,但我找不到有效的转换方法。
我试过使用 CreatePointerCast()
进行转换,它创建了这个:
%2 = addrspacecast [12 x i8]* %1 to i8 addrspace(8)*
但得到同样的错误(%2
的类型是 i8 addrspace(8)*
,我猜这与 i8*
不同)。
还尝试在创建 GEP 时明确指定 i8*
类型:
Builder->CreateInBoundsGEP(llvm::Type::getInt8PtrTy(Ctx, 8), ...)
无济于事。
我认为您错误地使用了 GEP
指令。
记住第一个索引跨越 [12 x i8]*
类型的指针,这是您提供的,第二个索引指定帮助计算字符串第一个字符的起始地址,这可能是您错过了。