Added code builder
This commit is contained in:
44
src/CodeGenerator.cpp
Normal file
44
src/CodeGenerator.cpp
Normal 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
25
src/CodeGenerator.h
Normal 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
|
||||||
46
src/main.cpp
46
src/main.cpp
@@ -6,17 +6,9 @@
|
|||||||
|
|
||||||
#include "Expression.h"
|
#include "Expression.h"
|
||||||
#include "Parser.h"
|
#include "Parser.h"
|
||||||
#include "ModuleBuilder.h"
|
|
||||||
|
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "ModuleBuilder.h"
|
||||||
#include "llvm/Support/FileSystem.h"
|
#include "CodeGenerator.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"
|
|
||||||
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@@ -56,38 +48,8 @@ int main(int argc, char **argv) {
|
|||||||
shared_ptr<llvm::Module> module = moduleBuilder.getModule();
|
shared_ptr<llvm::Module> module = moduleBuilder.getModule();
|
||||||
module->print(llvm::outs(), nullptr);
|
module->print(llvm::outs(), nullptr);
|
||||||
|
|
||||||
llvm::InitializeAllTargetInfos();
|
CodeGenerator codeGenerator(module);;
|
||||||
llvm::InitializeAllTargets();
|
codeGenerator.generateObjectFile("dummy.s");
|
||||||
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();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user