gpt4 book ai didi

c++ - 将数组传递给外部函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:48 25 4
gpt4 key购买 nike

我是 LLVM 的新手,我正在学习如何使用 LLVM 进行分析。我需要将一个数组传递给外部方法,并在代码中插入对该方法的调用指令。我目前正在使用以下代码,在执行时会出现段错误。

std::vector<Value*> Args(1);

//Vector with array values
SmallVector<Constant*, 2> counts;

counts.push_back(ConstantInt::get(Type::getInt32Ty(BB->getContext()),32, false));
counts.push_back(ConstantInt::get(Type::getInt32Ty(BB->getContext()),12, false));

//Array with 2 integers
Args[0]= ConstantArray::get(llvm::ArrayType::get(llvm::Type::getInt32Ty(BI->getContext()),2), counts);

这里,外部函数“hook”定义为 M.getOrInsertFunction("hook", Type::getVoidTy(M.getContext()),
llvm::ArrayType::get(llvm::Type::getInt32Ty(BI->getContext()),2)
(类型*)0);

在阅读了几个源文件后,我尝试使用 GetElementPtrInst 来传递数组

std::vector<Value*> ids(1);
ids.push_back(ConstantInt::get(Type::getInt32Ty(BB->getContext()),0));
Constant* array = ConstantArray::get(llvm::ArrayType::get(llvm::Type::getInt32Ty(BI->getContext()),2), counts);
Args[0] = ConstantExpr::getGetElementPtr(&(*array), ids, false);

但它失败了

7  opt 0x00000000006c59f5 bool llvm::isa<llvm::Constant, llvm::Value*>(llvm::Value* const&) + 24

8 opt 0x00000000006c5a0f llvm::cast_retty<llvm::Constant, llvm::Value*>::ret_type llvm::cast<llvm::Constant, llvm::Value*>(llvm::Value* const&) + 24

9 opt 0x0000000000b2b22f

10 opt 0x0000000000b2a4fe llvm::ConstantFoldGetElementPtr(llvm::Constant*, bool, llvm::ArrayRef<llvm::Value*>) + 55

11 opt 0x0000000000b33df2 llvm::ConstantExpr::getGetElementPtr(llvm::Constant*, llvm::ArrayRef<llvm::Value*>, bool) + 82

此外,在这种情况下,'hook' 定义为 M.getOrInsertFunction("hook", Type::getVoidTy(M.getContext()),
PointerType::get(Type::getInt32PtrTy(M.getContext()),0),//当使用 GEP 时
(类型*)0);

有人可以给我一些关于将数组传递给外部函数的指示吗(比如使用签名 void hook(int abc[]) )。我可能从头到尾都错了,非常感谢您的帮助。

最佳答案

开始“我如何在 LLVM IR 中做类似 C 的事情”问题的一个好地方是首先用 C 写你想做的事情,然后 compile it to LLVM IR via Clang并查看结果。

在您的特定实例中,文件:

void f(int a[2]);

void g() {
int x[2];
x[0] = 1;
x[1] = 3;
f(x);
}

将编译为:

define void @g() nounwind {
%x = alloca [2 x i32], align 4
%1 = getelementptr inbounds [2 x i32]* %x, i32 0, i32 0
store i32 1, i32* %1, align 4
%2 = getelementptr inbounds [2 x i32]* %x, i32 0, i32 1
store i32 3, i32* %2, align 4
%3 = getelementptr inbounds [2 x i32]* %x, i32 0, i32 0
call void @f(i32* %3)
ret void
}

declare void @f(i32*)

所以我们可以看到clang编译的g接收的是i32*,而不是数组。这意味着您需要一种方法从数组本身获取数组第一个元素的地址,以及一个 getelementptr instruction。是一种直接的方法。

但是请注意,您想要生成一个 GEP(getelementptr 指令),例如通过 GetElementPtrInst::create。一个 gep constant expression ,这是您要在此处生成的内容,是其他内容,并且仅适用于编译时常量。

关于c++ - 将数组传递给外部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14586869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com