问题标签 [llc]

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 回答
191 浏览

clang - 尝试使用 clang 编译代码时出错

我正在运行 Ubuntu 18.04。我正在尝试编译 llvm 代码,使用:llc-7 prog.ll -o prog.s然后clang-7 prog.s lib.a -o prog.exe. 如果您认为有帮助,我可以提供任何代码。我很确定图书馆的有效性lib.a。我也尝试过 clang 版本 6。
运行 clang 时,使用-v我得到的参数:

到目前为止,谷歌搜索并没有帮助我。你有什么建议吗?
如果我需要澄清任何事情或提供更多信息,请通知我。

0 投票
1 回答
120 浏览

c++ - 如何直接从 LLVM 源代码树中使用新编译的 LLVM 工具?

我正在编写一个MachineFunctionPass针对 X86 架构的代码,这会导致修改后的llc二进制文件。

为了测试我的修改版本,llc我创建了一堆.c程序,它们的 MIR 将由我的 pass 处理。

为了简洁起见,我已将包含源代码的目录直接添加到 LLVM 的源代码树中,特别是在$llvm_src_dir/lib/Target/X86/$examples_dir: 然后我通过将add_subdirectory()指令附加到$llvm_src_dir/lib/Target/X86/CMakeLists.txt.

通过这种方式,我将能够直接从 LLVM 的构建目录构建所有内容。

现在:如何在我的指定$examples_dir/CMakeLists.txt使用 LLVM 的 in-tree llc

源码树结构

这是源的目录结构。我省略了所有根目录的子目录,因为我只包含了“有趣的”。

LLVM 定义了llc目标,tools/llc而我的源在目录中的位置更深,如下图所示:

lib/Target/X86/CMakeLists.txt

这就是我编辑CMakeLists.txt目标架构的方式:

我已经尝试过的

我目前正在使用find_path()查找llc,但这需要llc已经编译,因此CMakeLists.txt如果我不llc事先编译,我的示例将无法通过验证。

假设路径存在,我最终在我的中使用了一个指令add_custom_command(),但在我看来这太hacky了。llcCMakeLists.txt

基本上,我需要将目标添加llc为我的目标的依赖项,然后使用llc“路径将我的示例”.bc文件编译成.s.

有任何想法吗?

非常感谢!

0 投票
1 回答
51 浏览

llvm - 如何从 MachineInstr 中检索指令的反汇编?

我需要调试MachineFunctionPass我正在开发的。我的目标是x86架构。

如何从MachineInstr实例中检索目标反汇编?

示例MachineInstr表示

预期反汇编(Intel 语法)

0 投票
0 回答
300 浏览

llvm - 如何让 LLVM 选择输出 MIR 以传递给 llc?

我需要将 MIR 文件传递​​给 LLC,以便我可以使用 -run-pass 选项,但我找不到任何关于从 opt 输出为 MIR 的信息。我怎样才能做到这一点?

0 投票
1 回答
42 浏览

llvm - llc 抛出错误:constexpr 需要整数操作数

我一直在尝试使用 llvm 进行代码生成。我目前正在尝试为变量声明生成 IR。这是一个例子:

let sum: float = 8 * 3 * 4 + 6 * 9;

当我为此生成 IR 时,这就是我得到的:

首先,这看起来很混乱,我相信这可以更有效地完成。但我认为我可以稍后通过优化来修复它。我的问题是在测试中看看它是否有效。我试过了:

llc my_ir

哪个抛出:

我不太明白这个错误信息,但听起来它不能乘以浮点数?这里发生了什么?

0 投票
1 回答
82 浏览

arm - 无法组装 llc 使用 arm-none-eabi-as 生成的 .s 文件?

我的英语水平很差,因为我不是以英语为母语的人。

我使用 llc.exe 编译了一个位码并获得了一个 .s 文件(test.s)。我用来创建 test.s 的命令如下。

是的,我的目标板是 cortex-m3(stm32l 系列),我创建了如下的 makefile 来创建 .bin 文件。

生成文件很简单。它的目标是从 test.s 文件创建 test.bin。

test.s 文件如下。我创建了 test.s 文件

到这里为止,一切都很顺利。在这里,我执行了 make.exe 来创建 test.bin,但出现如下错误。

在此处输入图像描述

不知道llc.exe生成的.s文件是不是不是cortex-m3的格式。

有人可以帮助我吗?我想知道问题的原因是什么。

谢谢阅读。

- - - - - - - - - - - - - - - - 更新 - - - - - - - - - -----------------

原始代码如下。代码只是为了测试目的而编写的。

位码如下。位码是手动生成的。

0 投票
1 回答
33 浏览

llvm - 编译 opencl 内核时出现非法 BitCast

下面的 bitcast 指令向我抛出了 Illegal Bitcast 错误,有人可以指出问题所在吗?

0 投票
1 回答
167 浏览

llvm - 通过修改 LLVM Backend 来破坏 X86 注册

我正在尝试稍微改变 X86 目标的 LLVM 后端,以产生一些所需的行为。

更具体地说,我想模拟像 gcc 的 fcall-used- reg 选项这样的标志,它指示编译器将被调用者保存的寄存器转换为被破坏的寄存器(这意味着它可能在函数调用期间被更改)。

让我们关注r14。我手动破坏了寄存器,就像在这个答案中一样:

编译和反汇编:

反汇编包含:

我们可以看到r14,因为它被篡改了,被压入堆栈,然后被弹出以恢复其原始值。现在,使用-fcall-used-r14标志重复:

反汇编包含:

没有推送/弹出的地方。

现在,我修改了一些 LLVM 目标文件,编译了源代码,并在llc工具中添加了(?)这个功能:

现在,main.s包含:

显然,r14仍然是被调用者保存的。

在里面llvm/lib/Target/X86/X86CallingConv.td我修改了以下几行(删除了 R14),因为它们似乎与我感兴趣的 Linux 和 C 调用约定的 System V ABI 唯一相关:

我的问题是:

  • X86CallingConv.td我应该修改的唯一文件吗?我想是的,但也许我错了。
  • 我是否专注于正确的线条?也许这更难回答,但至少一个方向可能会有所帮助。

我在 Debian 10.5 中运行 LLVM 11。

编辑:

更改行,从“隐藏”定义中删除 R14:

正如玛格丽特正确指出的那样,也没有帮助。

0 投票
0 回答
180 浏览

clang - llc -march=cpp 选项是否可用

我想学习如何正确使用 IRBuilder 方法来使用下面描述的类似步骤生成给定的位码。

0 投票
0 回答
168 浏览

llvm - 当前主机 cpu 的 llc/clang 精确 -march 目标

我正在尝试为 llvm 找到一个命令行选项来指定“为您正在编译的此主机生成代码,它应该利用所有可用的 CPU 功能,并且不需要在任何其他系统上运行”。

我在我使用的所有平台上都有相当新的 llvm 版本,它们都是 arm、arm64、x86 或 x86-64。所有代码都是 C 或 C++。

llvm 是否有通用选项?