329
|
1
|
|
2 """
|
|
3 Defines task classes that can compile, link etc..
|
|
4 Task can depend upon one another.
|
|
5 """
|
|
6
|
|
7 import logging
|
|
8
|
|
9 from .c3 import Builder
|
|
10 from .irutils import Verifier
|
|
11 from .codegen import CodeGenerator
|
|
12 from .transform import CleanPass, RemoveAddZero
|
|
13 from .tasks import Task
|
|
14 from . import DiagnosticsManager
|
|
15
|
|
16
|
|
17 class Assemble(Task):
|
|
18 def __init__(self):
|
|
19 super().__init__('Assemble')
|
|
20
|
|
21 def run(self):
|
|
22 pass
|
|
23
|
|
24
|
|
25 class Compile(Task):
|
|
26 """ Task that compiles source to some target """
|
|
27 def __init__(self, sources, includes, target, output_object):
|
|
28 super().__init__('Compile')
|
|
29 self.sources = sources
|
|
30 self.includes = includes
|
|
31 self.target = target
|
|
32 self.output = output_object
|
|
33
|
|
34 def run(self):
|
|
35 logger = logging.getLogger('zcc')
|
|
36 logger.info('Zcc started {}'.format(self.sources))
|
|
37 diag = DiagnosticsManager()
|
|
38 c3b = Builder(diag, self.target)
|
|
39 cg = CodeGenerator(self.target)
|
|
40
|
|
41 for ircode in c3b.build(self.sources, self.includes):
|
|
42 if not ircode:
|
|
43 return
|
|
44
|
|
45 d = {'ircode':ircode}
|
|
46 logger.info('Verifying code {}'.format(ircode), extra=d)
|
|
47 Verifier().verify(ircode)
|
|
48
|
|
49 # Optimization passes:
|
|
50 CleanPass().run(ircode)
|
|
51 Verifier().verify(ircode)
|
|
52 RemoveAddZero().run(ircode)
|
|
53 Verifier().verify(ircode)
|
|
54 CleanPass().run(ircode)
|
|
55 Verifier().verify(ircode)
|
|
56
|
|
57 # Code generation:
|
|
58 d = {'ircode':ircode}
|
|
59 logger.info('Starting code generation for {}'.format(ircode), extra=d)
|
|
60 cg.generate(ircode, self.output)
|
|
61
|
|
62 # TODO: fixup references, do this in another way?
|
|
63 self.output.backpatch()
|
|
64 if not c3b.ok:
|
|
65 diag.printErrors()
|
|
66 raise TaskError('Compile errors')
|
|
67
|
|
68
|
|
69 class Link(Task):
|
|
70 def __init__(self, objects, output_file):
|
|
71 super().__init__('Link')
|
|
72
|
|
73
|
|
74 class ObjCopy(Task):
|
|
75 pass
|
|
76
|
|
77
|
|
78 def load_recipe(recipe, runner):
|
|
79 """ Loads a recipe dictionary into a task runner """
|
|
80 if 'compile' in recipe:
|
|
81 #sources =
|
|
82 runner.add_task(Compile())
|
|
83 else:
|
|
84 raise Exception()
|
|
85
|