首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用llvm生成机器码

如何使用llvm生成机器码
EN

Stack Overflow用户
提问于 2012-11-20 07:27:38
回答 4查看 16K关注 0票数 24

我目前正在做一个使用llvm的编译器项目。我遵循了各种教程,直到我有一个解析器来创建语法树,然后使用提供的IRBuilder将该树转换为llvm模块。

我的目标是创建一个可执行文件,我不知道下一步该做什么。我找到的所有教程都是使用Module.dump()创建llvm模块并打印出程序集。此外,我能找到的唯一文档是给llvm开发人员的,而不是项目的最终用户。

如果我想生成机器代码,下一步是什么?llvm-mc项目看起来可以做我想做的事情,但是我找不到任何关于它的文档。

也许我期望llvm做一些它没有做的事情,我的期望是我可以构建一个模块,然后就会有一个可以用模块调用的API,一个目标三元组和一个目标文件就会被生成。我找到了关于生成JIT的文档和示例,但我对此不感兴趣。我正在寻找如何产生编译的二进制文件。

我正在使用OS,如果这有任何影响的话。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-22 21:41:54

使用llc -filetype=obj从您的IR发出可链接的目标文件。您可以查看llc的代码,了解它为发出此类代码而进行的LLVM调用。至少对于Mac OS X和Linux来说,以这种方式发射的对象应该是相当好的(即,到目前为止,这不是一个"alpha质量“选项)。

然而,LLVM不包含链接器(还没有!)。因此,要将此对象文件实际链接到某个可执行文件或共享库中,您需要使用系统链接器。请注意,即使您有一个由单个目标文件组成的可执行文件,也必须链接后者。LLVM社区的开发人员正在为LLVM开发一个真正的链接器,称为lld。您可以访问its page或搜索邮件列表存档以跟踪其进度。

票数 18
EN

Stack Overflow用户

发布于 2012-11-21 19:28:56

正如你在the llc guide上读到的,它的目的确实是生成汇编,然后“汇编语言输出可以通过本机汇编器和链接器来生成本机可执行文件”-例如gnu汇编器(as)和链接器(ld)。

因此,这里的主要答案是使用本地工具组装和链接的

但是,有一些实验支持通过llc直接从IR文件生成本机对象

代码语言:javascript
复制
-filetype      - Choose a file type (not all types are supported by all targets):
    =asm         -   Emit an assembly ('.s') file
    =obj         -   Emit a native object ('.o') file [experimental]

或者,您可以使用llvm-mc.s文件中组装它:

代码语言:javascript
复制
-filetype      - Choose an output file type:
    =asm         -   Emit an assembly ('.s') file
    =null        -   Don't emit anything (for timing purposes)
    =obj         -   Emit a native object ('.o') file

不过,我对链接器一无所知。

此外,我建议您查看tools/bugpoint/ToolRunner.h文件,该文件公开了一个包装器,该包装器结合了llc和平台的本机C工具链,用于生成机器码。在其标题注释中:

此文件公开了一个围绕platform C编译器的抽象,用于编译C和汇编代码。

票数 16
EN

Stack Overflow用户

发布于 2015-11-25 02:13:14

查看llvm-c/TargetMachine.h中的这些函数

代码语言:javascript
复制
/** Emits an asm or object file for the given module to the filename. This
  wraps several c++ only classes (among them a file stream). Returns any
  error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */
LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
  char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage);

/** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */
LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleRef M,
  LLVMCodeGenFileType codegen, char** ErrorMessage, LLVMMemoryBufferRef *OutMemBuf);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13464259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档