Generate assembly or object file
This commit is contained in:
1
clean.sh
1
clean.sh
@@ -2,4 +2,5 @@
|
|||||||
|
|
||||||
rm -f brb
|
rm -f brb
|
||||||
rm -f *.o
|
rm -f *.o
|
||||||
|
rm -f *.asm
|
||||||
rm -rf *.dSYM
|
rm -rf *.dSYM
|
||||||
@@ -5,7 +5,7 @@ using namespace std;
|
|||||||
CodeGenerator::CodeGenerator(shared_ptr<llvm::Module> module): module(module) {
|
CodeGenerator::CodeGenerator(shared_ptr<llvm::Module> module): module(module) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeGenerator::generateObjectFile(string fileName) {
|
void CodeGenerator::generateObjectFile(OutputKind outputKind) {
|
||||||
llvm::InitializeAllTargetInfos();
|
llvm::InitializeAllTargetInfos();
|
||||||
llvm::InitializeAllTargets();
|
llvm::InitializeAllTargets();
|
||||||
llvm::InitializeAllTargetMCs();
|
llvm::InitializeAllTargetMCs();
|
||||||
@@ -26,6 +26,19 @@ void CodeGenerator::generateObjectFile(string fileName) {
|
|||||||
module->setDataLayout(targetMachine->createDataLayout());
|
module->setDataLayout(targetMachine->createDataLayout());
|
||||||
module->setTargetTriple(targetTriple);
|
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;
|
error_code errorCode;
|
||||||
llvm::raw_fd_ostream outputFile(fileName, errorCode, llvm::sys::fs::OF_None);
|
llvm::raw_fd_ostream outputFile(fileName, errorCode, llvm::sys::fs::OF_None);
|
||||||
if (errorCode) {
|
if (errorCode) {
|
||||||
@@ -34,8 +47,8 @@ void CodeGenerator::generateObjectFile(string fileName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
llvm::legacy::PassManager passManager;
|
llvm::legacy::PassManager passManager;
|
||||||
if (targetMachine->addPassesToEmitFile(passManager, outputFile, nullptr, llvm::CodeGenFileType::AssemblyFile)) {
|
if (targetMachine->addPassesToEmitFile(passManager, outputFile, nullptr, codeGenFileType)) {
|
||||||
cerr << "Failed to emit file" << endl;
|
cerr << "Failed to generate file " << fileName << endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,12 +14,18 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
class CodeGenerator {
|
class CodeGenerator {
|
||||||
|
public:
|
||||||
|
enum class OutputKind {
|
||||||
|
ASSEMBLY,
|
||||||
|
OBJECT
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
shared_ptr<llvm::Module> module;
|
shared_ptr<llvm::Module> module;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CodeGenerator(shared_ptr<llvm::Module> module);
|
CodeGenerator(shared_ptr<llvm::Module> module);
|
||||||
void generateObjectFile(string fileName);
|
void generateObjectFile(OutputKind outputKind);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -51,7 +51,7 @@ void ModuleBuilder::buildFunctionDeclaration(shared_ptr<StatementFunctionDeclara
|
|||||||
|
|
||||||
// build function declaration
|
// build function declaration
|
||||||
llvm::FunctionType *funType = llvm::FunctionType::get(typeForValueType(statement->getReturnValueType()), types, false);
|
llvm::FunctionType *funType = llvm::FunctionType::get(typeForValueType(statement->getReturnValueType()), types, false);
|
||||||
llvm::Function *fun = llvm::Function::Create(funType, llvm::GlobalValue::InternalLinkage, statement->getName(), module.get());
|
llvm::Function *fun = llvm::Function::Create(funType, llvm::GlobalValue::ExternalLinkage, statement->getName(), module.get());
|
||||||
funMap[statement->getName()] = fun;
|
funMap[statement->getName()] = fun;
|
||||||
|
|
||||||
// define function body
|
// define function body
|
||||||
|
|||||||
13
src/main.cpp
13
src/main.cpp
@@ -37,8 +37,15 @@ void versionPrinter(llvm::raw_ostream &os) {
|
|||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
llvm::cl::SetVersionPrinter(versionPrinter);
|
llvm::cl::SetVersionPrinter(versionPrinter);
|
||||||
llvm::cl::extrahelp("\nADDITIONAL HELP:\n\n This is the extra help\n");
|
llvm::cl::extrahelp("\nADDITIONAL HELP:\n\n This is the extra help\n");
|
||||||
|
|
||||||
llvm::cl::opt<bool> isVerbose("v", llvm::cl::desc("Verbos output"), llvm::cl::init(false));
|
llvm::cl::opt<bool> isVerbose("v", llvm::cl::desc("Verbos output"), llvm::cl::init(false));
|
||||||
|
llvm::cl::opt<CodeGenerator::OutputKind> outputKind(
|
||||||
|
llvm::cl::desc("Choose generated output:"),
|
||||||
|
llvm::cl::init(CodeGenerator::OutputKind::OBJECT),
|
||||||
|
llvm::cl::values(
|
||||||
|
clEnumValN(CodeGenerator::OutputKind::OBJECT, "c", "Generate object file"),
|
||||||
|
clEnumValN(CodeGenerator::OutputKind::ASSEMBLY, "S", "Generate assembly file")
|
||||||
|
)
|
||||||
|
);
|
||||||
llvm::cl::opt<string> inputFileName(llvm::cl::Positional, llvm::cl::desc("<input file>"), llvm::cl::Required);
|
llvm::cl::opt<string> inputFileName(llvm::cl::Positional, llvm::cl::desc("<input file>"), llvm::cl::Required);
|
||||||
llvm::cl::ParseCommandLineOptions(argc, argv, "Bits Runner Builder - LLVM based compiler for the Bits Runner Code language");
|
llvm::cl::ParseCommandLineOptions(argc, argv, "Bits Runner Builder - LLVM based compiler for the Bits Runner Code language");
|
||||||
|
|
||||||
@@ -73,8 +80,8 @@ int main(int argc, char **argv) {
|
|||||||
module->print(llvm::outs(), nullptr);
|
module->print(llvm::outs(), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
//CodeGenerator codeGenerator(module);
|
CodeGenerator codeGenerator(module);
|
||||||
//codeGenerator.generateObjectFile("dummy.s");
|
codeGenerator.generateObjectFile(outputKind);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user