Finish draft of post 8 in compiler series
This commit is contained in:
parent
f7b5bb48d1
commit
9c34d48cdd
|
@ -1,2 +1,2 @@
|
||||||
defn main = { plus 320 6 }
|
defn main = { sum 320 6 }
|
||||||
defn plus x y = { x + y }
|
defn sum x y = { x + y }
|
||||||
|
|
|
@ -5,3 +5,4 @@ defn length l = {
|
||||||
Cons x xs -> { 1 + length xs }
|
Cons x xs -> { 1 + length xs }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
defn main = { length (Cons 1 (Cons 2 (Cons 3 Nil))) }
|
||||||
|
|
16
08/examples/works4.txt
Normal file
16
08/examples/works4.txt
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
data List = { Nil, Cons Int List }
|
||||||
|
|
||||||
|
defn add x y = { x + y }
|
||||||
|
defn mul x y = { x * y }
|
||||||
|
|
||||||
|
defn foldr f b l = {
|
||||||
|
case l of {
|
||||||
|
Nil -> { b }
|
||||||
|
Cons x xs -> { f x (foldr f b xs) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defn main = {
|
||||||
|
foldr add 0 (Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil)))) +
|
||||||
|
foldr mul 1 (Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil))))
|
||||||
|
}
|
17
08/examples/works5.txt
Normal file
17
08/examples/works5.txt
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
data List = { Nil, Cons Int List }
|
||||||
|
|
||||||
|
defn sumZip l m = {
|
||||||
|
case l of {
|
||||||
|
Nil -> { 0 }
|
||||||
|
Cons x xs -> {
|
||||||
|
case m of {
|
||||||
|
Nil -> { 0 }
|
||||||
|
Cons y ys -> { x + y + sumZip xs ys }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defn ones = { Cons 1 ones }
|
||||||
|
|
||||||
|
defn main = { sumZip ones (Cons 1 (Cons 2 (Cons 3 Nil))) }
|
|
@ -108,12 +108,12 @@ void output_llvm(llvm_context& ctx, const std::string& filename) {
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
llvm::raw_fd_ostream file(filename, ec, llvm::sys::fs::F_None);
|
llvm::raw_fd_ostream file(filename, ec, llvm::sys::fs::F_None);
|
||||||
if (ec) {
|
if (ec) {
|
||||||
std::cerr << "Could not open output file: " << ec.message() << std::endl;
|
throw 0;
|
||||||
} else {
|
} else {
|
||||||
llvm::TargetMachine::CodeGenFileType type = llvm::TargetMachine::CGFT_ObjectFile;
|
llvm::TargetMachine::CodeGenFileType type = llvm::TargetMachine::CGFT_ObjectFile;
|
||||||
llvm::legacy::PassManager pm;
|
llvm::legacy::PassManager pm;
|
||||||
if (targetMachine->addPassesToEmitFile(pm, file, NULL, type)) {
|
if (targetMachine->addPassesToEmitFile(pm, file, NULL, type)) {
|
||||||
std::cerr << "Unable to emit target code" << std::endl;
|
throw 0;
|
||||||
} else {
|
} else {
|
||||||
pm.run(ctx.module);
|
pm.run(ctx.module);
|
||||||
file.close();
|
file.close();
|
||||||
|
@ -136,7 +136,6 @@ void gen_llvm(const std::vector<definition_ptr>& prog) {
|
||||||
for(auto& definition : prog) {
|
for(auto& definition : prog) {
|
||||||
definition->gen_llvm_second(ctx);
|
definition->gen_llvm_second(ctx);
|
||||||
}
|
}
|
||||||
llvm::verifyModule(ctx.module);
|
|
||||||
ctx.module.print(llvm::outs(), nullptr);
|
ctx.module.print(llvm::outs(), nullptr);
|
||||||
output_llvm(ctx, "program.o");
|
output_llvm(ctx, "program.o");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user