llvm - 是否有任何 api 可以使用 llvm 转换传递来初始化我的自定义类对象?如果没有,实现这一目标的最佳策略是什么?
问题描述
我正在实现一个 llvm 转换通道。在某些时候,我需要初始化我的自定义类对象并调用它的方法。比如说:
Foo* foo = new Foo(3);
foo->createSomething(attrCount, foo)
我需要插入这些说明。我该怎么办?我想我必须使用 AllocaInst,然后使用 IR Builder 创建一个函数调用。但直到现在我都无法得到它。
解决方案
不是 LLVM 或 Clang 专家,但我没有找到任何 LLVM 官方 api 可以用于这种适合,但我认为有一种间接方法可能有助于解决你的问题。
AFAIK,您应该插入类似于 clang 发出的 IR 中的指令。这可能很麻烦,因为您需要处理一些符号,Foo
例如new
和createSomething
。
llvm::TypeFinder
查找指定的“类”类型会很有用,实际上类类型表示为 StructType,您可以通过 getName 找到您需要的类型。
对于一个函数,通常你需要它的名字来getFunction,但是名字在IR中是错位的,所以你应该首先得到函数的错位名称。据我所知,LLVM 不提供这样的接口来修改名称,因此您必须手动进行。例如,clang_Cursor_getMangling
在 libclang 中可能能够在 AST 中获取损坏的名称(在 libclang 中获取 AST 非常容易,哈哈)。
最后,最后一步是使用IRBuilder
创建一些指令来完成大工作,例如CreateAlloca
、CreateCall
等。
希望这可以帮助。
推荐阅读
- python-3.x - 将文件路径保存到变量时出现语法错误
- vagrant - vagrant up 不运行进度状态:E_INVALIDARG VBoxManage.exe:错误:设备导入失败
- azure - Azure 自动化 Runbook 缺少必需参数
- excel - 条件格式,如果不包含 x 或 y 则格式化?
- javascript - 从文件中解析js表
- sql - 通过表和其他表执行搜索与 SQL Server 中的外键连接的内容以及如何对数据进行排序
- python - PyGObject 是 Windows 和 Linux 上 Tk 的良好替代品吗?
- symfony - Symfony 4 使实体重新生成:没有变化
- python - 将 argparse 帮助发送到其他地方
- node.js - mongodb:虽然它在 shell 中工作,但不能将属性设置为 null