Как сохранить IR в файл и собрать в исполняемый файл?

Теперь я использую clang для сборки моего файла .c в файл .s. И я использовал API llvm для изменения IR. Однако теперь я не могу сохранить измененный IR в файл. Я хочу использовать "LLVMWriteBitcodeToFile", но не могу найти структуру "LLVMOpaqueModule"; Я хочу использовать «WriteBitcodeToFile», он всегда показывает мне «несоответствие типов». И я также хочу знать, как собрать ИК-файл в исполняемый файл.

Далее два метода, которые я использую для сохранения модуля:

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 — это точка экземпляра модуля


person Kun Lee    schedule 18.12.2012    source источник
comment
Правильная функция для использования действительно WriteBitcodeToFile из Bitcode/ReaderWriter.h. Если вы не можете его использовать, вы должны предоставить код, который вы пытаетесь скомпилировать, в этом вопросе.   -  person Oak    schedule 18.12.2012
comment
Да, Follow — это прототип WriteBitcodeToFilevoid: WriteBitcodeToFile(const Module *M, raw_ostream &Out);   -  person Kun Lee    schedule 18.12.2012
comment
Да, Follow — это прототип WriteBitcodeToFilevoid: WriteBitcodeToFile(const Module *M, raw_ostream &Out); когда я запускаю raw_stream, я не могу позволить себе параметр соответствия типа. который имеет параметр по умолчанию.   -  person Kun Lee    schedule 18.12.2012
comment
Далее два метода, которые я использую для сохранения модуля: bool unbuffered = false; llvm::raw_ostream ro(небуферизованный); WriteBitcodeToFile(m, ro); const char *Path = hello2.s; int ans = LLVMWriteBitcodeToFile(m, Path);   -  person Kun Lee    schedule 18.12.2012


Ответы (3)


  1. Чтобы сохранить IR в файл, см. ответ на этот вопрос: запись модуля в .bc файл битового кода
  2. Для компиляции IR в объектный файл посмотрите на инструмент llc и посмотрите, что делает его функция main.
person Eli Bendersky    schedule 18.12.2012
comment
Спасибо, но когда я запускаю экземпляр raw_ostream, который является параметром WriteBitcodeToFile, я не могу этого сделать. Ни подсказки, ни параметра, ни несоответствия типов. - person Kun Lee; 18.12.2012
comment
И еще я помню, что ООО просто делает ИК стать сборкой, мы просто можем выделить платформу. - person Kun Lee; 18.12.2012
comment
Далее два метода, которые я использую для сохранения модуля: bool unbuffered = false; llvm::raw_ostream ro(небуферизованный); WriteBitcodeToFile(m, ro); const char *Path = hello2.s; int ans = LLVMWriteBitcodeToFile(m, Path); - person Kun Lee; 18.12.2012
comment
@KunLee: не могли бы вы отредактировать свой вопрос, чтобы предоставить эту дополнительную информацию в структурированном, хорошо отформатированном и хорошо выраженном виде? Это значительно повысит шансы получить ответ на ваш вопрос. - person Eli Bendersky; 18.12.2012
comment
@KunLee: вы хотите записать в файл? Затем используйте raw_fd_ostream. Если вы просто хотите писать в стандартный вывод, используйте outs(). - person Eli Bendersky; 19.12.2012

Проверьте эти функции в 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

person andrewrk    schedule 24.11.2015

для записи битового кода llvm в файл я делаю следующее:

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

а потом дизассемблировать с помощью llvm-dis.

person voidMainReturn    schedule 01.07.2016