ADD: CLI calls clang++.
parent
bd819bfc54
commit
506961fff5
|
@ -21,7 +21,7 @@ namespace wg
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void Compiler::gen()
|
void Compiler::gen(std::filesystem::path obj)
|
||||||
{
|
{
|
||||||
auto target_triple = llvm::sys::getDefaultTargetTriple();
|
auto target_triple = llvm::sys::getDefaultTargetTriple();
|
||||||
llvm::InitializeAllTargetInfos();
|
llvm::InitializeAllTargetInfos();
|
||||||
|
@ -53,7 +53,7 @@ namespace wg
|
||||||
m_module->setDataLayout(target_machine->createDataLayout());
|
m_module->setDataLayout(target_machine->createDataLayout());
|
||||||
m_module->setTargetTriple(target_triple);
|
m_module->setTargetTriple(target_triple);
|
||||||
|
|
||||||
auto filename = "output.o";
|
auto filename = obj.string();
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
|
|
||||||
llvm::raw_fd_ostream dest(filename, ec, llvm::sys::fs::OF_None);
|
llvm::raw_fd_ostream dest(filename, ec, llvm::sys::fs::OF_None);
|
||||||
|
@ -71,9 +71,6 @@ namespace wg
|
||||||
pass.run(*m_module);
|
pass.run(*m_module);
|
||||||
|
|
||||||
dest.flush();
|
dest.flush();
|
||||||
m_module->print(llvm::errs(), nullptr);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Value* Compiler::compile(std::shared_ptr<Node> node)
|
llvm::Value* Compiler::compile(std::shared_ptr<Node> node)
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace wg
|
||||||
explicit Compiler();
|
explicit Compiler();
|
||||||
virtual ~Compiler();
|
virtual ~Compiler();
|
||||||
|
|
||||||
void gen();
|
void gen(std::filesystem::path obj);
|
||||||
|
|
||||||
llvm::Value* compile(std::shared_ptr<Node> node);
|
llvm::Value* compile(std::shared_ptr<Node> node);
|
||||||
private:
|
private:
|
||||||
|
|
86
src/main.cpp
86
src/main.cpp
|
@ -1,22 +1,29 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <getopt.h>
|
||||||
#include <Lexer.hpp>
|
#include <Lexer.hpp>
|
||||||
#include <Parser.hpp>
|
#include <Parser.hpp>
|
||||||
#include <Compiler.hpp>
|
#include <Compiler.hpp>
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
std::filesystem::path name_to_obj(std::string const& path)
|
||||||
{
|
{
|
||||||
if (argc < 2)
|
return std::filesystem::path(path).stem().string() + ".o";
|
||||||
{
|
}
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
void load(std::string const& path)
|
||||||
|
{
|
||||||
std::string source;
|
std::string source;
|
||||||
|
|
||||||
// Get Sources
|
// Get Sources
|
||||||
{
|
{
|
||||||
std::ifstream file {argv[1]};
|
std::ifstream file {path};
|
||||||
|
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
std::cerr << "unknown file '"<< path <<"'" << std::endl;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
std::string line;
|
std::string line;
|
||||||
|
|
||||||
while (std::getline(file, line))
|
while (std::getline(file, line))
|
||||||
|
@ -35,7 +42,70 @@ int main(int argc, char** argv)
|
||||||
|
|
||||||
wg::Compiler compiler;
|
wg::Compiler compiler;
|
||||||
compiler.compile(ast);
|
compiler.compile(ast);
|
||||||
compiler.gen();
|
compiler.gen(name_to_obj(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
std::filesystem::path output_path = "a.out";
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
static struct option options[] = {
|
||||||
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"output", required_argument, 0, 'o'},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
int option_index = 0;
|
||||||
|
|
||||||
|
int c = getopt_long(argc, argv, "ho:",
|
||||||
|
options, &option_index);
|
||||||
|
if (c == -1)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case 'h': {
|
||||||
|
std::cout << "Usage: wongoc [OPTIONS] <sources>" << std::endl;
|
||||||
|
std::cout << "OPTIONS" << std::endl;
|
||||||
|
|
||||||
|
std::cout << "\t" << "-h, --help," <<
|
||||||
|
"\t" << "show this message" << std::endl;
|
||||||
|
std::cout << "\t" << "-o, --output," <<
|
||||||
|
"\t" << "set the output binary name" << std::endl;
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case 'o': {
|
||||||
|
output_path = std::filesystem::path(optarg);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind < argc)
|
||||||
|
{
|
||||||
|
while (optind < argc)
|
||||||
|
{
|
||||||
|
load(argv[optind]);
|
||||||
|
auto objname = name_to_obj(argv[optind]).string();
|
||||||
|
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "clang++" << " -o " << output_path << " ";
|
||||||
|
ss << objname;
|
||||||
|
|
||||||
|
system(ss.str().c_str());
|
||||||
|
|
||||||
|
std::filesystem::remove(objname);
|
||||||
|
|
||||||
|
optind++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue