llvm在C++中提取结构元素和结构大小
llvm extract struct elements and struct size in C++
LLVM新手在此。我有以下C++程序
using namespace std;
struct A{
int i;
int j;
};
int main()
{
struct A obj;
obj.i = 10;
obj.j = obj.i;
return 0;
}
使用clang++,我可以看到LLVM IR包含如下所示的结构字段
%struct.A = type { i32, i32 }
我想使用LLVM Pass获得结构元素。我编写了以下程序-它遍历全局变量和每个指令操作数,但它们都不能帮助我提取结构A、A.I或A.j.
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include <llvm/IR/Constants.h>
#include <llvm/IR/DerivedTypes.h>
#include <llvm/IR/Instructions.h>
#include <llvm/IR/IntrinsicInst.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <iostream>
#include <map>
#include <vector>
using namespace llvm;
namespace {
class StructModulePass: public ModulePass {
public:
static char ID;
StructModulePass() : ModulePass(ID) {}
virtual bool runOnModule(Module &M1) override {
// iterate over global structures
M = &M1;
int i;
for(auto G = M->global_begin(); G!= M->global_end() ; G++, i++){
errs() << i << " == > " ;
errs().write_escaped(G->getName()) << "n";
}
// iterate through each instruction. module->function->BB->Inst
for(auto &F_ : M->functions()){
F = &F_;
for(auto &B_ : *F)
B = &B_;
for(auto &I : *B) {
for (unsigned i = 0; i < I.getNumOperands(); i++)
std::cerr << I.getOperand(i)->getName().data() << std::endl;
}
}
return true;
}
private:
Module *M;
Function *F;
BasicBlock *B;
};
}
char StructModulePass:: ID = 0;
static RegisterPass<StructModulePass> X("getstructnamesize", "Get All Struct Names and Sizes",
false /* Only looks at CFG */ ,
false /* Analysis Pass */);
我想创建一个数据库,包含我的程序中定义和使用的所有结构(全局和本地)。例如< A , <int32, int32> , B , <int32, bool , char *>>.
我已经浏览了doxygen页面、LLVM教程,并检查了我们是否可以获得结构值,但在不知道结构值的情况下,我无法找到提取结构的方法,例如创建IRBuilder、插入预定义的IntTy32类型变量。这方面的任何帮助或一些相关教程都将有助于
在LLVM IR术语中,"全局"是全局变量或全局常数。此行:
%struct.A = type { i32, i32 }
是一个已识别的结构规范,而不是全局变量,就像C++中的typedef
不是全局变量一样您可以使用Module::getIdentifiedStructTypes()
对其进行迭代。
然而,一些注意事项:
熟悉
dump()
方法。这是一个比cerr
的所有打印更容易的替代方案。你在值上使用
getName()
,而不是在类型上-我不认为这是你想要做的。还要记住LLVM值不一定有名称。像
<int32, bool, char *>
这样的结果——它们是C++类型,而不是LLVM IR类型——将是缓慢的。例如,Clang可能会将bool
和char
都编译为i8
,并且很难区分。您还可能得到vptr字段、填充字段等。如果您确实想要源程序中使用的结构的实际C++结构,则必须依赖调试信息。
相关文章:
- 使用不带参数的函数访问结构元素
- 访问类lintalizer列表中的结构元素
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 结构元素名称要 cout?
- C++结构元素(成员变量)的数量
- 如何在类中声明静态 const 结构元素
- 在地图中搜索结构元素
- 在C++中传递结构数组 - 被调用函数中不存在结构元素,如何正确传递向量?
- 结构元素C 的枚举
- 将结构元素地址设置为C 中的null(单链接列表)
- OPENCV:为击中创建一个正方形结构元素
- 如何将结构元素传递给异步线程
- C - 基于另一个元素对结构元素进行排序
- 无法从传递到 pthread 的结构中访问结构元素
- 矢量的打印结构元素
- C结构元素对齐(ansi)
- 用3x3结构元素进行两次形态扩张,等于用6x6结构元素进行一次形态扩张
- 创建结构元素的动态数组,然后创建该结构的动态数组.C++
- 访问地图数据结构中的结构元素
- 尝试在文本文件中添加结构元素而不覆盖它