8

现在我使用 clang 将我的 .c 文件构建为 .s 文件。我已经使用 llvm API 修改了 IR。但是,现在我无法将修改后的 IR 保存到文件中。我想使用“LLVMWriteBitcodeToFile”,但找不到“LLVMOpaqueModule”的结构;我想使用“WriteBitcodeToFile”,它总是显示“类型不匹配”。而且我还想知道如何将 IR 文件构建为可执行文件。

接下来是我用来保存模块的两种方法:

1、首先使用WriteBitcodeToFile

bool unbuffered = false; 
llvm::raw_ostream ro(unbuffered); 
WriteBitcodeToFile(m, ro); 

2、第二次使用LLVMWriteBitcodeToFile

const char *Path = "hello2.s"; 
int ans = LLVMWriteBitcodeToFile(m, Path); 

注意:m 是 Module 实例的一个点

4

3 回答 3

4
  1. 要将 IR 保存到文件中,请参阅此问题的答案:将模块写入 .bc 位码文件
  2. 要将 IR 编译为目标文件,请查看该llc工具并遵循其main功能。
于 2012-12-18T13:48:57.833 回答
0

查看以下功能llvm-c/TargetMachine.h

/** 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);

另请参阅如何使用 llvm 生成机器代码

于 2015-11-24T22:16:23.410 回答
0

将 llvm 位代码写入文件我所做的是:

std::error_code EC;
llvm::raw_fd_ostream OS("module", EC, llvm::sys::fs::F_None);
WriteBitcodeToFile(pBiFModule, OS);
OS.flush();

然后使用llvm-dis进行反汇编。

于 2016-07-01T00:24:06.687 回答