comparison gen/dvalue.cpp @ 88:058d3925950e trunk

[svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
author lindquist
date Tue, 06 Nov 2007 10:03:14 +0100
parents
children ce7ed8f59b99
comparison
equal deleted inserted replaced
87:25d4fcce53f4 88:058d3925950e
1 #include "gen/llvm.h"
2
3 #include "declaration.h"
4
5 #include "gen/tollvm.h"
6 #include "gen/irstate.h"
7 #include "gen/logger.h"
8 #include "gen/dvalue.h"
9
10 /////////////////////////////////////////////////////////////////////////////////////////////////
11 /////////////////////////////////////////////////////////////////////////////////////////////////
12
13 DVarValue::DVarValue(VarDeclaration* vd, llvm::Value* llvmValue, bool lvalue)
14 {
15 var = vd;
16 val = llvmValue;
17 rval = 0;
18 lval = lvalue;
19 type = var->type;
20 }
21
22 DVarValue::DVarValue(Type* t, llvm::Value* lv, llvm::Value* rv)
23 {
24 var = 0;
25 val = lv;
26 rval = rv;
27 lval = true;
28 type = t;
29 }
30
31 DVarValue::DVarValue(Type* t, llvm::Value* llvmValue, bool lvalue)
32 {
33 var = 0;
34 val = llvmValue;
35 rval = 0;
36 lval = lvalue;
37 type = t;
38 }
39
40 llvm::Value* DVarValue::getLVal()
41 {
42 assert(val && lval);
43 return val;
44 }
45
46 llvm::Value* DVarValue::getRVal()
47 {
48 assert(rval || val);
49 if (DtoIsPassedByRef(type)) {
50 if (rval) return rval;
51 return val;
52 }
53 else {
54 if (rval) return rval;
55 Logger::cout() << "val: " << *val << '\n';
56 if (llvm::isa<llvm::Argument>(val)) {
57 if (var && (var->isRef() || var->isOut()))
58 return DtoLoad(val);
59 }
60 else if (!isField() && DtoCanLoad(val)) {
61 return DtoLoad(val);
62 }
63 return val;
64 }
65 }
66
67 /////////////////////////////////////////////////////////////////////////////////////////////////
68 /////////////////////////////////////////////////////////////////////////////////////////////////
69
70 DFuncValue::DFuncValue(FuncDeclaration* fd, llvm::Value* v, llvm::Value* vt)
71 {
72 func = fd;
73 type = func->type;
74 val = v;
75 vthis = vt;
76 cc = (unsigned)-1;
77 }
78
79 llvm::Value* DFuncValue::getLVal()
80 {
81 assert(0);
82 return 0;
83 }
84
85 llvm::Value* DFuncValue::getRVal()
86 {
87 assert(val);
88 return val;
89 }
90
91 /////////////////////////////////////////////////////////////////////////////////////////////////
92 /////////////////////////////////////////////////////////////////////////////////////////////////
93
94 llvm::Value* DConstValue::getRVal()
95 {
96 assert(c);
97 return c;
98 }
99
100 /////////////////////////////////////////////////////////////////////////////////////////////////
101 /////////////////////////////////////////////////////////////////////////////////////////////////