- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 LLVM 的一个方面感到困惑:
对于它支持的所有语言,它是否支持编译为中间代码和直接二进制文件?
例如,如果我用 C 语言编写一些东西,LLVM(或 Clang?)可以编译为二进制(如 GCC)或中间代码吗?
或者只能将某些语言转换为中间语言?我想不言而喻,这个中间体需要某种类型的 LLVM 运行时?不过,我从未真正听说过运行时。
最佳答案
LLVM 是一个用于操作 LLVM IR(您提到的“字节码”)并将其降低为特定于目标的二进制文件(例如 x86 机器代码)的框架。 Clang 是 C/C++(和 Objective C)的前端,它将这些源语言转换为 LLVM IR。
考虑到这一点,回答您的问题:
For all the languages it supports, does it support compiling both to the intermediate code AND to straight binary?
LLVM 可以将 IR(中间代码)编译为二进制(或汇编文本)。
For instance, if I write something in C, can LLVM (or Clang?) compile to either binary (like GCC) or intermediate code?
是的。 Clang 可以直接将您的代码编译为二进制文件(使用 LLVM 作为后端),或者如果您需要,可以直接发出 LLVM IR。
Or can only some languages be converted to intermediate? I guess it goes without saying that this intermediate requires some type of LLVM runtime?
理论上,一旦有了 LLVM IR,LLVM 库就可以将其转换为二进制文件。某些语言需要运行时(例如 Java 或 Python),因此从这些语言到 LLVM IR 的任何编译器都必须以某种方式提供运行时。 LLVM 对连接到此类运行时提供了一些支持(例如 - GC Hook ),但不提供“自己的运行时”。与 LLVM 相关的唯一“运行时”项目是compiler-rt,它提供了一些语言/编译器内置函数和内在函数的快速实现。它主要用于 C/C++/Objective C。它不是 LLVM 的正式一部分,尽管基于 Clang 的完整工具链经常使用它。
关于clang - LLVM:中间字节码与二进制码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30280292/
我指的是 https://llvm.org/docs/GettingStarted.html从其源代码构建 LLVM。我正在使用 Ubuntu 18.04。 $ cmake -G Ninja -DCM
使用 ModulePass,我的目标是向上遍历 SSA 图:从一个具有 0..2 个操作数的语句(大多数操作码属于该语句)开始,我想找出两件事: 操作数是元数据/常量(简单:只需尝试转换为常量类型)还
注意:我注意到 this question与这个问题有很大关系,所以如果您对我的问题感兴趣,那么您一定要阅读另一个问题及其答案。 我可以想到一些 OOP 语言前端可以做的优化,例如创建临时变量来保存来
我正在尝试使用 clang-3.2 创建自动矢量化代码 从这里的幻灯片 - http://llvm.org/devmtg/2012-04-12/Slides/Hal_Finkel.pdf 我应该能够使
我想问的是,我们可以将现有pass生成的信息转化为新pass吗? 如果是,那么如何? 例如 -loops 给出了自然循环信息,所以我们可以通过调用它来将这些信息用于新的传递。 最佳答案 您可以通过覆盖
在 LLVM IR 中,当我想从一个数组中获取一个值时,似乎有三种方法可以做到这一点:使用 extractvalue、使用 extractelement 和使用 getelementptr 然后加载。
我想逐步介绍一下我生成的LLVM IR代码。就llc和lli而言,该代码在语法上是有效的并且类型有效,但是结果不是我所期望的。 这些块足够大,以至于我无法简单地读取该错误就无法成功完成,并且我很难制作
我想弄清楚如何使用 trampoline intrinsics在 LLVM 中。该文档提到了存储蹦床所需的一些存储量,这取决于平台。我的问题是,我如何确定需要多少? 我找到了 this example
我需要使用抽象解释来使用 LLVM 进行一些分析。这可能吗?或者我需要更轻松地使用分析工具。如果我可以通过 LLVM 做到这一点,哪些类将帮助我从原始源代码中制定语句以获取变量之间的关系(以及每个变量
我正在创建一种静态编译的编程语言,并使用 LLVM 作为其后端。我希望我的语言在发生整数溢出时陷入/崩溃。 我知道类似 llvm.sadd.with.overflow 的事情,但我认为这不是最佳/有效
我正在尝试学习 LLVM tablegen。 http://llvm.org/docs/TableGen/LangRef.html表明 field关键字存在但不解释其含义。有人知道这是什么意思吗? 我
Fibonacci LLVM 示例使用 errs() getIR() ) 我一直在搜索 llvm::Module Class Reference并没有得到任何帮助。 Fibonacci.cpp 的一部
我想在 llvm IR 中找到对 llvm.pow.f64 函数的所有函数调用。请建议我一个方法来做到这一点。 最佳答案 嗯,这是一个基本的 FunctionPass找到所有对函数的调用: class
我正在尝试从 llvm 中间代码中删除未使用的 block 。 首先,我通过从入口 basicblock 开始并从它们的终止符指令添加所有 basicblock 后继者来构建可访问的 basicblo
我想获取 llvm 中每条指令的后继列表。如果我没理解错的话,对于除了branch(br)之外的所有指令,后继指令就是下一条。但是对于分支指令来说有点棘手。 例如,如果我有以下 C 代码: int m
我有文本格式的 LLVM IR 代码。我想做的是能够解析它并修改该代码。是否有可以帮助解析 LLVM IR 代码的 API?我的系统中应该有哪些库?此刻我有clang编译器也安装了 LLVM,因为我可
(1) @str = private constant [13 x i8] c"Hello World\0A\00" (2) define i32 @main(){ (3) %r2 = getelem
如果我有一组基本块和边,我需要为它们创建一个具有新入口和端点的新函数。 我可以直接在 LLVM 中创建它吗,就像 createFunction(F) 一样然后 F.insert(bb, edges)其
我通过教程使用 LLVM http://llvm.org/releases/3.1/docs/tutorial/ 编写玩具编译器 但是关于符号表处理的内容并不多。 有一个命令 llvm-nm 显示符号
我希望编写一个 LLVM 传递两个 i32 类型的参数来选择函数。我的第一次尝试(如下所示)失败了: bool MyFunctionPass::runOnFunction(Function &f) {
我是一名优秀的程序员,十分优秀!