C++ LLVM在运行时获取声明函数的参数值
我正在编写一个LLVM过程,需要将值传递给声明的函数,并说打印出来。请注意,正在LLVM IR中调用声明的函数 我编写了一个模块过程来迭代程序中的所有指令。获取指令中被调用函数的参数的代码段如下所示:C++ LLVM在运行时获取声明函数的参数值,c++,c,llvm,C++,C,Llvm,我正在编写一个LLVM过程,需要将值传递给声明的函数,并说打印出来。请注意,正在LLVM IR中调用声明的函数 我编写了一个模块过程来迭代程序中的所有指令。获取指令中被调用函数的参数的代码段如下所示: for (auto &B: F){ for (auto &I: B){ if (auto *InvokeI = dyn_cast <InvokeInst>(&I)) {
for (auto &B: F){
for (auto &I: B){
if (auto *InvokeI = dyn_cast <InvokeInst>(&I)) {
if (InvokeI->getCalledFunction()->getName().str() == "function_name") {
errs() << "===\n";
errs() << *(InvokeI->getOperand(0)) <<"\n";
errs() << *(InvokeI->getOperand(1)) <<"\n";
errs() << *(InvokeI->getOperand(2)) <<"\n";
}
}
}
}
然后,我的上述代码段输出:
%4 = call i8* @__cxa_allocate_exception(i64 4) #2
i8* bitcast (i8** @_ZTIi to i8*)
i8* null
而不是输出函数调用期间传递的实际值
我的问题是如何获得运行时传递的值。有没有一种方法可以向声明的函数添加一个不返回任何内容的函数体
感谢您在这方面的帮助,
感谢异常会更改程序的控制流,以便在程序执行期间提供其功能。作为操纵程序堆栈、执行清理等的运行时构造,它依赖于支持来执行其职责。出于这个原因,有一个标准化了如何跨实现将其付诸实施的方面 话虽如此,如果深入研究该规范,您会发现
\uucxa\uthrow
的参数就是它所抛出的参数。看一看。上面的片段包含指向已分配异常位置的指针以及类型信息。实际上,如果您在\u ZTIi
上应用c++filt
,您将获得int的typeinfo
换句话说,语句throw 1
抛出的整数1
被包装到异常对象(即内存位置)中,以便在运行时访问。关于这些值存储在何处以及如何存储的更多具体细节见上述规范。我看不到静态访问这些特定值的直接方法,因为哪些异常可能是活动的,哪些具体内容取决于程序在执行期间的状态(例如调用堆栈等).这是生成异常的c++abi
调用。你能提供一个原始源代码的最小片段,在pastebin或类似的地方生成IR(如果它太大了,在这里)实际上,函数名是“代码>、第1、第1条/代码”,我试图抓住那一个,或者不管它的意思是什么,都有点迷失方向,这是没有意义的,因为你已经留下了指向C++的东西。是的,事实上,如果我试图在编译时捕获异常(显然我现在正在这样做),它会变得有点复杂,但是在运行时使用JIT来grep throw参数会更有意义,我也不太确定如何使用它:)
%4 = call i8* @__cxa_allocate_exception(i64 4) #2
i8* bitcast (i8** @_ZTIi to i8*)
i8* null