问题标签 [llvm-ir]

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.

0 投票
1 回答
3509 浏览

assembly - LLVM 和编译器命名法

我正在研究 LLVM 系统,并且已经阅读了入门文档。但是,一些命名法(以及 clang 示例中的措辞)仍然有些混乱。以下术语和命令都是编译过程的一部分,我想知道是否有人可以为我更好地解释它们:

  • clang -Svs. clang -c(我知道是什么-c,但结果有何不同?)* (编辑)
  • LLVM Bitcode 与 LLVM IR(有什么区别?)
  • .ll 文件与 .bc 文件(它们是什么,它们有何不同?)
  • LLVM 汇编代码本机汇编代码(有区别吗?)

在更高的层次上,我了解整个编译过程,并且可以很好地跟踪我的方式,我只是卡在某些点上,例如,我希望看到“IR”,但看到的是“bitcode”或 LLVM 程序集”,这让我认为我几乎没有像我应该的那样理解它们!

0 投票
1 回答
758 浏览

function - C++如何调用IR函数

我有一个 C++ 文件,它具有一些功能,例如:int myMax(int a,int b),并将其编译为 llvm IR。现在我想在另一个 C++ 文件中操作 IR,我不知道如何调用我的 C++ 文件中的函数(例如:myMax)。

0 投票
1 回答
2338 浏览

llvm - LLVM IR:有效地对向量求和

我正在编写一个生成 LLVM IR 指令的编译器。我正在广泛使用向量。

我希望能够对向量中的所有元素求和。现在我只是单独提取每个元素并手动添加它们,但令我震惊的是,这正是硬件应该能够提供帮助的事情(因为这听起来像是一个非常常见的操作)。但似乎没有内在的做到这一点。

最好的方法是什么?我正在使用 LLVM 3.2。

0 投票
0 回答
1127 浏览

javascript - 是否有 Javascript LLVM IR 位码解释器?

我正在尝试在浏览器中运行现有的 C 项目而不依赖插件/插件/等。源为 3MB,生成的编译位码(llvm-link)为 3.5M。

使用 lli 运​​行 bitcode 时,内存使用量约为 150MB,与编译本机 ELF 二进制文件并运行它时相同。

Emscripten (-O2 --closure 0) 将位码编译为 24MB .js 文件,当使用 Node.js 运行该文件时,我的内存不足(顶部显示大约 2GB 的内存使用)。

正如 jslinux 演示所示,应该可以解释本机代码。可以说,以可接受的性能解释编译的位码应该更容易。我的问题是是否有任何项目试图在 javascript 中解释 LLVM IR(而不是将 IR 翻译为 javascript,如 Emscripten、mandreel 和其他人所做的)。

0 投票
1 回答
807 浏览

python - llvm 中的虚拟表 (llvm-py)

我正在使用 llvm-py 为一些人工创建一个 DIY 编译器,并且需要在全球范围内有一个虚拟方法表。我的概念是有几个函数指针数组(每个类一个)。不幸的是,没有用于全局范围的 LLVM IR Builder,我不能使用 ptrtoint 来获得所有数组元素的统一类型(否则我会将函数地址存储为 64 位整数并在调用之前将它们转换为适当的类型)。你知道任何合理的解决方案吗?也可以用 C++ LLVM api 来说明,因为 llvm-py 非常相似。

0 投票
1 回答
1037 浏览

llvm - 如何查找 llvm::Instruction 是否在流控制中?

使用 LLVM,我试图找出流控制(if/switch/for)等中是否存在指令,我必须在 IR 级别执行此操作。伪代码如下所示。

我正在查看函数的 SCC,但我不确定如何推断指令是否存在于流控制中。

以这个 IR 的 Kaleidoscope 示例为例。

所以在上面的 IR 中,假设我想找出对函数 foo 的所有调用。因此,在入口块中,我们有一个使用 %0 的调用和一个在 then: 块中的调用,我们对 foo 进行了另一个调用,最后一个在 ifcont: 块中。

所以问题是,虽然 then: 块中的调用落在 if 块生成的代码中,但我该如何推断呢?即 entry 块和 ifcont 块将被执行,但是 then: 块不一定会根据条件执行。

有人可以给我一些指示吗?谢谢

编辑:再想一想,支配树可能有助于确定这一点,但我还没有这方面的算法。

0 投票
2 回答
1660 浏览

perl - Perl 是否有 LLVM 后端?

我有一个用 C 编写的项目,我希望将其转换为 Perl。我的一个朋友建议使用 LLVM。我使用 Clang 将我的 C 代码编译为 LLVM 程序集。现在我正在尝试将此中间表示转换为 Perl,但我似乎找不到任何后端。有人会指出我正确的方向吗?

0 投票
0 回答
234 浏览

c++ - llvm 中的内存合并分析

我正在尝试使用 LLVM 分析通道对程序执行合并分析。

基本上,我需要查看数组访问并确定内存访问是否可以合并,即访问表达式是否相对于归纳变量是单调的。

我面临以下问题。数组访问用 LLVM IR 中的 getelementptr 指令表示。我怎样才能从那里重建表达式?

如果无法使用静态分析,我也愿意执行动态分析。

如果有帮助,我正在尝试实现以下算法:

0 投票
1 回答
2019 浏览

types - 在 LLVM 中定义新类型

在一个非常简单的 LLVM IR 程序中,我可以做到

但是,我无法弄清楚如何使用 LLVM C++ API生成相同的%MyStruct = type { i32 }or语句。%MyInt = type i32在过去的几天里,我一直在搜索文档,我发现唯一接近我想要的就是手动定义一个新类型,如下所述:http: //llvm.org/docs/ExtendingLLVM.html #添加新类型

但是,我想要一种使用 LLVM C++ API 定义和使用新类型的方法,就像我可以使用函数等一样。

我能想到的唯一另一种方法是单独记录我的自定义类型和它们的 LLVM 原始基类型,并且在声明函数时,使用原始基类型;但如果 LLVM 本身内置了一种更快的方法,我不想开始这样做(正如我通过查看一些 LLVM IR 示例并生成上面的代码发现的那样)。

编辑:我做了更多的环顾四周,我发现一个函数的引用似乎正是我需要addTypeNamehttp://llvm.org/docs/ProgrammersManual.htmlhttp:// llvm.org/doxygen/Module_8h-source.html,但是这似乎是全部,因为我addTypeName在实际文档中看不到任何参考,并且我无法使用它编译程序,addTypeName因为它声称该方法不存在。

0 投票
1 回答
3864 浏览

llvm - llvm 中没有生成基本块终止符

我对 llvm 很陌生,只在这里做了在线教程:http: //llvm.org/docs/tutorial/LangImpl1.html 现在我想做我自己的小语言并遇到了一个小问题。我想解析这个:

它应该做两件事:

  1. 定义一个返回 1 的新函数
  2. 返回一个值,以便它可以用作表达式

该函数已正确创建,但我在将其用作表达式时遇到了问题。AST 看起来像这样:

该函数的代码创建代码如下所示:

DefExprAST 像这样:

给出以下verifyFunction错误:

事实上,生成的函数没有 ret 条目。它是空的:

But RetVal is correctly filled with an double and Builder.CreateRet( RetVal ) gives back the ret statement but it doesn't get inserted into the entry.