hello-mlir/main.cpp

57 lines
1.6 KiB
C++

#include "Lexer.h"
#include "Parser.h"
#include <llvm/Support/CommandLine.h>
#include <llvm/Support/ErrorOr.h>
#include <llvm/Support/MemoryBuffer.h>
static llvm::cl::opt<std::string> inputFilename(llvm::cl::Positional,
llvm::cl::desc("<input hello file>"),
llvm::cl::init("-"),
llvm::cl::value_desc("filename"));
namespace
{
enum Action { None, DumpSyntaxNode };
}
static llvm::cl::opt<Action> emitAction("emit", llvm::cl::desc("Select the kind of output desired"),
llvm::cl::values(clEnumValN(DumpSyntaxNode, "ast", "Dump syntax node")));
std::unique_ptr<hello::Module> parseInputFile(llvm::StringRef filename)
{
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> fileOrErr =
llvm::MemoryBuffer::getFileOrSTDIN(filename);
if (std::error_code ec = fileOrErr.getError())
{
llvm::errs() << "Could not open input file: " << ec.message() << "\n";
return nullptr;
}
auto buffer = fileOrErr.get()->getBuffer();
hello::LexerBuffer lexer(buffer.begin(), buffer.end(), std::string(filename));
hello::Parser parser(lexer);
return parser.parseModule();
}
int main(int argc, char** argv)
{
llvm::cl::ParseCommandLineOptions(argc, argv, "Hello MLIR Compiler\n");
auto module = parseInputFile(inputFilename);
if (!module)
{
return 1;
}
switch (emitAction)
{
case DumpSyntaxNode:
module->dump();
return 0;
default:
llvm::errs() << "Unrecognized action\n";
return 1;
}
}