是否有任何api可以通过llvm Transformation Pass初始化我的自定义类对象?如果不是,实现此目标的最佳策略是什么?

问题描述 投票:3回答:1

我正在实现llvm转换过程。在某种程度上,我需要初始化我的自定义类对象并调用其方法。举例来说:

 Foo* foo = new Foo(3);                   
 foo->createSomething(attrCount, foo)

我需要插入这些说明。我该怎么办?我认为我必须先使用AllocaInst,然后使用IR Builder创建函数调用。但是直到现在我还是无法掌握它。

llvm llvm-ir llvm-c++-api
1个回答
0
投票

不是LLVM或Clang的专家,但我没有找到可用于此类适应的任何LLVM官方api,但我认为有一种间接的方法可能有助于解决您的问题。

AFAIK,您应该插入clang发出的IR中的说明。这可能很麻烦,因为您需要处理一些符号,例如FoonewcreateSomething

llvm::TypeFinder对于查找指定的“类”类型很有用,实际上,类类型表示为StructType,您可以使用getName来查找所需的类型。

对于一个函数,通常需要它的名称才能得到getFunction,但是名称在IR中被修饰,因此您应该首先获得该函数的修饰名称。众所周知,LLVM没有提供这样的接口来处理名称,因此您必须手动进行操作。例如,libclang中的clang_Cursor_getMangling可以在AST中获取错误的名称(在libclang大声笑中获取AST非常容易)。

最后,最后一步是使用IRBuilder创建一些完成较大工作的指令,例如CreateAllocaCreateCall等。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.