Files
bits-runner-builder/src/Compiler/CodeGenerator.cpp
Rafał Grodziński 7a76bb7e33 Cleaned up structure
2025-06-21 13:33:50 +09:00

57 lines
1.8 KiB
C++

#include "CodeGenerator.h"
using namespace std;
CodeGenerator::CodeGenerator(shared_ptr<llvm::Module> module): module(module) {
}
void CodeGenerator::generateObjectFile(OutputKind outputKind) {
llvm::InitializeAllTargetInfos();
llvm::InitializeAllTargets();
llvm::InitializeAllTargetMCs();
llvm::InitializeAllAsmParsers();
llvm::InitializeAllAsmPrinters();
string targetTriple = llvm::sys::getDefaultTargetTriple();
string errorString;
const llvm::Target *target = llvm::TargetRegistry::lookupTarget(targetTriple, errorString);
if (!target) {
cerr << errorString << endl;
exit(1);
}
llvm::TargetOptions options;
llvm::TargetMachine *targetMachine = target->createTargetMachine(targetTriple, "generic", "", options, llvm::Reloc::PIC_);
module->setDataLayout(targetMachine->createDataLayout());
module->setTargetTriple(targetTriple);
string fileName;
llvm::CodeGenFileType codeGenFileType;
switch (outputKind) {
case OutputKind::ASSEMBLY:
fileName = string(module->getName()) + ".asm";
codeGenFileType = llvm::CodeGenFileType::AssemblyFile;
break;
case OutputKind::OBJECT:
fileName = string(module->getName()) + ".o";
codeGenFileType = llvm::CodeGenFileType::ObjectFile;
break;
}
error_code errorCode;
llvm::raw_fd_ostream outputFile(fileName, errorCode, llvm::sys::fs::OF_None);
if (errorCode) {
cerr << errorCode.message();
exit(1);
}
llvm::legacy::PassManager passManager;
if (targetMachine->addPassesToEmitFile(passManager, outputFile, nullptr, codeGenFileType)) {
cerr << "Failed to generate file " << fileName << endl;
exit(1);
}
passManager.run(*module);
outputFile.flush();
}