gpt4 book ai didi

llvm - 将 LLVM IR 转换为 Java 字节码

转载 作者:行者123 更新时间:2023-12-04 01:54:10 27 4
gpt4 key购买 nike

我是初学者,想构建可以将 LLVM 位码转换为 Java 字节码的翻译器。

有人可以简要地告诉我或列出一些主要步骤如何完成它。

最佳答案

在我们公司(Altimesh),我们对CIL做了同样的事情。 .对于 Java 字节码,任务可能非常相似。

我可以告诉你这是一项相当长的任务。

第一件事:LLVM 库是用 C++ 编写的

这意味着您要么必须学习 C++,以及一种从 C++ 生成java 字节码的方法,要么将您需要的符号从 LLVM 库导出到 JNI .我强烈推荐第二个选项,因为您将获得纯 Java 实现(并且您很快就会发现您不需要那么多来自 LLVM API 的符号)。

一旦你想通了,你需要:

  1. 从文件中解析模块

这是一个简单的例子(使用 llvm 3.9 API,现在已经很老了):

llvm::Module* llvm__Module_buildFromFile (llvm::LLVMContext* context, const char* filename)
{
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buf = llvm::MemoryBuffer::getFile(filename);
llvm::SMDiagnostic diag;
return llvm::parseIR(buf->get()->getMemBufferRef(), diag, *context).release();
}
  1. 解析调试信息

    void llvm__DebugInfoFinder__processModule(llvm::DebugInfoFinder* self, llvm::Module* M){ self->processModule(*M);

调试信息或元数据对于 llvm 来说是一件很痛苦的事情,因为它们变化非常频繁(与指令相比)。因此,您要么必须坚持使用 LLVM 的版本(可能是一个错误的选择),要么在新的 LLVM 版本发布后立即更新您的代码。

一旦你到了那里,大部分的痛苦都在你身后,你就进入了乐趣的世界。

我强烈建议从一些非常非常简单的东西开始,比如一个简单的 addition program .

然后始终保持打开两个窗口,godbolt向您展示您需要解析的输入 llvm,以及一个向您展示目标 (here is an example for MSIL) 的 java 窗口。

一旦您能够转译您的第一个程序(好哇,我可以添加两个整数 :) ),您很快就会想要转译 more stuff ,很快你就会面临两种精神错乱:

  • getelementptr .这就是数组、内存、结构……在 LLVM 中的访问方式。这是一个非常神奇的指令。

  • phi . LLVM 系统中的关键指令,因为它允许 Single Static Assignment ,这对后端相当重要(注册分配器和 co)。我不知道在 Java 中,但这显然在 MSIL 中不可用。

完成所有这些后,您将进入特殊情况的无尽痛苦世界,怪异的 C 构造 you didn't know about , gcc 扩展等等...

祝你好运!

关于llvm - 将 LLVM IR 转换为 Java 字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51524954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com