Browse Source

misc

rlbr-dev
Larry Xue 5 years ago
parent
commit
03fa84f637
  1. 19
      c2logic/compiler.py
  2. 17
      examples/control_flow.c

19
c2logic/compiler.py

@ -25,14 +25,14 @@ class Compiler(c_ast.NodeVisitor):
""" """
def __init__(self, opt_level=0): def __init__(self, opt_level=0):
self.opt_level = opt_level self.opt_level = opt_level
self.functions = []
self.functions: dict = None
self.curr_function: Function = None self.curr_function: Function = None
self.loop_start: int = None self.loop_start: int = None
self.loop_end_jumps: list = None self.loop_end_jumps: list = None
#self.cond_jump_offset: int = None #self.cond_jump_offset: int = None
def compile(self, filename: str): def compile(self, filename: str):
self.functions = []
self.functions = {}
self.curr_function = None self.curr_function = None
self.loop_start = None self.loop_start = None
self.cond_jump_offset = None self.cond_jump_offset = None
@ -41,10 +41,10 @@ class Compiler(c_ast.NodeVisitor):
#TODO actually handle functions properly #TODO actually handle functions properly
out = [] out = []
offset = 0 offset = 0
for function in self.functions:
for function in self.functions.values():
function.start = offset function.start = offset
offset += len(function.instructions) offset += len(function.instructions)
for function in self.functions:
for function in self.functions.values():
instructions = function.instructions instructions = function.instructions
out2 = [] out2 = []
for instruction in instructions: for instruction in instructions:
@ -112,15 +112,16 @@ class Compiler(c_ast.NodeVisitor):
#visitors #visitors
def visit_FuncDef(self, node): # function definitions def visit_FuncDef(self, node): # function definitions
func_name = node.decl.name
func_decl = node.decl.type func_decl = node.decl.type
args = [arg_decl.name for arg_decl in func_decl.args.params] args = [arg_decl.name for arg_decl in func_decl.args.params]
self.curr_function = Function(node.decl.name, args, [], None)
self.curr_function = Function(func_name, args, [], None)
self.visit(node.body) self.visit(node.body)
#in case for loop is the last thing in a function to ensure the jump target is valid #in case for loop is the last thing in a function to ensure the jump target is valid
if self.loop_start is not None: if self.loop_start is not None:
self.push(Noop()) self.push(Noop())
self.functions.append(self.curr_function)
self.functions[func_name] = self.curr_function
def visit_Decl(self, node): def visit_Decl(self, node):
if isinstance(node.type, TypeDecl): # variable declaration if isinstance(node.type, TypeDecl): # variable declaration
@ -135,7 +136,6 @@ class Compiler(c_ast.NodeVisitor):
#TODO structs #TODO structs
raise NotImplementedError(node) raise NotImplementedError(node)
elif isinstance(node.type, Enum): elif isinstance(node.type, Enum):
if node.type.name != "RadarTarget":
#TODO enums #TODO enums
raise NotImplementedError(node) raise NotImplementedError(node)
else: else:
@ -322,9 +322,10 @@ def main():
import argparse import argparse
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("file") parser.add_argument("file")
parser.add_argument("-O", "--optimization-level", type=int, default=1)
parser.add_argument("-O", "--optimization-level", type=int, choices=range(3), default=1)
parser.add_argument("-o", "--output", type=argparse.FileType('w'), default="-")
args = parser.parse_args() args = parser.parse_args()
print(Compiler(args.optimization_level).compile(args.file))
print(Compiler(args.optimization_level).compile(args.file), file=args.output)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

17
examples/control_flow.c

@ -1,20 +1,28 @@
#include "../include/mindustry.h" #include "../include/mindustry.h"
/*expected output:
5678
0246
0 is not 3
*/
extern struct MindustryObject message1; extern struct MindustryObject message1;
void main(void) { void main(void) {
int i = 0;
int i;
for (i = 5; i < 9; i++) { for (i = 5; i < 9; i++) {
printd(i); printd(i);
} }
i = 0;
print("\n");
do { do {
if (i % 2 == 1) { if (i % 2 == 1) {
i++;
continue; continue;
} }
printd(i); printd(i);
++i;
if (i == 8) {
if (i == 6) {
break; break;
} }
} while (!(i >= 10));
++i;
} while (i < 10);
print("\n"); print("\n");
i = 0; i = 0;
printd(i); printd(i);
@ -25,5 +33,4 @@ void main(void) {
} }
print("\n"); print("\n");
printflush(message1); printflush(message1);
asm("noop");
} }
Loading…
Cancel
Save