Mercurial > projects > ldc
annotate gen/elem.c @ 83:339422268de1 trunk
[svn r87] Fixed some memory bloat when passing string literals as char[] params (double temporary before)
author | lindquist |
---|---|
date | Fri, 02 Nov 2007 02:03:13 +0100 |
parents | 0c77619e803b |
children |
rev | line source |
---|---|
1 | 1 #include <iostream> |
2 | |
40 | 3 #include "gen/llvm.h" |
1 | 4 |
4
e116aa1488e6
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
1
diff
changeset
|
5 #include "gen/elem.h" |
e116aa1488e6
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
1
diff
changeset
|
6 #include "gen/irstate.h" |
e116aa1488e6
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
1
diff
changeset
|
7 #include "gen/logger.h" |
1 | 8 |
9 ////////////////////////////////////////////////////////////////////////////////////////// | |
10 | |
11 elem::elem() | |
12 { | |
13 mem = 0; | |
14 val = 0; | |
15 arg = 0; | |
16 | |
17 type = NONE; | |
18 inplace = false; | |
19 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
|
20 callconv = (unsigned)-1; |
15
37a4fdab33fc
[svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents:
11
diff
changeset
|
21 isthis = false; |
52 | 22 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
|
23 temp = false; |
1 | 24 |
25 vardecl = 0; | |
26 funcdecl = 0; | |
27 } | |
28 | |
29 llvm::Value* elem::getValue() | |
30 { | |
31 assert(val || mem); | |
32 switch(type) | |
33 { | |
34 case NONE: | |
35 assert(0 && "type == NONE"); | |
36 break; | |
37 | |
38 case VAR: | |
34 | 39 case REF: |
40 case ARRAYLEN: | |
1 | 41 if (val) { |
42 return val; | |
43 } | |
44 else { | |
45 if (!llvm::isa<llvm::PointerType>(mem->getType())) | |
46 { | |
47 Logger::cout() << "unexpected type: " << *mem->getType() << '\n'; | |
48 assert(0); | |
49 } | |
50 const llvm::PointerType* pt = llvm::cast<llvm::PointerType>(mem->getType()); | |
51 if (!pt->getElementType()->isFirstClassType()) { | |
52 return mem; | |
53 } | |
54 else { | |
40 | 55 return gIR->ir->CreateLoad(mem, "tmp"); |
1 | 56 } |
57 } | |
58 | |
59 case VAL: | |
60 case NUL: | |
61 case FUNC: | |
62 case CONST: | |
63 case SLICE: | |
64 return val ? val : mem; | |
65 } | |
66 assert(0 && "type == invalid value"); | |
67 return 0; | |
68 } |