4 #include <boost/foreach.hpp>
6 #include <core/assert.hh>
7 #include <core/string.hh>
8 #include <core/process.hh>
10 #include <ast/ascii-visitor.hh>
11 #include <ast/llvm-asm-generator-visitor.hh>
12 #include <ast/type-checker-visitor.hh>
13 #include <ast/simplify-visitor.hh>
14 #include <ast/scope-builder-visitor.hh>
15 #include <lang/parser-factory.hh>
16 #include <compiler.hh>
18 #include <parse-task.hh>
20 template class core::Singleton
<Compiler
>;
23 : core::Singleton
<Compiler
>(),
26 astDumpTypeCheck_(false),
27 astDumpSimplify_(false)
36 Compiler::addTask(Task
* task
)
39 std::vector
<Task
*> * deps
= task
->dependancies();
42 BOOST_FOREACH(Task
* dep
, *deps
)
46 tasks_
.push_back(task
);
52 std::sort(tasks_
.begin(), tasks_
.end());
53 std::unique(tasks_
.begin(), tasks_
.end());
54 BOOST_FOREACH(Task
* task
, tasks_
)
62 Compiler::work(Task
& /*task*/)
68 Compiler::work(ParseTask
& task
)
70 ast::File
* file
= lang::ParserFactory::parseFile(task
.filename
);
71 file
->path
= task
.filename
;
73 std::cout
<< "Parsed AST" << std::endl
;
78 ast::ScopeBuilderVisitor sbv
;
81 ast::TypeCheckerVisitor tcv
;
83 if (astDumpTypeCheck_
) {
84 std::cout
<< "TypeChecked AST" << std::endl
;
89 ast::SimplifyVisitor sv
;
91 if (astDumpSimplify_
) {
92 std::cout
<< "Simplified AST" << std::endl
;
97 std::string
asm_filename(task
.filename
);
98 core::replace_extention(asm_filename
, "ll");
99 std::ofstream
asm_stream(asm_filename
.c_str(),
100 std::ios_base::out
| std::ios_base::trunc
);
101 ast::LLVMAsmGeneratorVisitor
lgv(asm_stream
);
105 core::Process llvm_as
;
106 llvm_as
.setBinary("llvm-as");
107 llvm_as
.addArg("-f");
108 llvm_as
.addArg(asm_filename
);
110 assert(!llvm_as
.wait());
112 std::string
bc_filename(asm_filename
);
113 core::replace_extention(bc_filename
, "bc");
114 std::string
bin_filename(asm_filename
);
115 core::replace_extention(bin_filename
, "");
116 core::Process llvm_ld
;
117 llvm_ld
.setBinary("llvm-ld");
118 llvm_ld
.addArg("-native");
119 llvm_ld
.addArg("-o");
120 llvm_ld
.addArg(bin_filename
);
121 llvm_ld
.addArg(bc_filename
);
123 assert(!llvm_ld
.wait());