问题标签 [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 投票
3 回答
10128 浏览

llvm - 从 c 程序调用 LLVM Jit

我已经使用 llvm.org 上的在线编译器生成了一个 bc 文件,我想知道是否可以从 ac 或 c++ 程序加载此 bc 文件,使用 llvm jit 执行 bc 文件中的 IR(以编程方式在c程序),并得到结果。

我怎样才能做到这一点?

0 投票
1 回答
2154 浏览

linker - 使 LLVM 内联一个库中的函数

我正在尝试LLVM从库中内联一个函数。

我有LLVM 位码文件(手动生成),我llvm-link用. 我设法将所有内容链接在一起并执行,但我无法从库中内联函数。关于如何做到这一点的任何线索?clangllvm-arLLVM

0 投票
4 回答
14425 浏览

assembly - 是否可以直接使用 LLVM 程序集?

我已经阅读了一些关于 llvm 的网页和文章,我对这个项目很感兴趣。(也许可以学习一些关于编译器编写的知识,而不需要与 x86 的复杂点作斗争)。

有一些页面描述了如何编写 llvm 程序集以及如何组装它,但我没有找到任何关于实际执行这些程序需要什么样的环境的信息。我知道我可以在我的文件上运行 llvm-gcc 以获得在 C 上下文中可执行的目标文件。但是在我不想使用 C 运行时环境(libc.so和朋友)的情况下,运行 llvm 代码需要什么?有这方面的文件吗?

0 投票
2 回答
4573 浏览

compiler-construction - 如何在 LLVM IR 中高效地实现闭包?

我开始在使用 LLVM 作为后端的语言中添加闭包(lambdas)。我已经为简单的情况实现了它们,它们总是可以内联,即不需要生成闭包定义本身的代码,因为它在使用的地方被内联。

但是如果闭包并不总是内联(例如,它被传递给另一个没有内联的函数),如何为闭包生成代码。最好,调用站点不应该关心它们是否传递了常规函数或闭包,而是将它们作为正常函数调用。

我可以生成一个具有合成名称的函数,但它必须将引用环境作为一个额外的参数,并且该函数不能只传递给另一个不知道所需额外参数的函数。

我已经想到了一种使用 LLVM 的蹦床内在函数的可能解决方案,它从函数中“删除”单个参数,返回一个指向蹦床函数的指针,该函数需要一个更少的参数。在这种情况下,如果为闭包生成的函数将引用环境作为第一个参数,我可以删除它并取回一个函数,该函数的参数与闭包实际声明的参数完全相同。这听起来可行吗?高效的?有没有更好的解决方案?

代码示例:

现在,让我们假设 this 不会被内联到def main() = 3 + 4 + 5,并且applyFunctionTo可能会单独编译,并且我们不能在那里更改调用站点。使用蹦床,我想生成的代码会是这样的(用伪代码表示,* 表示指针):

这看起来对吗?

0 投票
2 回答
1479 浏览

llvm - 通过llvm的Dead Code Elimination pass移除一条指令

我在 LLVM 中的传递会生成IR这样的结果:

由于or实际上不需要该指令(死代码),我将所有出现%7%5. 现在,该or指令应该被删除。我可以从我的通行证中调用LLVM 的死代码消除通行证,还是有什么方法可以删除该or指令?

0 投票
3 回答
3692 浏览

compiler-construction - llvm IR 代码中标签的表达

有时我发现 llvm IR 中的标签标识符以逗号“;” ; <label> 6 开头,但是据我所知,逗号用于注释。那么llvm如何检索评论中的标签信息呢?我错过了什么吗?
接下来是一个简单的测试。
C源文件:

http://llvm.org/demo/index.cgi生成的 llvm IR 代码(与 clang -c -emit-llvm main.c 相同)如下:

0 投票
2 回答
4064 浏览

llvm - 可以从 LLVM-IR 自动生成 llvm c++ api 代码吗?

clang 3.0 在线演示页面http://llvm.org/demo/index.cgi提供了一个输出 LLVM C++ API 代码的选项,表示输入程序的 LLVM-IR。

“生成 LLVM C++ API 代码”是否输出一个 clang 选项(如果是,它是什么)?

或者它是一个 llvm 工具选项(哪一个)?

除了 LLVM-IR 输入之外,是否可以做同样的事情?基本上,我希望看到生成特定给定 llvm-ir 序列所需的正确 llvm c++ api 调用。我想通过示例向后学习,而不是从文档中向前学习。

clang、llvm-as 和 llvm-dis 的手册页和 --help 和 --help-hidden 没有显示任何明显的内容。

编辑:好的,现在我在该网页的输出中看到“由 llvm2cpp 生成”。但是我在最近的 llvm 版本中找不到该工具,只有旧版本,2.9 和 3.0 中的新工具接管了 llvm2cpp?

0 投票
5 回答
3385 浏览

compiler-construction - 编译器输出语言 - LLVM IR vs C

对于编写编译器,将 LLVM IR 与 C 用于目标语言的优缺点是什么?我知道两者都被使用了,我想如果我使用 clang 编译 C,最终的机器代码会是相似的。那么还有什么其他的事情需要考虑呢?

0 投票
3 回答
38472 浏览

llvm - PHI 指令究竟做了什么以及如何在 LLVM 中使用它

LLVM 有phi指令,解释很奇怪:

'phi' 指令用于实现 SSA 图中表示函数的 φ 节点。

通常它用于实现分支。如果我理解正确,则需要进行依赖性分析,在某些情况下,它可以帮助避免不必要的加载。但是,仍然很难理解它到底做了什么。

万花筒示例很好地解释了它的if案例。但是,如何实现&&和之类的逻辑操作还不是很清楚||如果我在在线 llvm编译器中键入以下内容:

最后几行完全让我感到困惑:

看起来 phi 节点产生了可以使用的结果。而且我的印象是 phi 节点只是定义了来自哪些路径值。

有人可以解释什么是 Phi 节点,以及如何使用它来实现||吗?

0 投票
1 回答
4028 浏览

c++ - 如何在 LLVM IR 中获取字符串文字的值?

我是 LLVM 新手。我正在尝试编写一个基本 Pass 来检查printf调用的参数,当它被赋予中间表示时。
如果格式字符串不是字符串文字,那么我当然无法检查它。但很多时候,确实如此。

我要检查的示例 IR 是:

我发现了预先存在的 Pass ExternalFunctionsPassedConstants,这似乎很相关:

所以我添加了代码:

到目前为止,一切都很好——我看到类型 ID 是 14,这意味着它是一个PointerTyID.

但是现在,我如何获取作为参数传递的字符串文字的内容,以便我可以根据实际给出的数字验证预期参数的数量?