Mercurial > projects > ldc
annotate gen/elem.cpp @ 91:3f949c6e2e9d trunk
[svn r95] added support for mains like:
T main(string[] args)
fixed a bug with slicing a pointer that is an argument with no storage
author | lindquist |
---|---|
date | Wed, 07 Nov 2007 04:52:56 +0100 |
parents | fd32135dca3e |
children |
rev | line source |
---|---|
86
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
1 /* |
1 | 2 #include <iostream> |
3 | |
40 | 4 #include "gen/llvm.h" |
1 | 5 |
4
e116aa1488e6
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
1
diff
changeset
|
6 #include "gen/elem.h" |
e116aa1488e6
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
1
diff
changeset
|
7 #include "gen/irstate.h" |
e116aa1488e6
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
1
diff
changeset
|
8 #include "gen/logger.h" |
86
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
9 #include "gen/dvalue.h" |
1 | 10 |
11 ////////////////////////////////////////////////////////////////////////////////////////// | |
12 | |
86
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
13 elem::elem(Expression* e) |
1 | 14 { |
86
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
15 exp = e; |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
16 |
1 | 17 mem = 0; |
18 val = 0; | |
19 arg = 0; | |
20 | |
21 type = NONE; | |
22 inplace = false; | |
23 field = false; | |
11
d3ee9efe20e2
[svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents:
4
diff
changeset
|
24 callconv = (unsigned)-1; |
15
37a4fdab33fc
[svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents:
11
diff
changeset
|
25 isthis = false; |
52 | 26 istypeinfo = false; |
83
339422268de1
[svn r87] Fixed some memory bloat when passing string literals as char[] params (double temporary before)
lindquist
parents:
52
diff
changeset
|
27 temp = false; |
1 | 28 |
29 vardecl = 0; | |
30 funcdecl = 0; | |
86
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
31 |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
32 dvalue = 0; |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
33 } |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
34 |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
35 elem::~elem() |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
36 { |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
37 delete dvalue; |
1 | 38 } |
39 | |
40 llvm::Value* elem::getValue() | |
41 { | |
86
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
42 if (dvalue && !dvalue->isSlice()) { |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
43 Logger::println("HAS DVALUE"); |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
44 return dvalue->getRVal(); |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
45 } |
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
46 |
1 | 47 assert(val || mem); |
48 switch(type) | |
49 { | |
50 case NONE: | |
51 assert(0 && "type == NONE"); | |
52 break; | |
53 | |
54 case VAR: | |
34 | 55 case REF: |
56 case ARRAYLEN: | |
1 | 57 if (val) { |
58 return val; | |
59 } | |
60 else { | |
61 if (!llvm::isa<llvm::PointerType>(mem->getType())) | |
62 { | |
63 Logger::cout() << "unexpected type: " << *mem->getType() << '\n'; | |
64 assert(0); | |
65 } | |
66 const llvm::PointerType* pt = llvm::cast<llvm::PointerType>(mem->getType()); | |
67 if (!pt->getElementType()->isFirstClassType()) { | |
68 return mem; | |
69 } | |
70 else { | |
40 | 71 return gIR->ir->CreateLoad(mem, "tmp"); |
1 | 72 } |
73 } | |
74 | |
75 case VAL: | |
76 case NUL: | |
77 case FUNC: | |
78 case CONST: | |
79 case SLICE: | |
80 return val ? val : mem; | |
81 } | |
82 assert(0 && "type == invalid value"); | |
83 return 0; | |
84 } | |
86
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
83
diff
changeset
|
85 */ |