首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铸造`[<length> x i8]*‘到`i8 *’

铸造`[<length> x i8]*‘到`i8 *’
EN

Stack Overflow用户
提问于 2020-11-17 19:02:51
回答 1查看 125关注 0票数 0

我试图将一个参数替换为一个现有的函数调用。最初的参数是一个全局字符串,我试图用一个本地字符串替换它。

无论我如何尝试,我都会得到一个Call parameter type does not match function signature!运行时错误。

具体来说,我想将参数替换为printf函数- declare dso_local i32 @printf(i8*, ...) #1。代码中对它的调用如下所示:

代码语言:javascript
复制
@message = dso_local global [12 x i8] c"Hello World\00", align 1
...
%call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @message, i64 0, i64 0))

我分配和GEP本地替换字符串如下:

代码语言:javascript
复制
%0 = alloca [12 x i8], align 1
%1 = getelementptr inbounds [12 x i8], [12 x i8]* %0, i64 0

但是,当我使用setOperand() on %call将参数替换为%1时,我会得到前面提到的错误。我想[12 x i8]*i8*不同,但我找不到一种方法来转换它。

我尝试过使用CreatePointerCast()进行转换,它创建了以下内容:

代码语言:javascript
复制
%2 = addrspacecast [12 x i8]* %1 to i8 addrspace(8)*

但是得到了相同的错误( %2的类型是i8 addrspace(8)*,与i8*不同)。

还尝试在创建GEP时显式指定i8*类型:

代码语言:javascript
复制
Builder->CreateInBoundsGEP(llvm::Type::getInt8PtrTy(Ctx, 8), ...)

都没有用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-17 19:44:28

我认为你错误地使用了GEP指令。

记住,第一个索引步骤在[12 x i8]*类型的指针上,这是您提供的,第二个索引指定帮助计算字符串的第一个字符的起始地址,这可能是您遗漏的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64881674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档