【问题标题】:Casting `[<length> x i8]*` to `i8 *`将 `[<length> x i8]*` 转换为 `i8 *`
【发布时间】:2020-11-17 19:02:51
【问题描述】:

我正在尝试将参数替换为现有函数调用。初始参数是一个全局字符串,我正在尝试用本地字符串替换它。

无论我尝试什么,我都会收到 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\00", 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), ...)

无济于事。

【问题讨论】:

    标签: clang llvm llvm-ir


    【解决方案1】:

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

    请记住,第一个索引越过 [12 x i8]* 类型的指针,这是您提供的,第二个索引指定有助于计算字符串第一个字符的起始地址,这可能是您错过的。

    【讨论】:

      猜你喜欢
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2022-10-24
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      相关资源
      最近更新 更多