问题标签 [mcjit]
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.
arm - 如何为 armhf 配置 LLVM MCJIT?
我正在尝试使用基于 LLVM 3.8 的 JIT 为 Raspberry PI 2 构建简单的应用程序。我为 ARM 构建了 LLVM,并且我的应用程序成功地 jitted 代码,但它接缝 LLVM 为 softfp 而不是 hardfp 生成代码。
如何配置 LLVM 为 hardfp 生成代码?
LLVM 配置了arm-linux-gnueabihf
目标。从我指定setArch
asarm
和setMCU
as的代码中cortex-a7
。
llvm - 如何反汇编 LLVM MCJIT 编译的结果?
我编写了一个程序,它使用 LLVM 3.5 作为 JIT 编译器,我正在尝试更新它以在 LLVM 3.7 中使用 MCJIT。我大部分时间都在工作,但我正在努力重现我用 LLVM 3.5 实现的一个仅调试功能。
我希望能够看到 JIT 进程生成的主机代码(例如 x86、x64 或 ARM,而不是 LLVM IR);在调试版本中,我在程序运行时将其注销。使用 LLVM 3.5,我可以通过调用 ExecutionEngine::runJITOnFunction() 来填充 llvm::MachineCodeInfo 对象来做到这一点,该对象为我提供了生成代码的起始地址和大小。然后我可以反汇编该代码。
我似乎在 MCJIT 中找不到任何等价物。我可以得到函数的起始地址(例如通过getPointerToFunction()),但不能得到大小。
我已经看过Disassemble Memory但除了答案中没有那么多细节之外,它似乎更多的是关于如何反汇编字节序列。我知道该怎么做,我的问题是:我怎样才能首先掌握字节序列?
如果有助于使这一点更具体,请将此问题重新解释为:“如何扩展示例 Kaleidoscope JIT 以显示它产生的机器代码(x86、ARM 等),而不仅仅是 LLVM IR?”
谢谢。
c++ - 使用 LLVM MCJIT 调用泛型函数
所以...我最近(现在大约 2 周)一直在研究 LLVM。我已经阅读了文档,浏览了教程等。
我决定尝试更进一步,即将类型引入 Kaleidoscope 教程。当我发现 MCJIT 只会在具有主要样式签名的函数上运行Function() 时,我立即碰壁了。现在我明白了为什么本教程将函数包装在 anon 函数中......
我花了很长时间试图在这方面取得进展,但没有运气。我在网上找不到任何这样的例子,这看起来很奇怪。我已经能够将 ExecutionEngine 更改为使用 Interpreter 并获得了完美的结果,但这似乎毫无意义,我不妨在 C++ 中编写一个“核心库”并有条件地调用这些函数。
我知道我可以 finaliseObject() 并获取函数指针,但它只是将事情向后移动,因为我必须转换函数,虽然我知道函数签名,但我不知道动态转换函数指针的方法。
我的问题是假设我准备好了一个 LLVM 函数,添加到一个模块等。我如何通过 MCJIT 调用这个函数?
谢谢你的帮助。
以下是我当前的暂存代码。
现在,如果我得到一个指向函数的指针,那就成功了!有用。
但是,如果我尝试在 EE 中运行该函数,则会得到“尚不支持全功能参数传递!”
c++ - LLVM - 如何在 MCJIT 中正确使用全局变量
所以我正在构建一个可以在编译时调用代码的编译器。一切都成功编译后,我创建llvm::ExecutionEngine
并添加llvm::Module
了程序所需的每个。
最后我llvm::ExecutionEngine::finalizeObject
在模块中调用并执行一个函数。
一切正常,除了一件事:
llvm::ExecutionEngine::finalizeObject
Integer division by zero
只要模块包含全局变量,就会崩溃并出错。
所以我的问题是: 如何在 MCJIT 中正确使用全局变量?
注意:
- 全局变量在本机可执行文件中工作正常
- 执行引擎在不使用全局变量时工作正常
- 我认为问题可能与全局变量的链接或执行引擎的数据布局有关
感谢您的任何反馈!
llvm - 计算每条指令在运行时可以被调用的次数
我读了这个问题的答案
如何计算每条指令在运行时可以调用的次数?
我在 InstrProfiling.cpp 文件中找到了一个名为 的函数castToIncrementInst
,但该函数只计算指令总数。我需要每个指令或基本块的调用次数
segmentation-fault - 执行 LLVM MCJIT 生成机器代码时出现段错误
检查_siginfo,si_code是2
映射对象的权限无效
我查了core文件,用disas打印asm代码,这个地址可以正常访问,和我本地代码没有区别。
我检查了另一个线程,发现有另一个线程正在编译机器码,所以可能是这个的影响?
c - LLVM C:LLVMRunFunctionPassManager 断言失败
在遵循 LLVM Kaleidoscope 教程并使用 LLVM-C API 复制它时,我遇到了以下断言失败:
断言失败:New->getType() == getType() && "replaceAllUses of value with new value of different type!",文件 C:\llvm-project\llvm\lib\IR\Value.cpp,第 494 行
我已经看到在两种情况下产生了这个错误:
- CFGSimplificationPass 被添加到 pass 管理器中,并且 LLVMRunFunctionPassManager 函数在一个像这样分支的函数上被调用(下面的完整示例):
- 未添加 CFGSimplificationPass;LLVMRunFunctionPassManager 成功。但是,运行 LLVMRunFunction 时会产生相同的错误。
以下生成的代码很好:
我为第一个实例创建了一个小型复制器:
LLVMDumpModule 函数为我提供以下输出:
我已经看到 LLVM Kaleidoscope 示例项目生成的相同代码,运行没有问题。我的 MCJIT 设置是否存在固有问题,或者我是否遇到了 LLVM 错误?
llvm - MCJIT 比旧的 JIT 慢得多
当我使用 llvm3.3 的旧 jit 编译 IR 文件时,它足够快(1 分钟),但是finalizeObject()
当我使用 llvm13 时,时间成本可能高达 10 分钟。
有谁知道如何改进它?谢谢。
exception - 多线程 MCJIT 生成不正确的 EH_FRAME
我正在开发一个运行 JIT 来为每个线程提供请求的服务。每个线程都有一个独立的 MCJIT 实例,使用它自己的内存管理器、解析器等。
我发现没有锁,MCJIT 可以生成不正确的 EH_FRAME 用于异常处理。当一个请求抛出并展开时,展开器无法正确通过调用堆栈。我正在使用默认的 libgcc undwinder,我可以看到 unwind 的搜索短语有时在并发性很高时会失败。
谁能指出为什么会发生这种情况?我可以看到 MCJIT finalizeObject() 正在做很多事情,但我发现很难看出哪里需要并发?(符号解析,重定位?)。
我正在使用 LLVM 7.0。
谢谢。小号