问题标签 [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 回答
1784 浏览

llvm - 如何从函数中获取调试信息?

我使用 Clang 编译了一个启用了调试信息的函数。对于Instructions 来说有方便的getDebugLoc(),但对于 s 没有这样的东西Function。给定一个Function实例,我怎样才能得到它的调试信息(我猜是DISubProgram形式)?

我已经看到指南条目解释了如何表示调试信息,并且元数据确实包含返回该函数的链接,但显然没有返回链接。我应该遍历模块中的所有元数据吗?

0 投票
1 回答
888 浏览

c++ - 将几个 LLVM C++ 模块链接在一起 lli 中的段错误

我正在尝试一个非常简单的 LLVM/clang 示例,但似乎失败了。

我尝试以下方法:

  1. clang++ -emit-llvm -c -x c++ -o main.bc -isystem include/main.cc
  2. clang++ -emit-llvm -c -x c++ -o test_class.bc -isystem include/test_class.cc
  3. llvm-link main.bc test_class.bc -o all.bc
  4. lli all.bc

但是,4. 失败(段错误):

我对这应该如何工作有根本的误解吗?我的最终目标是使用 libclang API 进行编译部分,但现在了解我在这里做错了什么会很棒!谢谢!

我附上了以下示例的源代码:

包括/test_class.h:

test_class.cc:

主.cc:

0 投票
2 回答
10462 浏览

llvm - LLVM 尾调用优化

以下是我对事物的理解:

当调用自身是函数“f”的最后一个操作时,函数“f”是尾递归的。通过形成循环而不是再次调用函数可以显着优化尾递归;函数的参数被更新到位,并再次运行主体。这称为递归尾调用优化。

LLVM 在使用 fastcc、GHC 或 HiPE 调用约定时实现递归尾调用优化。 http://llvm.org/docs/CodeGenerator.html#tail-call-optimization

我有一些问题:让我们考虑这个愚蠢的例子:

1)在他们的例子中,关键字“tail”在调用之前。在其他地方我读到这个关键字是可选的。假设上面的函数被适当地翻译成 LLVM,最后几行是否需要

2)在他们的例子中 inreg 选项的含义是什么?

3) 我不想到处执行尾调用优化,只针对递归函数。有没有办法让 LLVM 只对递归函数执行优化(如果可用)?

0 投票
1 回答
971 浏览

llvm - LLVM 的 SelectInst 的好处

LLVM 有一个SelectInst用于表示诸如something = cond ? true-part : false-part.

IR 中的这条指令有什么好处,因为编译器?:也总是可以将其降低为 a ?BranchInst是否有支持此类指令的 CPU?还是被selectCodeGenerator 降为跳跃?

我认为分析通过可能有好处,因为它select保证了隐含的两个“分支” if。但另一方面,编译器根本不需要使用该指令,所以这些passbr无论如何都必须能够处理s。

0 投票
2 回答
786 浏览

c - 为什么 LLVM IR 结构中的函数指针字段被 {}* 替换?

我使用 Clang 3.3 编译了 MUSL C 库,并转储了生成的 LLVM IR 文件。我发现 FILE 结构

被编译为

在一些 IR 文件中,但被编译为

在其他源文件中。这两个 IR 结构之间的唯一区别是第一种形式的函数指针类型字段被替换为 {}* 而不是其完整类型。谁能告诉我为什么会发生这种情况以及如何禁用 {}* 替换?

0 投票
1 回答
1325 浏览

llvm - 将 LLVM IR 转换为其他语言代码

我想将 LLVM IR 转换为类似 C 的语言(我们可以说是玩具 C 语言),其语法类似于 C 并带有一些新关键字。我知道我必须为此编写很长的代码。可是我不知道怎么办?

任何人都可以指导我吗?或者是否有一些教程之类的东西可用,以便我可以从中获得帮助。

提前致谢

更新1

我遇到了一个链接,解释了为 Kaleidoscope 构建 LLVM IR, 如果我可以获得将这个 IR 转换回代码的教程,它将提供很多帮助

0 投票
1 回答
2132 浏览

c - 将 LLVM-IR 转换为类似 C 的语言

我正在做一个项目,我必须编写将 LLVM-IR 转换为类 C 语言的代码。这种语言的结构与 C 非常相似。在做了一些调查后,我发现 LLVM 的 3.0 版本之前存在一个名为 CBackend.cpp 的文件,负责将 LLVM-IR 转换为 C 代码。我要检查的是在我的 LLVM-IR 输入文件上运行这个 CBackend.cpp 文件并生成 C 代码。

执行此操作的命令是:llc -march=c -o code.c code.ll

其中 code.ll 文件是包含输入 llvm-ir 的输入文件,code.c 是包含生成的 C 代码的输出文件。

我面临的是,我的 ubuntu 系统上安装了 LLVM 版本 3.4svn,并且此版本中没有 CBackend.cpp 文件,因为该文件已升级为 CppBackend.cpp(将 LLVM-IR 转换为 C++)。我可以使用哪个命令在我的 LLVM-IR 输入文件上运行此 CBackend.cpp 文件以获取 LLVM 版本 3.4svn 中的相应 C 代码?

提前致谢。

0 投票
2 回答
2601 浏览

c++ - LLVM的内存布局中的向量和数组有什么区别?

我有一个数组和一个向量,它们都保存相同的数据,例如 0、1、2、3、4。然后我使用 GEP 获取数组的 ptr,

所以,%0 是 %arr 指向的数组中第 4 个元素的指针,%1 的值为 3。

但是现在,我将指向向量的指针比特转换为指向 i32 的指针:

和:

我不确切知道数组和向量之间的内存布局是否有任何差异。如果没有区别,我认为从向量中获取元素的方式是可以的。那么,我这样做是否正确?

0 投票
0 回答
142 浏览

llvm - 使用 LLVM 进行转换

我正在做一些项目,通过先将 C+ACSL 语言转换为另一种语言,先将其转换为 LLVM IR,然后再将其转换为另一种语言。这个我说不上来,因为和一群不想公开的人有关,所以我们就不说了,但是和C很接近。我已经完成了LLVM IR的工作,也有在 CBackend 的帮助下编写将其转换回来,但我真的不知道如何使用它,这意味着我应该如何将它运行到我的 LLVM IR 中。LLVM 中是否有用于执行此操作的命令,或者可以帮助我的东西。

更新 1 我的输入是 LLVM IR,输出将是类似 C 的代码,而不是 C,因为它将遵循与 C 不同的语法。

0 投票
1 回答
102 浏览

llvm - GetElementPtr 会按预期工作吗

我正在使用 C++ 编写 llvm 代码。我的代码中有一个地方发生了以下情况

我正在尝试计算相同的地址,该地址应在第 7 行和第 8 行中两次指向相同的数据类型,但地址参数值不同。这样做是否安全或会导致不确定的结果?