问题标签 [llvm-c++-api]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将适当的 PHI 节点添加到 llvm-ir
我有以下情况:
A,B,C,D,E,F
所有基本块在哪里,|
是一个向下的箭头。
现在,B
我将有一些 def ,例如%mul = ...
,稍后将在相应的左侧块中使用E
,例如... = %mul ...
. 我插入了适当的控制流——要么只采用左分支,要么只采用右分支,问题是我Instruction does not dominate all uses
在验证通过时出错。
我尝试通过添加PHINode
说明来解决此问题,如下所示:
省略号用来隐藏不相关的细节,我也重命名了块,但核心逻辑应该在那里。正如你所看到的,我已经用适当的调用替换%shl
了PHINode
使用replaceAllUsesWith()
。
但是,现在我收到以下新错误:
我怎样才能解决这个问题?
llvm - 指针所有权语义,在 LLVM 中附加调试信息和“未签名”使用
我最近开始为我的项目使用 LLVM IR 生成 API。文档和 LLC 工具非常有用,但我无法找到以下问题的答案 -
问题 1 - 指针所有权语义
所有使用其 API 创建 LLVM IR 指令的代码似乎都是“新”指令,而不是将它们创建为堆栈变量。
我想知道创建的指针的所有权语义是什么?我是否必须对这些指令对象调用删除。我见过的所有代码都称为“删除引擎;”。
我猜所有这些内存都归这个 Module 对象所有,当模块被销毁时,这些指令占用的所有内存也被销毁。通过查看一些代码,似乎所有这些指令对象都是使用“placement new”创建的……这种理解正确吗?
问题 2 - 为什么 LLVM IR API 采用“无符号”数据类型参数。(例如,无符号地址空间是一个常见的论点。为什么不是像 uint32_t 这样的大小类型?)
问题 3 - 如何将调试信息附加到 IR 指令?指向 LLVM API 以附加调试信息的指针将非常有用。
llvm - 与手动构建 IR 代码相比,LLVM Builder 的优势是什么?
我是 LLVM 的新手,正在尝试学习基础知识,这本身就够难了。
我现在已经到了尝试用 IR 编写简单程序的地步。该文档对 IR 代码的语法和用法非常清楚。现在,我已经完成了 2 或 3 个教程,当然也被介绍到了构建器框架。然而,这是相当复杂的。
首先,构建器系统有两个接口,C++ 和 C 接口。乍一看,两者似乎都提供了相同的功能。出现的第一个问题当然是,应该使用哪一个?一个比另一个有优势吗?是口味问题吗?我无法找到答案,所以我决定使用 C++ 接口。
坦率地说,这个构建器框架更难理解。所以现在我不仅面临学习 IR 代码以及如何正确使用它,而且在它之上还有构建器界面,这让事情变得更加混乱
例如:根据我对基本 IR 语言的学习,我会天真地去写类似的东西:
这很清楚。我只花了 3 个小时找出如何使用构建器框架来做到这一点,而我的答案甚至不令人满意,因为我必须首先使用 alloca 调用分配存储,然后留下通过指针写入的代码。
我的理解是,IR 语言和底层 SSA 系统应该使用上述伪寄存器,而不是使用我的代码显式分配的内存地址。
因此,经过相当多的实验后,我认为在我的程序中手动生成 IR 代码可能会更好、更容易。
我的问题是:在 IR 构建器框架中是否有任何主要优势,使得使用它而不是手动方法是非常可取的?或者它只是应该更容易使用,仅此而已?
谢谢
llvm - 我将如何在 LLVM 构建器框架中创建此序列?
我正在学习 LLVM 基础知识。我正在尝试进入构建器框架并设置了模块、函数头等,但我还没有找到一种方法来在构建器中创建这样的简单序列:
意思是如何通过构建器框架使用伪寄存器表示法?
我试图创建一个基于两个常量的加号指令。我用来生成(整数)加法的核心线是:
这包含很多我自己的功能,但我想基础很清楚。我得到一个左右操作数的值指针,它们都是常量,然后使用构建器框架创建一个添加操作。再次正确设置了模块和构建器,当我调用 dump() 时,我看到了我所做的所有其他事情,但上面的这一行没有创建任何 IR 代码。
我希望它共同创造类似的东西
或类似的东西。我是否误解了与构建器一起构建操作的方式的基本原理,还是只是对某些细节的一些小疏忽?
谢谢
llvm - 将元数据与分析过程中的 LLVM 基本块相关联
如何存储在自定义 LLVM 分析过程中生成的每个基本块信息,以使其在未来的优化过程中可用?
例如,假设我正在派生类FunctionPass
来实现活性分析。这个过程将产生集合LiveIn
和LiveOut
函数中的每个基本块。我应该在哪里声明这些集合以供其他 LLVM 通行证将来使用?我怎样才能让它们直接从它们关联的 llvm::BasicBlock 数据结构中访问?
llvm - LLVM - 如何获取指令的结果变量
我是 LLVM 的初学者,我有一个简单的问题,但我在文档中找不到解决方案。
我正在做一个计算指令的函数传递,为此我需要指令中的所有“数据”,我的意思是运算符、所有操作数和结果。
我的问题是,我无法获得结果变量。例如,对于指令:
我可以有x和y名称和变量,我可以有操作码,我可以有add1名称,但是,我不能有add1变量。
我从文档的说明页面中阅读了所有功能,但找不到任何看起来像我正在寻找的东西。
那么可以解决我的问题的正确 API 是什么?
llvm - 在 LLVM IR 中查找 GlobalValue 的 DILocation?
我有一个 GlobalValue,我想为其查找 DILocation。我可以看到元数据存在,但找不到明显的查找路径来获取它。对 llvm::Instruction 做同样的事情很容易,但这并不明显。
c++ - 尝试编译第 8 章的输出时出现 LLVM 教程 3.6 链接器错误
我正在学习 llvm 教程: http: //llvm.org/releases/3.6.0/docs/tutorial/index.html
第 8 章的代码编译得很好并发出 IR,但是我无法编译发出的 IR。代码清单是复制和粘贴的,以减少我在某处的代码中出现拼写错误的机会。我唯一修改的是 build 命令,因为 llvm-config 默认为旧版本。构建命令:
运行它(我从原始命令中删除了 & ,因为这似乎会引发错误):
输出如下所示:
llvm - AU.addRequired 崩溃(); 在 LLVM 通行证中
我有一个简单的函数传递,我试图在代码中获取循环信息。但是当我尝试在 getAnalysisUsage() 中添加 AU.addRequired() 时,模块崩溃了。这甚至在调用 getAnalysis() 之前就会发生。它是动态加载的通行证 (.so)。
这是堆栈跟踪。
我错过了什么吗?任何帮助,将不胜感激。
c++ - 运行时的 C++ 去虚拟化?
是否有技术/库允许具有类层次结构(具有函数)的灵活性,但一旦在运行时virtual
确定对象类型,就允许函数调用的虚拟化?
举一个简单的例子,假设我有一个程序从某个配置文件中读取形状类型(圆形、矩形、三角形等),以构建所述形状的某种数据结构(例如,vector<shape*>
):
显然,如果我想绘制所有的形状,我可以这样做:
每次完成这样的迭代时,都会调用shapes
一个virtual
函数来调用draw()
每个形状。
但是假设一旦shapes
创建,在程序的整个生命周期内都不会再改变;并进一步假设这draw()
将被多次调用。如果知道实际形状后,有一种方法可以draw()
在运行时“去虚拟化”对 的调用,那就太好了。
我知道在编译时virtual
去虚拟化函数调用的优化技术,但我不是在问这个。
如果有一个聪明的技巧可以直接在 C++ 中执行此操作,我会感到非常惊讶,因为这样做的一种方法是在运行时修改内存中的机器代码。但是那里有一些 C++ 库可以实现这样的事情吗?
我想这样的事情可能通过 LLVM 成为可能,因为它允许在运行时生成机器代码。有人为此使用过 LLVM 吗?也许是一个分层在 LLVM 之上的框架?
注意:解决方案必须是跨平台的,即至少使用 gcc/clang和VC++。