Added code builder

This commit is contained in:
Rafał Grodziński
2025-05-31 19:02:42 +09:00
parent cafcbd467f
commit c6f2156e3b
3 changed files with 73 additions and 42 deletions

44
src/CodeGenerator.cpp Normal file
View File

@@ -0,0 +1,44 @@
#include "CodeGenerator.h"
using namespace std;
CodeGenerator::CodeGenerator(shared_ptr<llvm::Module> module): module(module) {
}
void CodeGenerator::generateObjectFile(string fileName) {
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);
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, llvm::CodeGenFileType::AssemblyFile)) {
cerr << "Failed to emit file" << endl;
exit(1);
}
passManager.run(*module);
outputFile.flush();
}

25
src/CodeGenerator.h Normal file
View File

@@ -0,0 +1,25 @@
#ifndef CODE_GENERATOR_H
#define CODE_GENERATOR_H
#include <iostream>
#include "llvm/IR/Module.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/TargetParser/Host.h"
using namespace std;
class CodeGenerator {
private:
shared_ptr<llvm::Module> module;
public:
CodeGenerator(shared_ptr<llvm::Module> module);
void generateObjectFile(string fileName);
};
#endif

View File

@@ -6,17 +6,9 @@
#include "Expression.h"
#include "Parser.h"
#include "ModuleBuilder.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/TargetParser/Host.h"
#include "ModuleBuilder.h"
#include "CodeGenerator.h"
using namespace std;
@@ -56,38 +48,8 @@ int main(int argc, char **argv) {
shared_ptr<llvm::Module> module = moduleBuilder.getModule();
module->print(llvm::outs(), nullptr);
llvm::InitializeAllTargetInfos();
llvm::InitializeAllTargets();
llvm::InitializeAllTargetMCs();
llvm::InitializeAllAsmParsers();
llvm::InitializeAllAsmPrinters();
string targetTriple = llvm::sys::getDefaultTargetTriple();
cout << targetTriple << endl;
string errorString;
const llvm::Target *target = llvm::TargetRegistry::lookupTarget(targetTriple, errorString);
cout << errorString << endl;
llvm::TargetOptions options;
llvm::TargetMachine *targetMachine = target->createTargetMachine(targetTriple, "generic", "", options, llvm::Reloc::PIC_);
module->setDataLayout(targetMachine->createDataLayout());
module->setTargetTriple(targetTriple);
error_code errorCode;
llvm::raw_fd_ostream outputFile("test.o", errorCode, llvm::sys::fs::OF_None);
if (errorCode) {
cout << errorCode.message();
exit(1);
}
llvm::legacy::PassManager passManager;
if(targetMachine->addPassesToEmitFile(passManager, outputFile, nullptr, llvm::CodeGenFileType::AssemblyFile)) {
cout << "failed" << endl;
exit(1);
}
passManager.run(*module);
outputFile.flush();
CodeGenerator codeGenerator(module);;
codeGenerator.generateObjectFile("dummy.s");
return 0;
}