diff --git a/src/CodeGenerator.cpp b/src/CodeGenerator.cpp new file mode 100644 index 0000000..0abd80c --- /dev/null +++ b/src/CodeGenerator.cpp @@ -0,0 +1,44 @@ +#include "CodeGenerator.h" + +using namespace std; + +CodeGenerator::CodeGenerator(shared_ptr 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(); +} \ No newline at end of file diff --git a/src/CodeGenerator.h b/src/CodeGenerator.h new file mode 100644 index 0000000..5dc3a44 --- /dev/null +++ b/src/CodeGenerator.h @@ -0,0 +1,25 @@ +#ifndef CODE_GENERATOR_H +#define CODE_GENERATOR_H + +#include + +#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 module; + +public: + CodeGenerator(shared_ptr module); + void generateObjectFile(string fileName); +}; + +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index c08ae04..9a6a84f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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 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; } \ No newline at end of file