Generate assembly or object file
This commit is contained in:
@@ -5,7 +5,7 @@ using namespace std;
|
||||
CodeGenerator::CodeGenerator(shared_ptr<llvm::Module> module): module(module) {
|
||||
}
|
||||
|
||||
void CodeGenerator::generateObjectFile(string fileName) {
|
||||
void CodeGenerator::generateObjectFile(OutputKind outputKind) {
|
||||
llvm::InitializeAllTargetInfos();
|
||||
llvm::InitializeAllTargets();
|
||||
llvm::InitializeAllTargetMCs();
|
||||
@@ -26,6 +26,19 @@ void CodeGenerator::generateObjectFile(string fileName) {
|
||||
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) {
|
||||
@@ -34,8 +47,8 @@ void CodeGenerator::generateObjectFile(string fileName) {
|
||||
}
|
||||
|
||||
llvm::legacy::PassManager passManager;
|
||||
if (targetMachine->addPassesToEmitFile(passManager, outputFile, nullptr, llvm::CodeGenFileType::AssemblyFile)) {
|
||||
cerr << "Failed to emit file" << endl;
|
||||
if (targetMachine->addPassesToEmitFile(passManager, outputFile, nullptr, codeGenFileType)) {
|
||||
cerr << "Failed to generate file " << fileName << endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,12 +14,18 @@
|
||||
using namespace std;
|
||||
|
||||
class CodeGenerator {
|
||||
public:
|
||||
enum class OutputKind {
|
||||
ASSEMBLY,
|
||||
OBJECT
|
||||
};
|
||||
|
||||
private:
|
||||
shared_ptr<llvm::Module> module;
|
||||
|
||||
public:
|
||||
CodeGenerator(shared_ptr<llvm::Module> module);
|
||||
void generateObjectFile(string fileName);
|
||||
void generateObjectFile(OutputKind outputKind);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -51,7 +51,7 @@ void ModuleBuilder::buildFunctionDeclaration(shared_ptr<StatementFunctionDeclara
|
||||
|
||||
// build function declaration
|
||||
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;
|
||||
|
||||
// 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) {
|
||||
llvm::cl::SetVersionPrinter(versionPrinter);
|
||||
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<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::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);
|
||||
}
|
||||
|
||||
//CodeGenerator codeGenerator(module);
|
||||
//codeGenerator.generateObjectFile("dummy.s");
|
||||
CodeGenerator codeGenerator(module);
|
||||
codeGenerator.generateObjectFile(outputKind);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user