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

c - LLVM 作为不同语言的基础编译器

我是 LLVM 编译器和基础架构的新手。我有以下想法。Clang 是 C/C++ 的 LLVM 前端,类似于 Rust 编程语言的 Rustc。两者都可以发出 LLVM IR 代码,并且发出的代码可以编译为可执行的应用程序。

我的问题是可以链接不同的编程语言吗?示例如下 -

以 Rust 中定义的函数为例

从两个源文件生成 IR 后,是否可以链接它们并创建一个应用程序?

我只是想知道这是否有效,请告诉我。

0 投票
1 回答
2671 浏览

windows - Windows 上没有 LLC?

我想使用 LLVM IR 并安装了最新的 LLVM v4(在我的 Windows PC 上),但我在已安装的文件中找不到 llc(在“bin”文件夹和所有其他文件中查找)。

想知道这个工具是否不可用,或者它是否已被弃用或什么?

这是我的 bin 文件夹的内容:

2017 年 4 月 30 日下午 7 点 46 分。

2017 年 4 月 30 日下午 7:46 ..

03/09/2017 09:50 PM 63,566,848 clang++.exe

03/09/2017 09:35 PM 2,357,248 clang-apply-replacements.exe

03/09/2017 09:37 PM 17,489,408 clang-change-namespace.exe

03/09/2017 09:35 PM 52,584,448 clang-check.exe

03/09/2017 09:50 PM 63,566,848 clang-cl.exe

03/09/2017 09:50 PM 63,566,848 clang-cpp.exe

03/09/2017 09:35 PM 2,380,800 clang-format.exe

03/09/2017 09:35 PM 20,820,480 clang-import-test.exe

03/09/2017 09:37 PM 17,238,528 clang-include-fixer.exe

03/09/2017 09:34 PM 3,140,​​096 clang-offload-bundler.exe

03/09/2017 09:37 PM 17,924,608 clang-query.exe

03/09/2017 09:35 PM 17,438,208 clang-rename.exe

03/09/2017 09:35 PM 17,171,456 clang-reorder-fields.exe

03/09/2017 09:37 PM 22,490,624 clang-tidy.exe

03/09/2017 09:35 PM 63,566,848 clang.exe

03/09/2017 09:37 PM 17,251,840 查找所有符号.exe

2016 年 11 月 8 日上午 9:50 20,626 git-clang-format

03/09/2017 09:50 PM 44,386,816 ld.lld.exe

2017 年 3 月 9 日下午 9:38 55,871,488 libclang.dll

2017 年 3 月 9 日晚上 9:50 574,976 libiomp5md.dll

03/09/2017 09:29 PM 574,976 libomp.dll

03/09/2017 09:50 PM 44,386,816 lld-link.exe

2017 年 3 月 9 日下午 9:37 44,386,816 lld.exe

2017 年 3 月 9 日晚上 9:30 14,962,688 llvm-ar.exe

2017 年 3 月 9 日晚上 9:50 14,962,688 llvm-lib.exe

03/09/2017 09:37 PM 15,513,600 llvm-objdump.exe

2017 年 3 月 9 日晚上 9:50 14,962,688 llvm-ranlib.exe

2017 年 3 月 9 日晚上 9:30 42,117,120 LTO.dll

2017 年 3 月 9 日晚上 9:35 16,766,976 模块化.exe

11/14/2015 12:34 AM 23 scan-build.bat

2015 年 12 月 21 日下午 4:19 4,504 扫描视图

0 投票
1 回答
836 浏览

llvm - llc:符号上不支持的重定位

问题

llc给我以下错误:

LLVM 错误:符号上不支持的重定位

详细编译流程

我正在为编译器的中级 IR (MIR) 实现 LLVM 前端,在将各种方法转换为许多位码文件后,我将它们链接 ( llvm-link)、优化它们 ( opt)、将它们转换为机器码 ( llc)、制作它们是一个共享库(clang因为它是链接器包装器),并动态加载它们。 llc对于我正在编译的某些方法,步骤失败了!

步骤 1: llvm-link: 合并许多位码文件

我可能有许多相互调用的函数,所以我llvm-link使用了可能相互交互的不同位码文件。这一步没有问题。例子:

llvm-link function1.bc function2.bc -o lnk.bc

步骤 2: opt: 运行优化通道

现在我正在使用以下内容:

opt -O3 lnk.bc -o opt.bc

这一步没有问题,但这就是导致问题的原因!此外,这是必要的,因为将来我将需要这一步来通过额外的通行证,例如loop-unroll

第三步llc::生成机器码(PIC)

我正在使用以下命令:

llc -march=thumb -arm-reserve-r9 -mcpu=cortex-a9 -filetype=obj -relocation-model pic opt.bc -o obj.o

我保留了我设置的拱形特定标志,以防它们导致问题。我正在使用Position Independent Code,因为下一步我将构建一个shared object. 此命令失败,并出现我在此答案之上编写的错误。

第 4 步clang::生成共享对象

对于Step 3失败的情况,未达到此步骤。如果llc成功,这一步也将成功!

附加信息

配置

以下在arm设备上运行的 llvm3.6 上运行。

我注意到的事情

  • 如果我在步骤中省略-O3(或任何其他级别)opt,那么llc就可以了。
  • 如果我不这样做,而是从 中省略它们llcllc仍然会失败。这让我认为这opt -O<level>是造成问题的原因。
  • 如果我llc直接使用它会起作用,但我将无法运行opt允许我的特定通行证,所以这不是我的选择。
  • 到目前为止,我使用我编译的 2 个函数(来自它们的原始 MIR)遇到了这个问题,这些函数使用循环。其他人产生工作代码!
  • 如果我不使用pic模型 at llc,它可以生成obj.o,但是我将无法从中创建一个.so

问题

  1. 为什么会这样??!!

  2. 为什么opt-relocation-model选项?这不应该只是一llc件事吗?我已经尝试将其设置为 atoptllcto pic,但仍然失败。

  3. 我使用它是clang因为它有一个链接器的包装器来获取.so. 有没有办法用 LLVM 工具代替这一步?

0 投票
1 回答
190 浏览

llvm - Understanding llvm-ir to assembly for x86_64-unknown-linux-gnu

I transform the following llvm-IR

to assembly code for x86_64-unknown-linux-gnu using llc sample.ll generated assembly code:

The register in the above code: %rbp is the base pointer, which points to the base of the current stack frame, and %rsp is the stack pointer, which points to the top of the current stack frame and operand are store in %eax and %al for arithmatic operation but in can't find the instruction where the value is load in %eax and %al register I also want to know

  1. How llc is handling phi node on assembly level
0 投票
1 回答
371 浏览

llvm - 如何在 MachineInstr 中获取指令?

我想知道真实寄存器中的变量依赖性(如 X86:EAX、EBX ...)。因此,我创建了一个 IR-PASS,可以识别对 IR 的依赖关系。此传递使用新添加的变量和unsigned HasDependency: 1;类。unsigned HasMaybeDependency: 1;Value

当应用于这样的代码片段时:

产生这个位码:

上述位码的传递结果是:

我按照该SelectionDAGISel.cpp: SelectAllBasicBlocks函数从后端获取信息,但我只能获取AllocaInst,StoreInstLoadInstusing ,如下所示:

我怎么知道 和 之间的相关MachineInstrInstruction?如果 LLVM 中没有提供,需要修复哪些部分?

0 投票
1 回答
620 浏览

c - OSX - 使用 llc 编译到 WebAssembly “llc: : error: unable to get target for 'wasm32', see --version and --triple.”

我在OSX上运行并尝试将以下 c 代码编译为 webAssembly:

我查看了这个示例并尝试运行以下命令:

第一个命令工作正常,clang 生成 .bc 文件,但是当我尝试运行第二个命令时,我得到:llc: : error: unable to get target for 'wasm32', see --version and --triple.

任何帮助,将不胜感激。

0 投票
0 回答
322 浏览

c - 带有 op & ld 的 LLVM - 链接错误

我正在尝试为一个项目熟悉 LLVM 和 clang,我将在其中使用不同的优化。因此,我不仅需要通过 clang 与 LLVM 交互,还需要使用 opt & llc。现在,我无法使用 C 库链接一个非常基本的示例。

代码(main.c):

LLVM Flow & ld 作为链接器:

ld的错误输出:

我对这个错误感到困惑:

  • 我正在使用-lc,它应该链接stdc库
  • ld 的输出表明找到了 libc
  • 为什么 ld 抱怨 LLVM IR 文件中的错误?

一个更加愚蠢的 C 程序链接,但给了我一个分段错误和执行。

代码:

这让我想知道我是否在做一些根本错误的事情......

谢谢!

0 投票
2 回答
1017 浏览

llvm - llc 没有调试或 -view-dag-combine1-dags 选项

llc通过包管理器在我的计算机上安装了程序(当然我安装了 LLVM,6.0.0 版本)。另外,我是从源代码构建的。我想要的是查看由 llvm 生成的 DAG。-debug但是,不幸的是,我-view-dag-combine1-dags在两个版本的llc. 这让我发疯,因为它到处都是,这个标志应该可以帮助我,但没有提到如果我没有它们该怎么办。在 help 和 man 中,没有这样的选项。我安装了graphviz、dot和gv,应该不是问题。

编译的版本llc

我用 RelWithDebugInfo 标志构建了它,也许我应该用 Debug 标志构建它?或者cmake中是否有任何我应该启用的标志?我相信我已经用谷歌搜索了足够多的信息,但找不到任何信息。

0 投票
1 回答
536 浏览

compiler-construction - 点文件不为 -view-isel-dags 选项生成

在尝试SelectionDag使用 LLVM(从启用调试模式的源构建)查看在指令选择阶段生成的节点时,我正在使用以下命令,该命令未创建 Graphviz DOT 文件。

相反,它正在创建sum.s文件。我在这里缺少什么吗?

总和.c

总和.bc

LLVM 信息

0 投票
0 回答
122 浏览

llvm - 使用 LLVM 编译时有什么方法可以避免删除重复的加载指令

我正在创建 LLVM 前端模块通道。所以,基本上我需要复制所有加载指令并存储在不同的寄存器中。对于 clang、opt 和 llc 工具,在 -O0 处,删除了此重复的加载指令。我使用 objdump 查看了最终程序集,我可以看到删除了重复的加载指令。我想要一个不会删除重复加载指令的解决方案。

实际的 C 程序是,

对应的 IR 是,

但是当我的通行证被启用时,这个 IR 会改变,我只复制加载指令,加载地址是相同的内存,即使是重复加载也是如此。

更改后的 IR 将是,

我能够在 IR 级别看到更改的 IR,但在 llc 之后的最终组装级别看不到。我认为 llc 正在删除所有重复的负载。如何阻止 llc 删除?

注意:我尝试使所有变量都可变。为此,它可以工作,我可以在 llc 之后看到重复的负载。但是,这不是一个适当的解决方案。我不能让所有数千个变量都变得易变 :(。