comparison gen/elem.c @ 1:c53b6e3fe49a trunk

[svn r5] Initial commit. Most things are very rough.
author lindquist
date Sat, 01 Sep 2007 21:43:27 +0200
parents
children e116aa1488e6
comparison
equal deleted inserted replaced
0:a9e71648e74d 1:c53b6e3fe49a
1 #include <iostream>
2
3 #include "llvm/Instructions.h"
4
5 #include "elem.h"
6
7 #include "irstate.h"
8 #include "logger.h"
9
10 //////////////////////////////////////////////////////////////////////////////////////////
11
12 elem::elem()
13 {
14 mem = 0;
15 val = 0;
16 arg = 0;
17
18 type = NONE;
19 inplace = false;
20 field = false;
21
22 vardecl = 0;
23 funcdecl = 0;
24 }
25
26 llvm::Value* elem::getValue()
27 {
28 assert(val || mem);
29 switch(type)
30 {
31 case NONE:
32 assert(0 && "type == NONE");
33 break;
34
35 case VAR:
36 case REF: {
37 if (val) {
38 return val;
39 }
40 else {
41 if (!llvm::isa<llvm::PointerType>(mem->getType()))
42 {
43 Logger::cout() << "unexpected type: " << *mem->getType() << '\n';
44 assert(0);
45 }
46 const llvm::PointerType* pt = llvm::cast<llvm::PointerType>(mem->getType());
47 if (!pt->getElementType()->isFirstClassType()) {
48 return mem;
49 }
50 else {
51 return new llvm::LoadInst(mem, "tmp", gIR->scopebb());
52 }
53 }
54 }
55
56 case VAL:
57 case NUL:
58 case FUNC:
59 case CONST:
60 case SLICE:
61 return val ? val : mem;
62 }
63 assert(0 && "type == invalid value");
64 return 0;
65 }