Mercurial > projects > dang
annotate gen/CodeGen.d @ 183:8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Fri, 25 Jul 2008 10:59:16 +0200 |
parents | 59cd211a1bd3 |
children | 7b274cfdc1dc |
rev | line source |
---|---|
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1 module gen.CodeGen; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
2 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
3 import tango.io.Stdout, |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
4 Int = tango.text.convert.Integer; |
54
d84fec04d462
Move all root var-decls so they are generated before anything else
Anders Halager <halager@gmail.com>
parents:
53
diff
changeset
|
5 import tango.core.Array : find, partition; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
6 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
7 import llvm.llvm; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
8 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
9 import ast.Decl, |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
10 ast.Stmt, |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
11 ast.Exp, |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
12 ast.Module : DModule = Module; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
13 |
119
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
14 import basic.SmallArray, |
143
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
15 basic.Attribute, |
119
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
16 basic.LiteralParsing; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
17 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
18 import lexer.Token; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
19 |
92
771ac63898e2
A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents:
89
diff
changeset
|
20 import sema.Scope, |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
21 sema.Visitor; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
22 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
23 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
24 Wrapper for Values representing rvalues (things you can only read from) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
25 **/ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
26 private struct RValue |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
27 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
28 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
29 Returns true if this is a simple value, like an int or a pointer. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
30 This is basicly anything except a struct, which will contain a Value that |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
31 is a pointer to the struct. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
32 **/ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
33 bool isSimple() { return simple; } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
34 /// Opposite of isSimple |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
35 bool isAggregate() { return !simple; } |
94
48bb2287c035
Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents:
93
diff
changeset
|
36 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
37 Value value; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
38 private bool simple = true; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
39 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
40 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
41 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
42 Wrapper for Values representing lvalues (things you can write to) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
43 **/ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
44 private struct LValue |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
45 { |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
46 Value getAddress() { return value; } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
47 private Value value; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
48 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
49 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
50 class CodeGen |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
51 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
52 public: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
53 this() |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
54 { |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
55 b = new Builder; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
56 ZeroIndex = ConstantInt.GetU(Type.Int32, 0); |
137
efbf51d85f4d
No reason to explicitly add structs as llvm types
Anders Halager <halager@gmail.com>
parents:
136
diff
changeset
|
57 |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
58 table = new SimpleSymbolTable(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
59 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
60 createBasicTypes(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
61 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
62 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
63 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
64 Generate a new module. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
65 **/ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
66 /* |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
67 Find all function decls and add the functions to the llvm module, so |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
68 they can be referenced. |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
69 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
70 Make sure all var-decls are located before functions, so we wont get |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
71 problems when referencing the global vars. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
72 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
73 Generate the actual llvm code needed for all decls |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
74 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
75 Optimize if requested |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
76 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
77 Write to filehandle (can be a file or stdout) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
78 */ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
79 void gen(DModule mod, uint handle, bool optimize, bool inline) |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
80 { |
101
fea8d61a2451
First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents:
98
diff
changeset
|
81 this.mod = mod; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
82 // create module |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
83 m = new .llvm.llvm.Module("main_module"); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
84 scope(exit) m.dispose(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
85 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
86 table.enterScope; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
87 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
88 BytePtr = PointerType.Get(Type.Int8); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
89 auto temp = FunctionType.Get( |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
90 Type.Void, |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
91 [BytePtr, BytePtr, Type.Int32, Type.Int32]); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
92 llvm_memcpy = m.addFunction(temp, "llvm.memcpy.i32"); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
93 |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
94 auto registerFunc = |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
95 (FuncDecl fd) |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
96 { |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
97 Type[] param_types; |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
98 foreach (i, p; fd.type.params) |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
99 { |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
100 if (auto st = p.asStruct()) |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
101 { |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
102 Type pointer = PointerType.Get(llvm(st)); |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
103 param_types ~= pointer; |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
104 } |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
105 else if (auto ar = p.asArray()) |
86
29f486ccc203
Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents:
85
diff
changeset
|
106 { |
29f486ccc203
Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents:
85
diff
changeset
|
107 Type pointer = PointerType.Get(llvm(ar)); |
29f486ccc203
Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents:
85
diff
changeset
|
108 param_types ~= pointer; |
29f486ccc203
Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents:
85
diff
changeset
|
109 } |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
110 else |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
111 param_types ~= llvm(p); |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
112 } |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
113 auto ret_t = fd.type.returnType; |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
114 if(auto st = cast(DStruct)ret_t) |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
115 ret_t = DType.Void; |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
116 else if(auto f = cast(DFunction)ret_t) |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
117 ret_t = f.returnType; |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
118 auto func_t = FunctionType.Get(llvm(ret_t), param_types); |
143
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
119 auto llfunc = m.addFunction(func_t, symbolName(fd)); |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
120 |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
121 foreach (i, p; fd.funcArgs) |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
122 { |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
123 if(i == 0 && fd.sret) |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
124 llfunc.addParamAttr(0, ParamAttr.StructRet); |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
125 |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
126 DType t = fd.type.params[i]; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
127 if (auto st = t.asStruct) |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
128 { |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
129 if (i == 0 && fd.sret) |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
130 continue; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
131 llfunc.addParamAttr(i, ParamAttr.ByVal); |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
132 } |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
133 else if (auto ar = t.asArray) |
86
29f486ccc203
Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents:
85
diff
changeset
|
134 { |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
135 llfunc.addParamAttr(i, ParamAttr.ByVal); |
86
29f486ccc203
Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents:
85
diff
changeset
|
136 } |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
137 } |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
138 }; |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
139 auto visitor = new VisitFuncDecls(registerFunc); |
101
fea8d61a2451
First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents:
98
diff
changeset
|
140 visitor.visit([mod]); |
54
d84fec04d462
Move all root var-decls so they are generated before anything else
Anders Halager <halager@gmail.com>
parents:
53
diff
changeset
|
141 // Before beginning we move all top level var-decls to the start |
d84fec04d462
Move all root var-decls so they are generated before anything else
Anders Halager <halager@gmail.com>
parents:
53
diff
changeset
|
142 // and then we generate the var-decls first |
d84fec04d462
Move all root var-decls so they are generated before anything else
Anders Halager <halager@gmail.com>
parents:
53
diff
changeset
|
143 // partition is NOT required to be stable, but that should not create |
d84fec04d462
Move all root var-decls so they are generated before anything else
Anders Halager <halager@gmail.com>
parents:
53
diff
changeset
|
144 // any problems. |
94
48bb2287c035
Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents:
93
diff
changeset
|
145 partition(mod.decls, (Decl d) { return d.declType == DeclType.VarDecl; }); |
54
d84fec04d462
Move all root var-decls so they are generated before anything else
Anders Halager <halager@gmail.com>
parents:
53
diff
changeset
|
146 |
94
48bb2287c035
Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents:
93
diff
changeset
|
147 foreach (decl; mod.decls) |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
148 genRootDecl(decl); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
149 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
150 table.leaveScope; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
151 |
92
771ac63898e2
A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents:
89
diff
changeset
|
152 // debug m.verify(); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
153 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
154 if(optimize) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
155 m.optimize(inline); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
156 |
89
a49bb982a7b0
Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents:
88
diff
changeset
|
157 m.writeBitcodeToFileHandle(handle); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
158 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
159 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
160 private: |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
161 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
162 Generate a single top-level Decl |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
163 **/ |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
164 void genRootDecl(Decl decl) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
165 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
166 switch(decl.declType) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
167 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
168 case DeclType.FuncDecl: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
169 FuncDecl funcDecl = cast(FuncDecl)decl; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
170 |
82
06dda301ea61
Can declare outside functions and call c-functions
Anders Johnsen <skabet@gmail.com>
parents:
81
diff
changeset
|
171 // Empty function - declare; |
06dda301ea61
Can declare outside functions and call c-functions
Anders Johnsen <skabet@gmail.com>
parents:
81
diff
changeset
|
172 if(funcDecl.emptyFunction) |
06dda301ea61
Can declare outside functions and call c-functions
Anders Johnsen <skabet@gmail.com>
parents:
81
diff
changeset
|
173 return; |
06dda301ea61
Can declare outside functions and call c-functions
Anders Johnsen <skabet@gmail.com>
parents:
81
diff
changeset
|
174 |
64
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
175 llvm(funcDecl.type); |
143
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
176 auto llfunc = m.getNamedFunction(symbolName(funcDecl)); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
177 auto func_tp = cast(PointerType)llfunc.type; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
178 auto func_t = cast(FunctionType)func_tp.elementType(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
179 auto ret_t = func_t.returnType(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
180 |
86
29f486ccc203
Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents:
85
diff
changeset
|
181 |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
182 auto bb = llfunc.appendBasicBlock("entry"); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
183 b.positionAtEnd(bb); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
184 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
185 table.enterScope; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
186 foreach (i, v; funcDecl.funcArgs) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
187 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
188 llfunc.getParam(i).name = v.identifier.get; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
189 auto name = v.identifier.get; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
190 if (!cast(PointerType)llfunc.getParam(i).type) |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
191 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
192 auto AI = b.buildAlloca(llfunc.getParam(i).type, name); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
193 // Value va = b.buildLoad(val, name); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
194 b.buildStore(llfunc.getParam(i), AI); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
195 table[name] = AI; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
196 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
197 else |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
198 table[name] = llfunc.getParam(i); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
199 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
200 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
201 foreach (stmt; funcDecl.statements) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
202 genStmt(stmt); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
203 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
204 // if the function didn't end with a return, we automatically |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
205 // add one (return 0 as default) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
206 if (b.getInsertBlock().terminated() is false) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
207 if (ret_t is Type.Void) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
208 b.buildRetVoid(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
209 else |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
210 b.buildRet(ConstantInt.GetS(ret_t, 0)); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
211 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
212 table.leaveScope; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
213 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
214 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
215 case DeclType.VarDecl: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
216 auto varDecl = cast(VarDecl)decl; |
129 | 217 auto id = varDecl.identifier; |
93
621cedba53ea
Removed the Symbol from semantics - it was not needed anymore. From now on you set the type by doing a setType on an Identifier.
Anders Johnsen <skabet@gmail.com>
parents:
92
diff
changeset
|
218 Type t = llvm(id.type); |
621cedba53ea
Removed the Symbol from semantics - it was not needed anymore. From now on you set the type by doing a setType on an Identifier.
Anders Johnsen <skabet@gmail.com>
parents:
92
diff
changeset
|
219 GlobalVariable g = m.addGlobal(t, id.get); |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
220 g.initializer = Constant.GetNull(t); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
221 table[varDecl.identifier.get] = g; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
222 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
223 |
175
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
224 case DeclType.StructDecl: |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
225 auto sdecl = cast(StructDecl)decl; |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
226 foreach (d; sdecl.decls) |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
227 { |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
228 auto func = cast(FuncDecl)d; |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
229 if (func is null) |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
230 continue; |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
231 genRootDecl(func); |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
232 } |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
233 break; |
c8e26556c24d
Codegen functions in structs
Anders Halager <halager@gmail.com>
parents:
174
diff
changeset
|
234 |
173
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
235 case DeclType.ClassDecl: |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
236 auto cdecl = cast(ClassDecl)decl; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
237 SmallArray!(Constant) functions; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
238 foreach (d; cdecl.decls) |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
239 { |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
240 auto func = cast(FuncDecl)d; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
241 if (func is null) |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
242 continue; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
243 genRootDecl(func); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
244 auto llvm_f = m.getNamedFunction(symbolName(func)); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
245 functions ~= Constant.GetBitCast(llvm_f, BytePtr); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
246 } |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
247 auto class_vtbl = ConstantArray.Get(BytePtr, functions.unsafe()); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
248 auto gv = m.addGlobal(class_vtbl, cdecl.identifier.get ~ "_vtable"); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
249 gv.linkage = Linkage.Weak; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
250 gv.globalConstant = true; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
251 break; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
252 |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
253 default: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
254 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
255 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
256 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
257 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
258 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
259 Generate a single local Decl |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
260 **/ |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
261 void genDecl(Decl decl) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
262 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
263 switch(decl.declType) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
264 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
265 case DeclType.VarDecl: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
266 auto varDecl = cast(VarDecl)decl; |
129 | 267 auto id = varDecl.identifier; |
268 auto name = id.get; | |
269 auto AI = b.buildAlloca(llvm(id.type), name); | |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
270 table[name] = AI; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
271 if (varDecl.init) |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
272 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
273 LValue dst = genLValue(varDecl.identifier); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
274 RValue src = genExpression(varDecl.init); |
129 | 275 storeThroughLValue(dst, src, id.type); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
276 } |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
277 break; |
129 | 278 |
173
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
279 case DeclType.FuncDecl, |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
280 DeclType.StructDecl, |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
281 DeclType.ClassDecl: |
129 | 282 genRootDecl(decl); |
283 break; | |
137
efbf51d85f4d
No reason to explicitly add structs as llvm types
Anders Halager <halager@gmail.com>
parents:
136
diff
changeset
|
284 |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
285 default: |
138
b61de188cd0d
Removed some unused code
Anders Halager <halager@gmail.com>
parents:
137
diff
changeset
|
286 break; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
287 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
288 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
289 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
290 // Remove - do it right (basic/Messages.d) |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
291 struct PE |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
292 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
293 static char[] NoImplicitConversion = |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
294 "Can't find an implicit conversion between %0 and %1"; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
295 static char[] VoidRetInNonVoidFunc = |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
296 "Only void functions can return without an expression"; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
297 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
298 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
299 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
300 Generate a single expression. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
301 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
302 This is the most general way of generating expressions and therefore |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
303 returns an RValue. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
304 **/ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
305 RValue genExpression(Exp exp) |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
306 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
307 switch(exp.expType) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
308 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
309 case ExpType.Binary: |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
310 return RValue(genBinExp(cast(BinaryExp)exp)); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
311 case ExpType.IntegerLit: |
119
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
312 auto integerLit = cast(IntegerLit)exp; |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
313 switch(integerLit.number.type) |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
314 { |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
315 case NumberType.Int: |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
316 return RValue(ConstantInt.GetS(Type.Int32, integerLit.number.integer)); |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
317 case NumberType.Long: |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
318 return RValue(ConstantInt.GetS(Type.Int64, integerLit.number.integer)); |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
319 case NumberType.ULong: |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
320 return RValue(ConstantInt.GetS(Type.Int64, integerLit.number.integer)); |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
321 case NumberType.Float: |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
322 return RValue(ConstantReal.Get(Type.Float, integerLit.number.floating)); |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
323 case NumberType.Double: |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
324 return RValue(ConstantReal.Get(Type.Double, integerLit.number.floating)); |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
325 case NumberType.Real: |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
326 return RValue(ConstantReal.Get(Type.X86_FP80, integerLit.number.floating)); |
c0b531362ca6
Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents:
118
diff
changeset
|
327 } |
160 | 328 case ExpType.StringExp: |
329 auto stringExp = cast(StringExp)exp; | |
330 char[] data = cast(char[])stringExp.data; | |
331 auto string_constant = ConstantArray.GetString(data, true); | |
332 auto gv = m.addGlobal(string_constant, "string"); | |
333 gv.linkage = Linkage.Internal; | |
334 gv.globalConstant = true; | |
335 return RValue(gv); | |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
336 case ExpType.Negate: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
337 auto negateExp = cast(NegateExp)exp; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
338 auto target = genExpression(negateExp.exp); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
339 return RValue(b.buildNeg(target.value, "neg")); |
78
ad956143dcdc
Parse and gen for dereferences
Anders Halager <halager@gmail.com>
parents:
74
diff
changeset
|
340 case ExpType.Deref: |
ad956143dcdc
Parse and gen for dereferences
Anders Halager <halager@gmail.com>
parents:
74
diff
changeset
|
341 auto derefExp = cast(DerefExp)exp; |
ad956143dcdc
Parse and gen for dereferences
Anders Halager <halager@gmail.com>
parents:
74
diff
changeset
|
342 auto target = genExpression(derefExp.exp); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
343 return RValue(b.buildLoad(target.value, "deref")); |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
344 case ExpType.AddressOfExp: |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
345 auto addrExp = cast(AddressOfExp)exp; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
346 auto target = genLValue(addrExp.exp); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
347 return RValue(target.getAddress()); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
348 case ExpType.AssignExp: |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
349 auto AE = cast(AssignExp)exp; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
350 LValue dst = genLValue(AE.identifier); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
351 RValue src = genExpression(AE.exp); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
352 storeThroughLValue(dst, src, AE.exp.type()); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
353 return src; |
83
9e90694f5da0
Parse array indexing, and allow reading from arrays
Anders Halager <halager@gmail.com>
parents:
82
diff
changeset
|
354 case ExpType.Index: |
9e90694f5da0
Parse array indexing, and allow reading from arrays
Anders Halager <halager@gmail.com>
parents:
82
diff
changeset
|
355 auto indexExp = cast(IndexExp)exp; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
356 return loadLValue(genLValue(exp)); |
166
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
357 case ExpType.NewExp: |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
358 auto newExp = cast(NewExp)exp; |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
359 DClass type = newExp.newType.type().asClass(); |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
360 auto llvm_type = cast(PointerType)llvm(type); |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
361 auto pointer = b.buildMalloc(llvm_type.elementType(), "new"); |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
362 scope args = new Value[newExp.c_args.length]; |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
363 foreach (i, arg; newExp.c_args) |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
364 args[i] = genExpression(arg).value; |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
365 auto f = m.getNamedFunction(newExp.callSym.getMangledFQN()); |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
366 b.buildCall(f, args, ""); |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
367 return RValue(pointer); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
368 case ExpType.CallExp: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
369 auto callExp = cast(CallExp)exp; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
370 // BUG: Might not be a simple identifier, a.foo(x) is also a |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
371 // valid call - or foo(x)(y) for that matter. |
129 | 372 |
373 // if type of exp is DFunction - safe to call getSymbol and FQN | |
374 // if function ptr: do something else | |
375 // if delegate do a third thing | |
376 // if struct/class check for opCall | |
377 DType type = callExp.exp.type; | |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
378 assert (type.isCallable(), "Can only call functions"); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
379 scope args = new Value[callExp.args.length]; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
380 foreach (i, arg; callExp.args) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
381 args[i] = genExpression(arg).value; |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
382 DFunction ftype = type.asCallable(); |
173
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
383 Type llvm_ftype = llvm(ftype); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
384 Value f = null; |
171
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
385 if (callExp.callSym is null) |
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
386 { |
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
387 // Do a virtual function call |
173
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
388 f = genLValue(callExp.exp).getAddress(); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
389 f = b.buildLoad(f, "func_pointer"); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
390 f = b.buildBitCast( |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
391 f, |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
392 PointerType.Get(llvm_ftype), |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
393 ftype.name); |
171
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
394 } |
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
395 else |
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
396 { |
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
397 auto sym = callExp.callSym; |
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
398 f = m.getNamedFunction(sym.getMangledFQN()); |
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
399 } |
173
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
400 bool isVoid = ftype.returnType is DType.Void; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
401 auto r = b.buildCall(f, args, isVoid? "" : "call"); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
402 return RValue(r); |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
403 case ExpType.CastExp: |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
404 auto castExp = cast(CastExp)exp; |
120
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
405 exp = castExp.exp; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
406 auto value = genExpression(exp); |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
407 |
120
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
408 if (!exp.type.hasImplicitConversionTo(castExp.type)) |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
409 assert(0, "Invalid cast"); |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
410 |
120
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
411 return genTypeCast(value, exp.type, castExp.type); |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
412 |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
413 case ExpType.Identifier: |
129 | 414 auto id = cast(Identifier)exp; |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
415 auto type = id.type; |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
416 if (type.isStruct() |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
417 || type.isArray() |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
418 || type.isStaticArray() |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
419 || type.isClass()) |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
420 return RValue(table.find(id.get)); |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
421 else if (type.isFunction()) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
422 { |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
423 auto func_name = id.getSymbol().getMangledFQN(); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
424 return RValue(m.getNamedFunction(func_name)); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
425 } |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
426 else if (type.isCallable()) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
427 return RValue(genLValue(id).getAddress()); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
428 else |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
429 return RValue(b.buildLoad(table.find(id.get), id.get)); |
55
79cb0afafabe
Now structs are somewhat useable to use.
Anders Johnsen <skabet@gmail.com>
parents:
54
diff
changeset
|
430 case ExpType.MemberReference: |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
431 return loadLValue(genLValue(exp)); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
432 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
433 assert(0, "Reached end of switch in genExpression"); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
434 return RValue(null); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
435 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
436 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
437 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
438 Generate a binary expression. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
439 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
440 Currently only works for signed and unsigned integers, but is almost |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
441 ready for floats and should be expanded to everything else. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
442 **/ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
443 Value genBinExp(BinaryExp e) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
444 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
445 auto left = genExpression(e.left).value; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
446 auto right = genExpression(e.right).value; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
447 DType t_a = e.left.type; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
448 DType t_b = e.right.type; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
449 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
450 Value res; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
451 // TODO: do usual type promotions on a and b |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
452 // TODO: support floats |
116
0cd8d6ab3f89
Add in the types for float and co.
Anders Halager <halager@gmail.com>
parents:
113
diff
changeset
|
453 if (t_a.isArithmetic() && t_b.isArithmetic()) |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
454 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
455 Operation op = t_a.getOperationWith(op2op(e.op), t_b); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
456 assert(op.isBuiltin(), |
120
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
457 "numbers should only use builtin ops"); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
458 alias BuiltinOperation BO; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
459 BO val = op.builtinOp(); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
460 // map val to buildAdd or similar |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
461 switch (val) { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
462 case BO.Add: res = b.buildAdd(left, right, "add"); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
463 case BO.Sub: res = b.buildSub(left, right, "sub"); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
464 case BO.Mul: res = b.buildMul(left, right, "mul"); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
465 case BO.SDiv: res = b.buildSDiv(left, right, "div"); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
466 case BO.UDiv: res = b.buildUDiv(left, right, "div"); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
467 case BO.FDiv: res = b.buildFDiv(left, right, "div"); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
468 case BO.SRem: res = b.buildSRem(left, right, "rem"); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
469 case BO.URem: res = b.buildURem(left, right, "rem"); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
470 case BO.FRem: res = b.buildFRem(left, right, "rem"); break; |
125
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
471 |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
472 case BO.Shl: res = b.buildShl(left, right, "shl"); break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
473 case BO.LShr: res = b.buildLShr(left, right, "lshr"); break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
474 case BO.AShr: res = b.buildAShr(left, right, "ashr"); break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
475 |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
476 case BO.And: res = b.buildAnd(left, right, "and"); break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
477 case BO.Or: res = b.buildOr (left, right, "or"); break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
478 case BO.Xor: res = b.buildXor(left, right, "xor"); break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
479 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
480 default: |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
481 LLVMPred pred = predFromBI(val); |
121
95dfe2f48dcf
Allow == and != on reals
Anders Halager <halager@gmail.com>
parents:
120
diff
changeset
|
482 if (t_a.isReal()) |
95dfe2f48dcf
Allow == and != on reals
Anders Halager <halager@gmail.com>
parents:
120
diff
changeset
|
483 if (val == BO.Eq) |
95dfe2f48dcf
Allow == and != on reals
Anders Halager <halager@gmail.com>
parents:
120
diff
changeset
|
484 pred = LLVMPred.Real(RealPredicate.OEQ); |
95dfe2f48dcf
Allow == and != on reals
Anders Halager <halager@gmail.com>
parents:
120
diff
changeset
|
485 else if (val == BO.Ne) |
95dfe2f48dcf
Allow == and != on reals
Anders Halager <halager@gmail.com>
parents:
120
diff
changeset
|
486 pred = LLVMPred.Real(RealPredicate.ONE); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
487 IntPredicate ip = pred.intPred; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
488 RealPredicate rp = pred.realPred; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
489 assert(pred.isValid, "Not a predicate"); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
490 if (pred.isReal) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
491 res = b.buildFCmp(rp, left, right, "cmp"); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
492 else |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
493 res = b.buildICmp(ip, left, right, "cmp"); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
494 break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
495 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
496 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
497 else |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
498 /* |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
499 if left has op for right's type: |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
500 a_op = left.op(right) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
501 if right has usable op_r: |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
502 b_op_r = right.op_r(left) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
503 if a_op or b_op_r is set, choose the best one |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
504 else if op is commutative |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
505 if left has usable op_r |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
506 a_op_r = left.op_r(right) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
507 if right has usable op |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
508 b_op = right.op(left) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
509 choose best one from a_op_r and b_op |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
510 else error |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
511 */ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
512 assert(0, "Not integers?"); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
513 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
514 return res; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
515 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
516 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
517 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
518 Generates one statement |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
519 **/ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
520 // This should be split into specific methods - one per Stmt type? |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
521 void genStmt(Stmt stmt) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
522 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
523 switch(stmt.stmtType) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
524 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
525 case StmtType.Compound: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
526 auto stmts = cast(CompoundStatement)stmt; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
527 foreach (s; stmts.statements) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
528 genStmt(s); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
529 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
530 case StmtType.Return: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
531 auto ret = cast(ReturnStmt)stmt; |
64
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
532 DFunction type = stmt.env.parentFunction().type(); |
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
533 Type t = llvm(type.returnType); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
534 if (ret.exp is null) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
535 if (t is Type.Void) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
536 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
537 b.buildRetVoid(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
538 return; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
539 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
540 else |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
107
diff
changeset
|
541 assert(0, PE.VoidRetInNonVoidFunc); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
542 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
543 RValue v = genExpression(ret.exp); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
544 b.buildRet(v.value); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
545 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
546 case StmtType.Decl: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
547 auto declStmt = cast(DeclStmt)stmt; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
548 genDecl(declStmt.decl); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
549 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
550 case StmtType.Exp: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
551 auto expStmt = cast(ExpStmt)stmt; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
552 genExpression(expStmt.exp); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
553 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
554 case StmtType.If: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
555 auto ifStmt = cast(IfStmt)stmt; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
556 Value cond = genExpression(ifStmt.cond).value; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
557 if (cond.type !is Type.Int1) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
558 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
559 Value False = ConstantInt.GetS(cond.type, 0); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
560 cond = b.buildICmp(IntPredicate.NE, cond, False, ".cond"); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
561 } |
129 | 562 auto func_name = symbolName(stmt.env.parentFunction()); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
563 Function func = m.getNamedFunction(func_name); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
564 bool has_else = (ifStmt.else_body !is null); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
565 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
566 auto thenBB = func.appendBasicBlock("then"); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
567 auto elseBB = has_else? func.appendBasicBlock("else") : null; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
568 auto mergeBB = func.appendBasicBlock("merge"); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
569 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
570 b.buildCondBr(cond, thenBB, has_else? elseBB : mergeBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
571 b.positionAtEnd(thenBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
572 genStmt(ifStmt.then_body); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
573 thenBB = b.getInsertBlock(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
574 if (b.getInsertBlock().terminated() is false) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
575 b.buildBr(mergeBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
576 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
577 if (has_else) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
578 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
579 b.positionAtEnd(elseBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
580 genStmt(ifStmt.else_body); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
581 elseBB = b.getInsertBlock(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
582 if (elseBB.terminated() is false) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
583 b.buildBr(mergeBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
584 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
585 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
586 b.positionAtEnd(mergeBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
587 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
588 case StmtType.While: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
589 auto wStmt = cast(WhileStmt)stmt; |
155 | 590 genLoop(stmt.env, wStmt.cond, false, wStmt.whileBody); |
591 break; | |
592 /+ | |
593 case StmtType.DoWhile: | |
594 auto wStmt = cast(DoWhileStmt)stmt; | |
595 genLoop(stmt.env, wStmt.cond, true, wStmt.whileBody); | |
596 break; | |
597 +/ | |
598 case StmtType.For: | |
599 auto fStmt = cast(ForStmt)stmt; | |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
600 Stmt[] stmts; |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
601 if(fStmt.init) |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
602 genStmt(fStmt.init); |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
603 ExpStmt inc; |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
604 if(fStmt.incre) |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
605 stmts ~= new ExpStmt(fStmt.incre); |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
606 Exp cond; |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
607 if(fStmt.cond) |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
608 cond = fStmt.cond; |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
609 else |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
610 { |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
611 auto i = new IntegerLit(fStmt.loc,"1"); |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
612 i.number.type = NumberType.Int; |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
613 i.number.integer = 1; |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
614 cond = i; |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
615 } |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
616 stmts ~= fStmt.forBody; |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
181
diff
changeset
|
617 genLoop(stmt.env, cond, false, stmts); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
618 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
619 case StmtType.Switch: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
620 auto sw = cast(SwitchStmt)stmt; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
621 Value cond = genExpression(sw.cond).value; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
622 |
143
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
623 auto fc = stmt.env.parentFunction(); |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
624 Function func = m.getNamedFunction(symbolName(fc)); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
625 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
626 BasicBlock oldBB = b.getInsertBlock(); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
627 BasicBlock defBB; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
628 BasicBlock endBB = func.appendBasicBlock("sw.end"); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
629 if (sw.defaultBlock) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
630 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
631 defBB = Function.InsertBasicBlock(endBB, "sw.def"); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
632 b.positionAtEnd(defBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
633 foreach (case_statement; sw.defaultBlock) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
634 genStmt(case_statement); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
635 if (!defBB.terminated()) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
636 b.buildBr(endBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
637 b.positionAtEnd(oldBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
638 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
639 else |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
640 defBB = endBB; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
641 auto SI = b.buildSwitch(cond, defBB, sw.cases.length); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
642 foreach (c; sw.cases) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
643 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
644 BasicBlock prevBB; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
645 foreach (i, val; c.values) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
646 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
647 auto BB = Function.InsertBasicBlock(defBB, "sw.bb"); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
648 SI.addCase(ConstantInt.GetS(cond.type, c.values_converted[i]), BB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
649 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
650 if (i + 1 == c.values.length) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
651 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
652 b.positionAtEnd(BB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
653 foreach (case_statement; c.stmts) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
654 genStmt(case_statement); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
655 if (!BB.terminated()) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
656 b.buildBr(c.followedByDefault? defBB : endBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
657 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
658 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
659 if (prevBB !is null && !prevBB.terminated()) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
660 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
661 b.positionAtEnd(prevBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
662 b.buildBr(BB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
663 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
664 prevBB = BB; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
665 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
666 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
667 b.positionAtEnd(endBB); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
668 break; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
669 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
670 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
671 |
155 | 672 /** |
673 Generate a loop. | |
674 | |
675 Loops while cond is true, executing all statements in stmts every time. | |
676 | |
677 If skipFirstCond is set, the condition is skipped the first time around, | |
678 like in a do-while loop. | |
679 **/ | |
680 void genLoop(Scope env, Exp cond, bool skipFirstCond, Stmt[] stmts...) | |
681 { | |
682 auto fd = env.parentFunction(); | |
683 Function func = m.getNamedFunction(symbolName(fd)); | |
684 | |
685 auto condBB = func.appendBasicBlock("cond"); | |
686 auto bodyBB = func.appendBasicBlock("body"); | |
687 auto doneBB = func.appendBasicBlock("done"); | |
688 | |
689 b.buildBr(skipFirstCond? bodyBB : condBB); | |
690 b.positionAtEnd(condBB); | |
691 | |
692 Value cond_v = genExpression(cond).value; | |
693 if (cond_v.type !is Type.Int1) | |
694 { | |
695 Value False = ConstantInt.GetS(cond_v.type, 0); | |
696 cond_v = b.buildICmp(IntPredicate.NE, cond_v, False, ".cond"); | |
697 } | |
698 b.buildCondBr(cond_v, bodyBB, doneBB); | |
699 | |
700 b.positionAtEnd(bodyBB); | |
701 foreach (stmt; stmts) | |
702 genStmt(stmt); | |
703 if (b.getInsertBlock().terminated() is false) | |
704 b.buildBr(condBB); | |
705 | |
706 b.positionAtEnd(doneBB); | |
707 } | |
708 | |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
709 /* |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
710 Get the address of an expression - allowing us to modify something in |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
711 memory or on the stack. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
712 */ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
713 LValue genLValue(Exp exp) |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
714 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
715 switch(exp.expType) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
716 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
717 case ExpType.Identifier: |
129 | 718 auto id = cast(Identifier)exp; |
181
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
719 Value v = table.find(id.get); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
720 if (v is null) |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
721 v = m.getNamedFunction(id.getSymbol().getMangledFQN()); |
59cd211a1bd3
Better support for function pointers
Anders Halager <halager@gmail.com>
parents:
175
diff
changeset
|
722 return LValue(v); |
80
682e20aa224f
Pointers working now - big YAY
Anders Johnsen <skabet@gmail.com>
parents:
79
diff
changeset
|
723 case ExpType.Deref: |
116
0cd8d6ab3f89
Add in the types for float and co.
Anders Halager <halager@gmail.com>
parents:
113
diff
changeset
|
724 // LValue(*x): load(x) |
0cd8d6ab3f89
Add in the types for float and co.
Anders Halager <halager@gmail.com>
parents:
113
diff
changeset
|
725 // RValue(*x): load(load(x)) |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
726 // This way *x = *x + 1 will work |
116
0cd8d6ab3f89
Add in the types for float and co.
Anders Halager <halager@gmail.com>
parents:
113
diff
changeset
|
727 // We need an ekstra load, because we get an i32** rather than |
0cd8d6ab3f89
Add in the types for float and co.
Anders Halager <halager@gmail.com>
parents:
113
diff
changeset
|
728 // i32* since stuff is alloc'd |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
729 auto DE = cast(DerefExp)exp; |
113 | 730 return LValue(genExpression(DE.exp).value); |
83
9e90694f5da0
Parse array indexing, and allow reading from arrays
Anders Halager <halager@gmail.com>
parents:
82
diff
changeset
|
731 case ExpType.Index: |
9e90694f5da0
Parse array indexing, and allow reading from arrays
Anders Halager <halager@gmail.com>
parents:
82
diff
changeset
|
732 auto indexExp = cast(IndexExp)exp; |
85
9375bd975730
Allow indexing of pointers also
Anders Halager <halager@gmail.com>
parents:
83
diff
changeset
|
733 auto type = indexExp.target.type; |
83
9e90694f5da0
Parse array indexing, and allow reading from arrays
Anders Halager <halager@gmail.com>
parents:
82
diff
changeset
|
734 auto index = genExpression(indexExp.index); |
9e90694f5da0
Parse array indexing, and allow reading from arrays
Anders Halager <halager@gmail.com>
parents:
82
diff
changeset
|
735 Value[2] gep_indices; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
736 gep_indices[0] = ZeroIndex; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
737 gep_indices[1] = index.value; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
738 Value res; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
739 auto target = genLValue(indexExp.target).getAddress(); |
136 | 740 if (type.isStaticArray()) |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
741 res = b.buildGEP(target, gep_indices[0 .. 2], "index"); |
85
9375bd975730
Allow indexing of pointers also
Anders Halager <halager@gmail.com>
parents:
83
diff
changeset
|
742 else if (type.isPointer()) |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
743 res = b.buildGEP(target, gep_indices[1 .. 2], "index"); |
85
9375bd975730
Allow indexing of pointers also
Anders Halager <halager@gmail.com>
parents:
83
diff
changeset
|
744 else assert(0, "Can only index pointers and arrays"); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
745 return LValue(res); |
55
79cb0afafabe
Now structs are somewhat useable to use.
Anders Johnsen <skabet@gmail.com>
parents:
54
diff
changeset
|
746 case ExpType.MemberReference: |
79cb0afafabe
Now structs are somewhat useable to use.
Anders Johnsen <skabet@gmail.com>
parents:
54
diff
changeset
|
747 auto mem = cast(MemberReference)exp; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
748 switch (mem.target.expType) |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
749 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
750 case ExpType.Identifier: |
129 | 751 auto id = cast(Identifier)mem.target; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
752 auto child = mem.child; |
93
621cedba53ea
Removed the Symbol from semantics - it was not needed anymore. From now on you set the type by doing a setType on an Identifier.
Anders Johnsen <skabet@gmail.com>
parents:
92
diff
changeset
|
753 Value v = table.find(id.get); |
621cedba53ea
Removed the Symbol from semantics - it was not needed anymore. From now on you set the type by doing a setType on an Identifier.
Anders Johnsen <skabet@gmail.com>
parents:
92
diff
changeset
|
754 DType t = id.type; |
173
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
755 if (auto st = t.asStruct) |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
756 { |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
757 int i = st.indexOf(child.get); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
758 if (i == -1) |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
759 { |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
760 auto fname = mem.getSymbol.getMangledFQN(); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
761 auto f = m.getNamedFunction(fname); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
762 return LValue(f); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
763 } |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
764 |
173
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
765 Value[2] vals; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
766 vals[0] = ZeroIndex; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
767 vals[1] = ConstantInt.GetU(IntegerType.Int32, i); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
768 |
173
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
769 Value val = b.buildGEP(v, vals, id.get~"."~child.get); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
770 return LValue(val); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
771 } |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
772 else if (auto ct = t.asClass) |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
773 { |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
774 int i = ct.indexOf(child.get); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
775 Value[2] vals; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
776 vals[0] = ZeroIndex; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
777 // A normal member |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
778 if (i != -1) |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
779 { |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
780 vals[1] = ConstantInt.GetU(IntegerType.Int32, i); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
781 Value val = b.buildGEP(v, vals, id.get~"."~child.get); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
782 return LValue(val); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
783 } |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
784 // A method |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
785 else |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
786 { |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
787 vals[1] = ZeroIndex; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
788 //vals[1] = ConstantInt.GetU(IntegerType.Int32, 1); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
789 auto vtbl_name = ct.name ~ "_vtable"; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
790 auto vtbl = m.getNamedGlobal(vtbl_name); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
791 v = vtbl; |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
792 } |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
793 |
173
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
794 Value val = b.buildGEP(v, vals, id.get~"."~child.get); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
795 return LValue(val); |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
796 } |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
797 else |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
798 assert(0, "Can only access members in classes " |
50b98a06a200
Start of support for virtual functions
Anders Halager <halager@gmail.com>
parents:
171
diff
changeset
|
799 "and structs"); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
800 |
72
628cb46ab13b
First update on the way to Arrays! :)
Anders Johnsen <skabet@gmail.com>
parents:
70
diff
changeset
|
801 case ExpType.MemberReference: |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
802 auto addr = genLValue(mem.target).getAddress(); |
72
628cb46ab13b
First update on the way to Arrays! :)
Anders Johnsen <skabet@gmail.com>
parents:
70
diff
changeset
|
803 auto child = mem.child; |
129 | 804 DStruct t = mem.target.type.asStruct(); |
72
628cb46ab13b
First update on the way to Arrays! :)
Anders Johnsen <skabet@gmail.com>
parents:
70
diff
changeset
|
805 |
129 | 806 int i = t.indexOf(child.get); |
72
628cb46ab13b
First update on the way to Arrays! :)
Anders Johnsen <skabet@gmail.com>
parents:
70
diff
changeset
|
807 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
808 Value[2] vals; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
809 vals[0] = ZeroIndex; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
810 vals[1] = ConstantInt.GetU(IntegerType.Int32, i); |
72
628cb46ab13b
First update on the way to Arrays! :)
Anders Johnsen <skabet@gmail.com>
parents:
70
diff
changeset
|
811 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
812 Value val = b.buildGEP(addr, vals, "."~child.get); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
813 return LValue(val); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
814 } |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
815 break; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
816 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
817 assert(0, "Reached end of switch in getPointer"); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
818 return LValue(null); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
819 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
820 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
821 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
822 Store into an lvalue from a rvalue. Both are assumed to have type t. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
823 **/ |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
824 void storeThroughLValue(LValue dst, RValue src, DType t) |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
825 { |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
826 Value to = dst.getAddress(); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
827 Value from = src.value; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
828 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
829 auto a = cast(PointerType)to.type; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
830 assert(a !is null, "Can only store through pointers"); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
831 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
832 if (auto st = t.asStruct()) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
833 genMemcpy(to, from, t); |
160 | 834 else if (auto sa = t.asStaticArray()) |
835 genMemcpy(to, from, t, sa.arrayOf.byteSize); | |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
836 else |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
837 b.buildStore(from, to); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
838 } |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
839 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
840 /** |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
841 Copy from src into dst. The values are assumed to have the same size, |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
842 and the amount of bytes to copy is taken from t. |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
843 **/ |
160 | 844 void genMemcpy(Value dst, Value src, DType t, int alignment = 16) |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
845 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
846 Value from = b.buildBitCast(src, BytePtr, ".copy_from"); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
847 Value to = b.buildBitCast(dst, BytePtr, ".copy_to"); |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
848 Value[4] args; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
849 args[0] = to; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
850 args[1] = from; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
851 args[2] = ConstantInt.GetS(Type.Int32, t.byteSize()); |
160 | 852 args[3] = ConstantInt.GetS(Type.Int32, alignment); |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
853 b.buildCall(llvm_memcpy, args[], null); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
854 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
855 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
856 /** |
120
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
857 Generate the statements necessary to convert V, from type 'from' to type |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
858 'to'. |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
859 **/ |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
860 RValue genTypeCast(RValue V, DType from, DType to) |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
861 { |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
862 Value delegate(Value, Type, char[]) extend, trunc; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
863 if(auto ito = to.asInteger()) |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
864 { |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
865 extend = ito.unsigned? &b.buildZExt : &b.buildSExt; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
866 trunc = &b.buildTrunc; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
867 if(auto rfrom = from.isReal()) |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
868 { |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
869 extend = ito.unsigned? &b.buildFPToUI : &b.buildFPToSI; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
870 trunc = extend; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
871 } |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
872 } |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
873 else if (auto rto = to.asReal()) |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
874 { |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
875 extend = &b.buildFPExt; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
876 trunc = &b.buildFPTrunc; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
877 if(auto ifrom = from.isInteger()) |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
878 { |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
879 extend = rto.unsigned? &b.buildUIToFP : &b.buildSIToFP; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
880 trunc = extend; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
881 } |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
882 } |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
883 else |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
884 assert(0, "implicit cast need implimentation"); |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
885 |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
886 Value res; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
887 if (from.byteSize() < to.byteSize()) |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
888 res = extend(V.value, llvm(to), "ext"); |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
889 else |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
890 res = trunc(V.value, llvm(to), "trunc"); |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
891 return RValue(res); |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
892 } |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
893 |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
894 /** |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
895 Given the address of something, load it into an alloc. |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
896 **/ |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
897 RValue loadLValue(LValue addr, char[] name = null) |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
898 { |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
899 Value val = addr.getAddress(); |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
900 if (name is null) |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
901 name = val.name.length > 0? val.name : "load"; |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
902 |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
903 auto res = b.buildLoad(val, name); |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
904 return RValue(res); |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
905 } |
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
906 |
129 | 907 /// Get the mangled name of a function |
908 char[] symbolName(FuncDecl f) | |
909 { | |
143
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
910 if (f.att.getExtern == Extern.D) |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
911 return f.sym.getMangledFQN(); |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
912 return f.sym.getName; |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
913 } |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
914 |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
915 char[] symbolName(Exp f) |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
916 { |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
917 if (f.getSymbol.decl.att.getExtern == Extern.D) |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
918 return f.getSymbol.getMangledFQN(); |
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
138
diff
changeset
|
919 return f.getSymbol.getName; |
129 | 920 } |
921 | |
120
7d0898f77685
Implement the cast expression - works for integers and real/float/double
Anders Halager <halager@gmail.com>
parents:
119
diff
changeset
|
922 /** |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
923 Get the LLVM Type corresponding to a DType. |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
924 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
925 Currently using the built-in associative array - not sure if it works |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
926 well when the hashes are so uniform. |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
927 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
928 Other possibilities would be to find a hash-function that works on |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
929 something as small as 4 bytes or to create a sparse array perhaps. |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
930 */ |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
931 Type llvm(DType t) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
932 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
933 if (auto llvm_t = t in type_map) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
934 return *llvm_t; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
935 return llvmCreateNew(t); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
936 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
937 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
938 // Create an LLVM type and insert it into the type map, and return the |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
939 // result |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
940 Type llvmCreateNew(DType t) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
941 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
942 if (auto i = cast(DInteger)t) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
943 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
944 Type res = IntegerType.Get(i.byteSize() * 8); |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
945 type_map[t] = res; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
946 return res; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
947 } |
64
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
948 else if (auto s = t.asStruct) |
53
da551f90e03f
Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents:
52
diff
changeset
|
949 { |
58 | 950 SmallArray!(Type, 8) members; |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
951 DType[] array; |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
952 array.length = s.members.length; |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
953 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
954 foreach (m; s.members) |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
955 array[m.index] = m.type; |
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
956 |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
957 foreach (m; array) |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
67
diff
changeset
|
958 members ~= llvm(m); |
53
da551f90e03f
Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents:
52
diff
changeset
|
959 |
58 | 960 Type res = StructType.Get(members.unsafe()); |
53
da551f90e03f
Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents:
52
diff
changeset
|
961 type_map[t] = res; |
166
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
962 m.addTypeName("struct." ~ s.name, res); |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
963 return res; |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
964 } |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
965 else if (auto c = t.asClass) |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
966 { |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
967 SmallArray!(Type) members; |
171
f0385c044065
Make function overloads work in the codegen
Anders Halager <halager@gmail.com>
parents:
166
diff
changeset
|
968 if (c.members.length > 0) |
166
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
969 { |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
970 DType[] array; |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
971 array.length = c.members.length; |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
972 |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
973 foreach (m; c.members) |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
974 array[m.index] = m.type; |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
975 |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
976 foreach (m; array) |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
977 members ~= llvm(m); |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
978 } |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
979 else members ~= Type.Int32; |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
980 |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
981 Type res = StructType.Get(members.unsafe()); |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
982 res = PointerType.Get(res); |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
983 type_map[t] = res; |
9cfa33517526
Codegen support for new expressions (very lame so far)
Anders Halager <halager@gmail.com>
parents:
160
diff
changeset
|
984 m.addTypeName("class." ~ c.name, res); |
53
da551f90e03f
Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents:
52
diff
changeset
|
985 return res; |
da551f90e03f
Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents:
52
diff
changeset
|
986 } |
64
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
987 else if (auto f = t.asFunction) |
59
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
58
diff
changeset
|
988 { |
64
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
989 // We should never have a function returning structs, because of |
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
990 // the simplify step |
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
991 assert(f.returnType.isStruct() == false, "Can't return structs"); |
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
992 Type ret_t = llvm(f.returnType); |
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
993 |
59
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
58
diff
changeset
|
994 SmallArray!(Type, 8) params; |
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
58
diff
changeset
|
995 foreach(param; f.params) |
64
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
996 if (param.isStruct) |
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
997 params ~= PointerType.Get(llvm(param)); |
86
29f486ccc203
Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents:
85
diff
changeset
|
998 else if (param.isArray) |
29f486ccc203
Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents:
85
diff
changeset
|
999 params ~= PointerType.Get(llvm(param)); |
64
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
1000 else |
91f10c34cd7b
Fixed some bugs, removed the function gathering pass in codegen and types are
Anders Halager <halager@gmail.com>
parents:
63
diff
changeset
|
1001 params ~= llvm(param); |
59
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
58
diff
changeset
|
1002 |
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
58
diff
changeset
|
1003 Type res = FunctionType.Get(ret_t, params.unsafe()); |
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
58
diff
changeset
|
1004 type_map[t] = res; |
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
58
diff
changeset
|
1005 return res; |
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
58
diff
changeset
|
1006 } |
77
13eea2c4e60d
Now able of --ast-dump-code with Pointer types and also codeGen int* x;
Anders Johnsen <skabet@gmail.com>
parents:
74
diff
changeset
|
1007 else if (auto f = t.asPointer) |
13eea2c4e60d
Now able of --ast-dump-code with Pointer types and also codeGen int* x;
Anders Johnsen <skabet@gmail.com>
parents:
74
diff
changeset
|
1008 { |
13eea2c4e60d
Now able of --ast-dump-code with Pointer types and also codeGen int* x;
Anders Johnsen <skabet@gmail.com>
parents:
74
diff
changeset
|
1009 Type res = PointerType.Get(llvm(f.pointerOf)); |
13eea2c4e60d
Now able of --ast-dump-code with Pointer types and also codeGen int* x;
Anders Johnsen <skabet@gmail.com>
parents:
74
diff
changeset
|
1010 type_map[t] = res; |
13eea2c4e60d
Now able of --ast-dump-code with Pointer types and also codeGen int* x;
Anders Johnsen <skabet@gmail.com>
parents:
74
diff
changeset
|
1011 return res; |
13eea2c4e60d
Now able of --ast-dump-code with Pointer types and also codeGen int* x;
Anders Johnsen <skabet@gmail.com>
parents:
74
diff
changeset
|
1012 } |
136 | 1013 else if (auto f = t.asStaticArray) |
81 | 1014 { |
1015 Type res = ArrayType.Get(llvm(f.arrayOf), f.size); | |
1016 type_map[t] = res; | |
1017 return res; | |
1018 } | |
59
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
58
diff
changeset
|
1019 assert(0, "Only integers, structs and functions are supported"); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1020 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1021 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1022 // Might as well insert all the basic types from the start |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1023 void createBasicTypes() |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1024 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1025 type_map[DType.Void] = Type.Void; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1026 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1027 type_map[DType.Bool] = Type.Int1; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1028 type_map[DType.Byte] = Type.Int8; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1029 type_map[DType.UByte] = Type.Int8; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1030 type_map[DType.Short] = Type.Int16; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1031 type_map[DType.UShort] = Type.Int16; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1032 type_map[DType.Int] = Type.Int32; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1033 type_map[DType.UInt] = Type.Int32; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1034 type_map[DType.Long] = Type.Int64; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1035 type_map[DType.ULong] = Type.Int64; |
118
54585ad7e426
Added the DType -> llvm type mapping for some more types
Anders Halager <halager@gmail.com>
parents:
117
diff
changeset
|
1036 |
54585ad7e426
Added the DType -> llvm type mapping for some more types
Anders Halager <halager@gmail.com>
parents:
117
diff
changeset
|
1037 type_map[DType.Float] = Type.Float; |
54585ad7e426
Added the DType -> llvm type mapping for some more types
Anders Halager <halager@gmail.com>
parents:
117
diff
changeset
|
1038 type_map[DType.Double] = Type.Double; |
54585ad7e426
Added the DType -> llvm type mapping for some more types
Anders Halager <halager@gmail.com>
parents:
117
diff
changeset
|
1039 type_map[DType.Real] = Type.X86_FP80; |
54585ad7e426
Added the DType -> llvm type mapping for some more types
Anders Halager <halager@gmail.com>
parents:
117
diff
changeset
|
1040 |
54585ad7e426
Added the DType -> llvm type mapping for some more types
Anders Halager <halager@gmail.com>
parents:
117
diff
changeset
|
1041 type_map[DType.Char] = Type.Int8; |
129 | 1042 type_map[DType.WChar] = Type.Int16; |
1043 type_map[DType.DChar] = Type.Int32; | |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1044 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1045 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1046 private: |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1047 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1048 // llvm stuff |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1049 DModule mod; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1050 .llvm.llvm.Module m; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1051 Builder b; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1052 Function llvm_memcpy; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1053 ConstantInt ZeroIndex; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1054 Type BytePtr; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1055 Type[DType] type_map; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1056 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1057 SimpleSymbolTable table; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1058 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1059 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1060 private Operator op2op(BinaryExp.Operator op) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1061 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1062 alias BinaryExp.Operator O; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1063 Operator res; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1064 switch (op) { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1065 case O.Add: res = Operator.Add; break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1066 case O.Sub: res = Operator.Sub; break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1067 case O.Mul: res = Operator.Mul; break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1068 case O.Div: res = Operator.Div; break; |
125
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
1069 case O.LeftShift: res = Operator.Shl; break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
1070 case O.RightShift: res = Operator.AShr; break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
1071 case O.UnsignedRightShift: res = Operator.LShr; break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
1072 |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
1073 case O.And: res = Operator.And; break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
1074 case O.Or: res = Operator.Or; break; |
d604152de1eb
Support shifts and binary logical operators in codegen
Anders Halager <halager@gmail.com>
parents:
121
diff
changeset
|
1075 case O.Xor: res = Operator.Xor; break; |
107
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1076 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1077 case O.Eq: res = Operator.Eq; break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1078 case O.Ne: res = Operator.Ne; break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1079 case O.Lt: res = Operator.Lt; break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1080 case O.Le: res = Operator.Le; break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1081 case O.Gt: res = Operator.Gt; break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1082 case O.Ge: res = Operator.Ge; break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1083 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1084 return res; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1085 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1086 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1087 private struct LLVMPred |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1088 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1089 bool isValid = false; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1090 bool isReal; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1091 union { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1092 IntPredicate intPred; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1093 RealPredicate realPred; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1094 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1095 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1096 static LLVMPred Int(IntPredicate p) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1097 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1098 LLVMPred res; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1099 res.isValid = true; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1100 res.isReal = false; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1101 res.intPred = p; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1102 return res; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1103 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1104 static LLVMPred Real(RealPredicate p) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1105 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1106 LLVMPred res; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1107 res.isValid = true; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1108 res.isReal = true; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1109 res.realPred = p; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1110 return res; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1111 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1112 } |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1113 private LLVMPred predFromBI(BuiltinOperation op) |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1114 { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1115 alias BuiltinOperation O; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1116 LLVMPred pred; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1117 switch (op) { |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1118 case O.Eq: pred = LLVMPred.Int(IntPredicate.EQ); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1119 case O.Ne: pred = LLVMPred.Int(IntPredicate.NE); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1120 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1121 case O.SLt: pred = LLVMPred.Int(IntPredicate.SLT); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1122 case O.ULt: pred = LLVMPred.Int(IntPredicate.ULT); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1123 case O.FLt: pred = LLVMPred.Real(RealPredicate.OLT); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1124 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1125 case O.SLe: pred = LLVMPred.Int(IntPredicate.SLE); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1126 case O.ULe: pred = LLVMPred.Int(IntPredicate.ULE); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1127 case O.FLe: pred = LLVMPred.Real(RealPredicate.OLE); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1128 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1129 case O.SGt: pred = LLVMPred.Int(IntPredicate.SGT); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1130 case O.UGt: pred = LLVMPred.Int(IntPredicate.UGT); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1131 case O.FGt: pred = LLVMPred.Real(RealPredicate.OGT); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1132 |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1133 case O.SGe: pred = LLVMPred.Int(IntPredicate.SGE); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1134 case O.UGe: pred = LLVMPred.Int(IntPredicate.UGE); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1135 case O.FGe: pred = LLVMPred.Real(RealPredicate.OGE); break; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1136 }; |
189c049cbfcc
Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents:
101
diff
changeset
|
1137 return pred; |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1138 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1139 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1140 private class VisitFuncDecls : Visitor!(void) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1141 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1142 void delegate(FuncDecl) dg; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1143 this(void delegate(FuncDecl funcDecl) dg) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1144 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1145 this.dg = dg; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1146 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1147 |
129 | 1148 override void visitFuncDecl(FuncDecl fd) |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1149 { |
129 | 1150 dg(fd); |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1151 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1152 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1153 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1154 private class SimpleSymbolTable |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1155 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1156 Value[char[]][] namedValues; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1157 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1158 void enterScope() |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1159 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1160 namedValues ~= cast(Value[char[]])["__dollar":null]; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1161 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1162 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1163 void leaveScope() |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1164 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1165 namedValues.length = namedValues.length - 1; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1166 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1167 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1168 Value put(Value val, char[] key) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1169 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1170 namedValues[$ - 1][key] = val; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1171 return val; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1172 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1173 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1174 Value find(char[] key) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1175 { |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1176 foreach_reverse (map; namedValues) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1177 if(auto val_ptr = key in map) |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1178 return *val_ptr; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1179 return null; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1180 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1181 |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1182 alias find opIndex; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1183 alias put opIndexAssign; |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1184 } |
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
diff
changeset
|
1185 |