问题标签 [llvm]
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.
mingw - LLVM:用于 Windows 的带有 llvm-gcc (mingw) 的位码
我目前正在构建一个小型 JIT 编译器。对于语言,我需要一个运行时库来处理一些特殊的数学函数。我认为最好的办法是将lib编译为位码并链接它。编译器应该集成在一个产品中,并且到目前为止,它必须在 windows (VC10, 64bit) 下工作。
那么是否可以使用 mingw llvm-gcc 构建数学库,稍后使用 JITed 代码构建一个链接?或者在 mingw 下使用 llvm-gcc 构建位码的可移植性是否有任何问题?如果有问题,你会建议什么解决方案?
c++ - 将 LLVM JIT 代码链接到静态 LLVM 库?
我正在实施一个跨平台(Mac OS X、Windows 和 Linux)应用程序,它将对财务数据进行大量 CPU 密集型分析。出于速度原因,大部分分析引擎将用 C++ 编写,用户可访问的脚本引擎与 C++ 测试引擎交互。随着时间的推移,我想编写几个脚本前端来模拟其他流行的软件,并拥有大量的用户群。第一个方面将是类似 VisualBasic 的脚本语言。
我认为 LLVM 将非常适合我的需求。由于数据量巨大,性能非常重要;运行一次测试可能需要数小时或数天才能得到答案。我相信使用 LLVM 还可以让我使用单一的后端解决方案,同时随着时间的推移为不同风格的脚本语言实现不同的前端。
测试引擎本身将与界面分离,测试甚至会在单独的过程中进行,并将进度和结果报告给测试管理界面。测试将包括与测试引擎代码集成的脚本代码。
在我之前编写的类似商业测试系统的实现中,我构建了一个快速解释器,它可以轻松地与测试库交互,因为它是用 C++ 编写的并直接链接到测试引擎库。从脚本代码到测试库对象的回调涉及在格式之间进行转换,开销很大。
我在想象,使用 LLVM,我可以直接在 C++ 中实现回调,这样我就可以使脚本代码几乎像用 C++ 编写一样工作。同样,如果所有代码都编译为 LLVM 字节码格式,LLVM 优化器似乎可以跨脚本语言和用 C++ 编写的测试引擎代码之间的边界进行优化。
我不想每次都编译测试引擎。理想情况下,我想 JIT 只编译脚本代码。对于小型测试,我会跳过一些优化过程,而对于大型测试,我会在链接期间执行完整的优化。
那么这可能吗?我可以将测试引擎预编译为 .o 目标文件或 .a 库文件,然后使用 JIT 链接脚本代码吗?
最后,理想情况下,我希望脚本代码实现特定方法作为特定 C++ 类的子类。因此,C++ 测试引擎只会看到 C++ 对象,而 JIT 设置代码编译的脚本代码实现了对象的一些方法。似乎如果我使用正确的名称修饰算法,将脚本语言的 LLVM 生成设置为看起来像 C++ 方法调用会相对容易,然后可以链接到测试引擎。
因此,链接阶段将有两个方向,从脚本语言调用测试引擎对象以检索定价信息和测试状态信息,以及从测试引擎调用某些特定 C++ 对象的方法,其中代码不是从 C++ 提供的,而是从脚本语言。
总之:
1) 我可以在 JIT 编译、代码生成过程中链接预编译(.bc、.o 或 .a)文件吗?
2) 我是否可以使用上面 1) 中的过程链接代码,以便我能够创建代码,就像它都是用 C++ 编写的一样?
llvm - 由 clang 1.1 和 1.0(llvm 2.7 和 2.6)生成的尾调用
使用 clang -O2 (或使用在线演示)编译下一段代码后:
我正在获得下一个 llvm 程序集片段flip
:
我认为这tail call
意味着删除当前堆栈(即返回将是上帧,所以下一条指令应该是ret %5
),但根据这段代码它会这样做mul
。在本机汇编中,call
没有尾部优化很简单(即使有适当的 llc 标志)
有人能解释一下为什么clang会生成这样的代码吗?
同样,我不明白为什么 llvmtail call
可以简单地检查下一个ret
将使用 prev 的结果,call
然后进行适当的优化或生成与尾调用指令等效的本机?
qt - 使用 Qt 的 LLVM 编译版本
我已经看到一些使用 llvm 的 mac 或 linux 的 mkspec。
有人使用 llvm 编译的 Qt 版本吗?或者 llvm 在他们的 Qt 项目上?它会加快编译时间吗?你的项目更快吗?
jit - LLVM:将指向结构的指针传递给 JIT 函数,该结构包含指向函数的指针
我有一个 LLVM(2.7 版)模块,它的函数接受一个指向结构的指针。该结构包含指向 C++ 函数的函数指针。模块函数将被 JIT 编译,我需要使用 LLVM API 在 C++ 中构建该结构。我似乎无法将指向函数的指针作为 LLVM 值,更不用说将指针传递给我无法构建的 ConstantStruct。
我不确定我是否在赛道上,但这是我到目前为止所拥有的:
programming-languages - 针对 LLVM 的函数式语言
是否有任何针对 LLVM 的语言:
- 是静态类型的
- 使用类型推断
- 是函数式的(即 lambda 表达式、闭包、列表原语、列表推导等)
- 具有一流的面向对象特性(继承、多态、混合等)
- 拥有复杂的类型系统(泛型、协变和逆变等)
Scala 是所有这些,但只针对 JVM。F#(在某种程度上是 C#)是大多数(如果不是全部),但仅针对 .NET。有哪些类似的语言针对 LLVM?
iphone - 这个 LLVM 1.5 警告是什么意思?“没有 'id' 的协议限定符是过时的”
我刚刚尝试使用 LLVM 1.5 编译器(包含在 XCode 3.2.3 中)编译一个 iOS 项目,我收到了很多新警告,其中包括如下几个:
例如,这发生在这样的行上:
现在,我认为这可能是一个“命名约定”警告,但有人知道它的真正含义吗?
c++ - 我可以将现有方法绑定到 LLVM 函数* 并从 JIT 编译的代码中使用它吗?
我正在玩弄 LLVM C++ API。我想 JIT 编译代码并运行它。
但是,我需要从所述 JIT 编译的代码中调用 C++ 方法。通常,LLVM 将方法调用视为函数调用,并将对象指针作为第一个参数传递,因此调用应该不是问题。真正的问题是将该功能放入 LLVM。
据我所知,可以对函数使用外部链接并通过其名称获取它。问题是,因为它是一个 C++ 方法,它的名字会被破坏,所以我不认为这样做是个好主意。
制作FunctionType
对象很容易。但是从那里,我如何通知 LLVM 我的方法并Function
为其获取对象?
compiler-construction - LLVM 外部函数
我最近开始在 MinGW 下试验 LLVM。我已阅读Kaleidoscope教程,但现在我遇到了外部功能问题。
我正在声明这样的外部函数:
其中 mod 是 Module* 而 ctx 是 LLVMContext&。
在这种情况下,一切正常。但是,如果我声明一个函数:
并将 SinFunction 声明从使用“sin”更改为使用“my_cubic_transform”(不更改任何其他内容),然后我得到:
更改我的 makefile 以包含“-g”选项无效。Kaleidoscope 教程建议这在 LLVM 中是可能的(至少对于我正在使用的 JIT)。那我做错了吗?如果是这样,是什么?
java - 人们应该为 Scala 的未来平台问题做好哪些准备?
目前 Scala 只在 JVM 上运行,CLR 的实现已经过时。
但目前有一些声音表示,微软有兴趣为 .NET 的最新 Scala 端口提供资金。
考虑到甲骨文方面缺乏任何计划或监督如何处理 Java/JVM/生态系统,Scala 开发人员如何做好准备,最终可能没有像样的平台可以运行 Scala?
有没有计划在未来有一些“独立”的 Scala VM 实现,它将 Scala 的功能映射到一些字节码/VM,而不是不得不忍受当前 VM 实现中的所有这些遗留错误(没有泛型、协变数组、奇怪的注释,没有尾调用等)?