annotate gen/arrays.cpp @ 479:672eb4893b55

Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
author Christian Kamm <kamm incasoftware de>
date Tue, 05 Aug 2008 19:28:19 +0200
parents 76078c8ab5b9
children a34078905d01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 37
diff changeset
1 #include "gen/llvm.h"
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
2
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
3 #include "mtype.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
4 #include "dsymbol.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
5 #include "aggregate.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
6 #include "declaration.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
7 #include "init.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
8
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
9 #include "gen/irstate.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
10 #include "gen/tollvm.h"
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
11 #include "gen/llvmhelpers.h"
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
12 #include "gen/arrays.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
13 #include "gen/runtime.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
14 #include "gen/logger.h"
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
15 #include "gen/dvalue.h"
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
16
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
17 //////////////////////////////////////////////////////////////////////////////////////////
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
18
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
19 const LLStructType* DtoArrayType(Type* arrayTy)
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
20 {
234
9760f54af0b7 [svn r250] Fixed the warning about dropping arguments to _Dmain when optimizing.
lindquist
parents: 217
diff changeset
21 assert(arrayTy->next);
9760f54af0b7 [svn r250] Fixed the warning about dropping arguments to _Dmain when optimizing.
lindquist
parents: 217
diff changeset
22 const LLType* elemty = DtoType(arrayTy->next);
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
23 if (elemty == LLType::VoidTy)
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
24 elemty = LLType::Int8Ty;
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
25 return LLStructType::get(DtoSize_t(), getPtrToType(elemty), 0);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
26 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
27
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
28 const LLStructType* DtoArrayType(const LLType* t)
234
9760f54af0b7 [svn r250] Fixed the warning about dropping arguments to _Dmain when optimizing.
lindquist
parents: 217
diff changeset
29 {
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
30 return LLStructType::get(DtoSize_t(), getPtrToType(t), 0);
234
9760f54af0b7 [svn r250] Fixed the warning about dropping arguments to _Dmain when optimizing.
lindquist
parents: 217
diff changeset
31 }
9760f54af0b7 [svn r250] Fixed the warning about dropping arguments to _Dmain when optimizing.
lindquist
parents: 217
diff changeset
32
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
33 //////////////////////////////////////////////////////////////////////////////////////////
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
34
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
35 const LLArrayType* DtoStaticArrayType(Type* t)
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
36 {
328
7086a84ab3d6 [svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents: 315
diff changeset
37 t = t->toBasetype();
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
38 assert(t->ty == Tsarray);
328
7086a84ab3d6 [svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents: 315
diff changeset
39 TypeSArray* tsa = (TypeSArray*)t;
7086a84ab3d6 [svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents: 315
diff changeset
40 Type* tnext = tsa->next;
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
41
328
7086a84ab3d6 [svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents: 315
diff changeset
42 const LLType* elemty = DtoType(tnext);
7086a84ab3d6 [svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents: 315
diff changeset
43 if (elemty == LLType::VoidTy)
7086a84ab3d6 [svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents: 315
diff changeset
44 elemty = LLType::Int8Ty;
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
45
328
7086a84ab3d6 [svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents: 315
diff changeset
46 return LLArrayType::get(elemty, tsa->dim->toUInteger());
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
47 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
48
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
49 //////////////////////////////////////////////////////////////////////////////////////////
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
50
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
51 void DtoSetArrayToNull(LLValue* v)
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
52 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
53 Logger::println("DtoSetArrayToNull");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
54 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
55
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
56 LLValue* len = DtoGEPi(v,0,0);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
57 LLValue* zerolen = llvm::ConstantInt::get(len->getType()->getContainedType(0), 0, false);
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
58 DtoStore(zerolen, len);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
59
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
60 LLValue* ptr = DtoGEPi(v,0,1);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
61 const LLPointerType* pty = isaPointer(ptr->getType()->getContainedType(0));
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
62 LLValue* nullptr = llvm::ConstantPointerNull::get(pty);
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
63 DtoStore(nullptr, ptr);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
64 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
65
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
66 //////////////////////////////////////////////////////////////////////////////////////////
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
67
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
68 void DtoArrayAssign(LLValue* dst, LLValue* src)
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
69 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
70 Logger::println("DtoArrayAssign");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
71 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
72
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
73 assert(gIR);
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
74 if (dst->getType() == src->getType())
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
75 {
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
76 LLValue* ptr = DtoGEPi(src,0,0);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
77 LLValue* val = DtoLoad(ptr);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
78 ptr = DtoGEPi(dst,0,0);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
79 DtoStore(val, ptr);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
80
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
81 ptr = DtoGEPi(src,0,1);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
82 val = DtoLoad(ptr);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
83 ptr = DtoGEPi(dst,0,1);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
84 DtoStore(val, ptr);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
85 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
86 else
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
87 {
118
d580b95cce2b [svn r122] Fixed temporary delegates can now alloca their own storage.
lindquist
parents: 116
diff changeset
88 Logger::cout() << "array assignment type dont match: " << *dst->getType() << "\n\n" << *src->getType() << '\n';
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
89 const LLArrayType* arrty = isaArray(src->getType()->getContainedType(0));
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 94
diff changeset
90 if (!arrty)
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
91 {
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
92 Logger::cout() << "invalid: " << *src << '\n';
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
93 assert(0);
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
94 }
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
95 const LLType* dstty = getPtrToType(arrty->getElementType());
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
96
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
97 LLValue* dstlen = DtoGEPi(dst,0,0);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
98 LLValue* srclen = DtoConstSize_t(arrty->getNumElements());
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
99 DtoStore(srclen, dstlen);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
100
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
101 LLValue* dstptr = DtoGEPi(dst,0,1);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
102 LLValue* srcptr = DtoBitCast(src, dstty);
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
103 DtoStore(srcptr, dstptr);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
104 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
105 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
106
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
107 //////////////////////////////////////////////////////////////////////////////////////////
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
108
399
0e6b4d65d3f8 Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents: 398
diff changeset
109 void DtoArrayInit(Loc& loc, DValue* array, DValue* value)
37
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
110 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
111 Logger::println("DtoArrayInit");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
112 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
113
295
895e1b50cf2a [svn r316] Fixed array slice assignments like: int[] arr = ...; arr[] = 42;
lindquist
parents: 293
diff changeset
114 LLValue* dim = DtoArrayLen(array);
895e1b50cf2a [svn r316] Fixed array slice assignments like: int[] arr = ...; arr[] = 42;
lindquist
parents: 293
diff changeset
115 LLValue* ptr = DtoArrayPtr(array);
350
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
116 LLValue* val;
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
117
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
118 // give slices and complex values storage (and thus an address to pass)
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
119 if (value->isSlice() || value->isComplex())
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
120 {
479
672eb4893b55 Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents: 442
diff changeset
121 val = DtoAlloca(DtoType(value->getType()), ".tmpparam");
350
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
122 DVarValue lval(value->getType(), val, true);
399
0e6b4d65d3f8 Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents: 398
diff changeset
123 DtoAssign(loc, &lval, value);
350
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
124 }
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
125 else
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
126 {
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
127 val = value->getRVal();
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
128 }
b85cf5faccfc [svn r371] Fixed array init was still broken for immediate slices and complex values.
lindquist
parents: 340
diff changeset
129 assert(val);
295
895e1b50cf2a [svn r316] Fixed array slice assignments like: int[] arr = ...; arr[] = 42;
lindquist
parents: 293
diff changeset
130
339
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
131 // prepare runtime call
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
132 LLSmallVector<LLValue*, 4> args;
43
eb7bf7b7972e [svn r47] fixed a problem with gdc 4.1
lindquist
parents: 40
diff changeset
133 args.push_back(ptr);
eb7bf7b7972e [svn r47] fixed a problem with gdc 4.1
lindquist
parents: 40
diff changeset
134 args.push_back(dim);
eb7bf7b7972e [svn r47] fixed a problem with gdc 4.1
lindquist
parents: 40
diff changeset
135 args.push_back(val);
64
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
136
339
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
137 // determine the right runtime function to call
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
138 const char* funcname = NULL;
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
139 Type* t = value->getType()->toBasetype();
338
0c90d816394f [svn r359] Try to fix DtoArrayInit. Unfinished, breaks for arrays of primitive types.
ChristianK
parents: 334
diff changeset
140
339
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
141 // lets first optimize all zero initializations down to a memset.
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
142 // this simplifies codegen later on as llvm null's have no address!
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
143 if (isaConstant(val) && isaConstant(val)->isNullValue())
338
0c90d816394f [svn r359] Try to fix DtoArrayInit. Unfinished, breaks for arrays of primitive types.
ChristianK
parents: 334
diff changeset
144 {
339
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
145 size_t X = getABITypeSize(val->getType());
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
146 LLValue* nbytes = gIR->ir->CreateMul(dim, DtoConstSize_t(X), ".nbytes");
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
147 DtoMemSetZero(ptr, nbytes);
338
0c90d816394f [svn r359] Try to fix DtoArrayInit. Unfinished, breaks for arrays of primitive types.
ChristianK
parents: 334
diff changeset
148 return;
0c90d816394f [svn r359] Try to fix DtoArrayInit. Unfinished, breaks for arrays of primitive types.
ChristianK
parents: 334
diff changeset
149 }
339
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
150
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
151 // if not a zero initializer, call the appropriate runtime function!
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
152 switch (t->ty)
338
0c90d816394f [svn r359] Try to fix DtoArrayInit. Unfinished, breaks for arrays of primitive types.
ChristianK
parents: 334
diff changeset
153 {
339
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
154 case Tbool:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
155 funcname = "_d_array_init_i1";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
156 break;
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
157
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
158 case Tvoid:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
159 case Tchar:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
160 case Tint8:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
161 case Tuns8:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
162 funcname = "_d_array_init_i8";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
163 break;
338
0c90d816394f [svn r359] Try to fix DtoArrayInit. Unfinished, breaks for arrays of primitive types.
ChristianK
parents: 334
diff changeset
164
339
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
165 case Twchar:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
166 case Tint16:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
167 case Tuns16:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
168 funcname = "_d_array_init_i16";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
169 break;
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
170
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
171 case Tdchar:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
172 case Tint32:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
173 case Tuns32:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
174 funcname = "_d_array_init_i32";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
175 break;
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
176
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
177 case Tint64:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
178 case Tuns64:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
179 funcname = "_d_array_init_i64";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
180 break;
338
0c90d816394f [svn r359] Try to fix DtoArrayInit. Unfinished, breaks for arrays of primitive types.
ChristianK
parents: 334
diff changeset
181
339
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
182 case Tfloat32:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
183 case Timaginary32:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
184 funcname = "_d_array_init_float";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
185 break;
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
186
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
187 case Tfloat64:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
188 case Timaginary64:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
189 funcname = "_d_array_init_double";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
190 break;
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
191
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
192 case Tfloat80:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
193 case Timaginary80:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
194 funcname = "_d_array_init_real";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
195 break;
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
196
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
197 case Tpointer:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
198 case Tclass:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
199 funcname = "_d_array_init_pointer";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
200 args[0] = DtoBitCast(args[0], getPtrToType(getVoidPtrType()));
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
201 args[2] = DtoBitCast(args[2], getVoidPtrType());
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
202 break;
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
203
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
204 // this currently acts as a kind of fallback for all the bastards...
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
205 // FIXME: this is probably too slow.
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
206 case Tstruct:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
207 case Tdelegate:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
208 case Tarray:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
209 case Tsarray:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
210 case Tcomplex32:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
211 case Tcomplex64:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
212 case Tcomplex80:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
213 funcname = "_d_array_init_mem";
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
214 args[0] = DtoBitCast(args[0], getVoidPtrType());
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
215 args[2] = DtoBitCast(args[2], getVoidPtrType());
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
216 args.push_back(DtoConstSize_t(getABITypeSize(DtoType(t))));
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
217 break;
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
218
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
219 default:
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
220 error("unhandled array init: %s = %s", array->getType()->toChars(), value->getType()->toChars());
385a18242485 [svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents: 338
diff changeset
221 assert(0 && "unhandled array init");
37
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
222 }
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
223
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
224 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, funcname);
37
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
225 assert(fn);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
226 Logger::cout() << "calling array init function: " << *fn <<'\n';
315
a9697749e898 [svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents: 308
diff changeset
227 CallOrInvoke* call = gIR->CreateCallOrInvoke(fn, args.begin(), args.end());
37
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
228 call->setCallingConv(llvm::CallingConv::C);
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
229 }
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
230
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
231 //////////////////////////////////////////////////////////////////////////////////////////
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
232
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
233 void DtoSetArray(LLValue* arr, LLValue* dim, LLValue* ptr)
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
234 {
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
235 Logger::println("SetArray");
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
236 assert(isaStruct(arr->getType()->getContainedType(0)));
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
237 DtoStore(dim, DtoGEPi(arr,0,0));
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
238 DtoStore(ptr, DtoGEPi(arr,0,1));
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
239 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
240
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
241 //////////////////////////////////////////////////////////////////////////////////////////
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
242 LLConstant* DtoConstArrayInitializer(ArrayInitializer* arrinit)
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
243 {
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
244 Logger::println("DtoConstArrayInitializer: %s | %s", arrinit->toChars(), arrinit->type->toChars());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
245 LOG_SCOPE;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
246
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 69
diff changeset
247 Type* arrinittype = DtoDType(arrinit->type);
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
248
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
249 Type* t;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
250 integer_t tdim;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
251 if (arrinittype->ty == Tsarray) {
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
252 Logger::println("static array");
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
253 TypeSArray* tsa = (TypeSArray*)arrinittype;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
254 tdim = tsa->dim->toInteger();
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
255 t = tsa;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
256 }
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
257 else if (arrinittype->ty == Tarray) {
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
258 Logger::println("dynamic array");
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
259 t = arrinittype;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
260 tdim = arrinit->dim;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
261 }
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
262 else
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
263 assert(0);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
264
400
e6e972c5cc17 Should only error if array initializer is too long. Too short is ok.
Christian Kamm <kamm incasoftware de>
parents: 399
diff changeset
265 if(arrinit->dim > tdim)
e6e972c5cc17 Should only error if array initializer is too long. Too short is ok.
Christian Kamm <kamm incasoftware de>
parents: 399
diff changeset
266 error(arrinit->loc, "array initializer for %s is too long (%d)", arrinit->type->toChars(), arrinit->dim);
398
811f82dfddbd Add error if array initializer has incorrect length.
Christian Kamm <kamm incasoftware de>
parents: 365
diff changeset
267
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
268 Logger::println("dim = %u", tdim);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
269
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
270 std::vector<LLConstant*> inits(tdim, NULL);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
271
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
272 Type* arrnext = arrinittype->next;
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
273 const LLType* elemty = DtoType(arrinittype->next);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
274
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
275 assert(arrinit->index.dim == arrinit->value.dim);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
276 for (unsigned i=0,j=0; i < tdim; ++i)
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
277 {
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
278 Initializer* init = 0;
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
279 Expression* idx;
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
280
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
281 if (j < arrinit->index.dim)
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
282 idx = (Expression*)arrinit->index.data[j];
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
283 else
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
284 idx = NULL;
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
285
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
286 LLConstant* v = NULL;
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
287
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
288 if (idx)
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
289 {
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
290 Logger::println("%d has idx", i);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
291 // this is pretty weird :/ idx->type turned out NULL for the initializer:
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
292 // const in6_addr IN6ADDR_ANY = { s6_addr8: [0] };
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
293 // in std.c.linux.socket
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
294 if (idx->type) {
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
295 Logger::println("has idx->type", i);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
296 //integer_t k = idx->toInteger();
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
297 //Logger::println("getting value for exp: %s | %s", idx->toChars(), arrnext->toChars());
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
298 LLConstant* cc = idx->toConstElem(gIR);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
299 Logger::println("value gotten");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
300 assert(cc != NULL);
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
301 LLConstantInt* ci = llvm::dyn_cast<LLConstantInt>(cc);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
302 assert(ci != NULL);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
303 uint64_t k = ci->getZExtValue();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
304 if (i == k)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
305 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
306 init = (Initializer*)arrinit->value.data[j];
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
307 assert(init);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
308 ++j;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents: 86
diff changeset
309 }
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
310 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
311 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
312 else
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
313 {
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
314 if (j < arrinit->value.dim) {
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
315 init = (Initializer*)arrinit->value.data[j];
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
316 ++j;
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
317 }
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
318 else
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
319 v = arrnext->defaultInit()->toConstElem(gIR);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
320 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
321
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
322 if (!v)
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
323 v = DtoConstInitializer(t->next, init);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
324 assert(v);
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
325
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
326 inits[i] = v;
176
a074a5ff709c [svn r192] Fixed: String literals as constant expression was broken for utf16/32.
lindquist
parents: 174
diff changeset
327 Logger::cout() << "llval: " << *v << '\n';
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
328 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
329
176
a074a5ff709c [svn r192] Fixed: String literals as constant expression was broken for utf16/32.
lindquist
parents: 174
diff changeset
330 Logger::println("building constant array");
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
331 const LLArrayType* arrty = LLArrayType::get(elemty,tdim);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
332 LLConstant* constarr = LLConstantArray::get(arrty, inits);
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
333
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
334 if (arrinittype->ty == Tsarray)
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
335 return constarr;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
336 else
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
337 assert(arrinittype->ty == Tarray);
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
338
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
339 LLGlobalVariable* gvar = new LLGlobalVariable(arrty,true,LLGlobalValue::InternalLinkage,constarr,"constarray",gIR->module);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
340 LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) };
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
341 LLConstant* gep = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2);
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
342 return DtoConstSlice(DtoConstSize_t(tdim),gep);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
343 }
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
344
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
345 //////////////////////////////////////////////////////////////////////////////////////////
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
346 static LLValue* get_slice_ptr(DSliceValue* e, LLValue*& sz)
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 11
diff changeset
347 {
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
348 assert(e->len != 0);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
349 const LLType* t = e->ptr->getType()->getContainedType(0);
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
350 sz = gIR->ir->CreateMul(DtoConstSize_t(getABITypeSize(t)), e->len, "tmp");
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
351 return e->ptr;
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 11
diff changeset
352 }
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 11
diff changeset
353
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
354 void DtoArrayCopySlices(DSliceValue* dst, DSliceValue* src)
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
355 {
182
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
356 Logger::println("ArrayCopySlices");
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 11
diff changeset
357
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
358 LLValue *sz1,*sz2;
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
359 LLValue* dstarr = get_slice_ptr(dst,sz1);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
360 LLValue* srcarr = get_slice_ptr(src,sz2);
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 11
diff changeset
361
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
362 DtoMemCpy(dstarr, srcarr, sz1);
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
diff changeset
363 }
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 11
diff changeset
364
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
365 void DtoArrayCopyToSlice(DSliceValue* dst, DValue* src)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
366 {
182
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
367 Logger::println("ArrayCopyToSlice");
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
368
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
369 LLValue* sz1;
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
370 LLValue* dstarr = get_slice_ptr(dst,sz1);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
371 LLValue* srcarr = DtoArrayPtr(src);
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
372
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
373 DtoMemCpy(dstarr, srcarr, sz1);
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
374 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
375
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 11
diff changeset
376 //////////////////////////////////////////////////////////////////////////////////////////
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
377 void DtoStaticArrayCopy(LLValue* dst, LLValue* src)
48
4d171915a77b [svn r52] fixed static arrays in struct literals
lindquist
parents: 43
diff changeset
378 {
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
379 Logger::println("StaticArrayCopy");
48
4d171915a77b [svn r52] fixed static arrays in struct literals
lindquist
parents: 43
diff changeset
380
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
381 size_t n = getABITypeSize(dst->getType()->getContainedType(0));
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
382 DtoMemCpy(dst, src, DtoConstSize_t(n));
48
4d171915a77b [svn r52] fixed static arrays in struct literals
lindquist
parents: 43
diff changeset
383 }
4d171915a77b [svn r52] fixed static arrays in struct literals
lindquist
parents: 43
diff changeset
384
4d171915a77b [svn r52] fixed static arrays in struct literals
lindquist
parents: 43
diff changeset
385 //////////////////////////////////////////////////////////////////////////////////////////
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
386 LLConstant* DtoConstSlice(LLConstant* dim, LLConstant* ptr)
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 11
diff changeset
387 {
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
388 LLConstant* values[2] = { dim, ptr };
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
389 return llvm::ConstantStruct::get(values, 2);
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 11
diff changeset
390 }
34
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
391
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
392 //////////////////////////////////////////////////////////////////////////////////////////
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
393 DSliceValue* DtoNewDynArray(Type* arrayType, DValue* dim, bool defaultInit)
34
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
394 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
395 Logger::println("DtoNewDynArray : %s", arrayType->toChars());
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
396 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
397
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
398 // typeinfo arg
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
399 LLValue* arrayTypeInfo = DtoTypeInfoOf(arrayType);
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
400
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
401 // dim arg
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
402 assert(DtoType(dim->getType()) == DtoSize_t());
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
403 LLValue* arrayLen = dim->getRVal();
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
404
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
405 // get runtime function
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
406 bool zeroInit = arrayType->toBasetype()->nextOf()->isZeroInit();
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
407 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, zeroInit ? "_d_newarrayT" : "_d_newarrayiT" );
34
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
408
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
409 // call allocator
315
a9697749e898 [svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents: 308
diff changeset
410 LLValue* newptr = gIR->CreateCallOrInvoke2(fn, arrayTypeInfo, arrayLen, ".gc_mem")->get();
34
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
411
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
412 // cast to wanted type
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
413 const LLType* dstType = DtoType(arrayType)->getContainedType(1);
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
414 if (newptr->getType() != dstType)
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
415 newptr = DtoBitCast(newptr, dstType, ".gc_mem");
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
416
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
417 Logger::cout() << "final ptr = " << *newptr << '\n';
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
418
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
419 #if 0
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
420 if (defaultInit) {
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
421 DValue* e = dty->defaultInit()->toElem(gIR);
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
422 DtoArrayInit(newptr,dim,e->getRVal());
37
77cdca8c210f [svn r41] new'd dynamic arrays are now initialized with the element type's default initializer.
lindquist
parents: 36
diff changeset
423 }
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
424 #endif
34
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
425
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
426 return new DSliceValue(arrayType, arrayLen, newptr);
34
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
427 }
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
428
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
429 //////////////////////////////////////////////////////////////////////////////////////////
286
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
430 DSliceValue* DtoNewMulDimDynArray(Type* arrayType, DValue** dims, size_t ndims, bool defaultInit)
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
431 {
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
432 Logger::println("DtoNewMulDimDynArray : %s", arrayType->toChars());
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
433 LOG_SCOPE;
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
434
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
435 // typeinfo arg
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
436 LLValue* arrayTypeInfo = DtoTypeInfoOf(arrayType);
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
437
293
ebfa488f4abc [svn r314] Get correct value type for newing of multidimensional dynamic arrays.
ChristianK
parents: 291
diff changeset
438 // get value type
ebfa488f4abc [svn r314] Get correct value type for newing of multidimensional dynamic arrays.
ChristianK
parents: 291
diff changeset
439 Type* vtype = arrayType->toBasetype();
ebfa488f4abc [svn r314] Get correct value type for newing of multidimensional dynamic arrays.
ChristianK
parents: 291
diff changeset
440 for (size_t i=0; i<ndims; ++i)
ebfa488f4abc [svn r314] Get correct value type for newing of multidimensional dynamic arrays.
ChristianK
parents: 291
diff changeset
441 vtype = vtype->nextOf();
ebfa488f4abc [svn r314] Get correct value type for newing of multidimensional dynamic arrays.
ChristianK
parents: 291
diff changeset
442
286
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
443 // get runtime function
293
ebfa488f4abc [svn r314] Get correct value type for newing of multidimensional dynamic arrays.
ChristianK
parents: 291
diff changeset
444 bool zeroInit = vtype->isZeroInit();
286
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
445 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, zeroInit ? "_d_newarraymT" : "_d_newarraymiT" );
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
446
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
447 // build dims
479
672eb4893b55 Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents: 442
diff changeset
448 LLValue* dimsArg = DtoAlloca(DtoSize_t(), DtoConstUint(ndims), ".newdims");
287
00eb2c967c3a [svn r308] Really fixed multidimensional new expressions. the first length was bad in the resulting slice.
lindquist
parents: 286
diff changeset
449 LLValue* firstDim = NULL;
286
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
450 for (size_t i=0; i<ndims; ++i)
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
451 {
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
452 LLValue* dim = dims[i]->getRVal();
287
00eb2c967c3a [svn r308] Really fixed multidimensional new expressions. the first length was bad in the resulting slice.
lindquist
parents: 286
diff changeset
453 if (!firstDim) firstDim = dim;
286
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
454 DtoStore(dim, DtoGEPi1(dimsArg, i));
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
455 }
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
456
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
457 // call allocator
315
a9697749e898 [svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents: 308
diff changeset
458 LLValue* newptr = gIR->CreateCallOrInvoke3(fn, arrayTypeInfo, DtoConstSize_t(ndims), dimsArg, ".gc_mem")->get();
286
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
459
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
460 // cast to wanted type
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
461 const LLType* dstType = DtoType(arrayType)->getContainedType(1);
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
462 if (newptr->getType() != dstType)
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
463 newptr = DtoBitCast(newptr, dstType, ".gc_mem");
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
464
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
465 Logger::cout() << "final ptr = " << *newptr << '\n';
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
466
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
467 #if 0
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
468 if (defaultInit) {
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
469 DValue* e = dty->defaultInit()->toElem(gIR);
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
470 DtoArrayInit(newptr,dim,e->getRVal());
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
471 }
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
472 #endif
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
473
287
00eb2c967c3a [svn r308] Really fixed multidimensional new expressions. the first length was bad in the resulting slice.
lindquist
parents: 286
diff changeset
474 assert(firstDim);
00eb2c967c3a [svn r308] Really fixed multidimensional new expressions. the first length was bad in the resulting slice.
lindquist
parents: 286
diff changeset
475 return new DSliceValue(arrayType, firstDim, newptr);
286
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
476 }
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
477
a3b7c19c866c [svn r307] Fixed: multidimensional new expressions now work. Eg.:
lindquist
parents: 280
diff changeset
478 //////////////////////////////////////////////////////////////////////////////////////////
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
479 DSliceValue* DtoResizeDynArray(Type* arrayType, DValue* array, DValue* newdim)
34
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
480 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
481 Logger::println("DtoResizeDynArray : %s", arrayType->toChars());
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
482 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
483
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
484 assert(array);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
485 assert(newdim);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
486 assert(arrayType);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
487 assert(arrayType->toBasetype()->ty == Tarray);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
488
211
f66219e0d530 [svn r227] Fixed: crash in lifetime.d when resizing array of AAs by .length assignment.
lindquist
parents: 205
diff changeset
489 // decide on what runtime function to call based on whether the type is zero initialized
f66219e0d530 [svn r227] Fixed: crash in lifetime.d when resizing array of AAs by .length assignment.
lindquist
parents: 205
diff changeset
490 bool zeroInit = arrayType->toBasetype()->next->isZeroInit();
f66219e0d530 [svn r227] Fixed: crash in lifetime.d when resizing array of AAs by .length assignment.
lindquist
parents: 205
diff changeset
491
f66219e0d530 [svn r227] Fixed: crash in lifetime.d when resizing array of AAs by .length assignment.
lindquist
parents: 205
diff changeset
492 // call runtime
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
493 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, zeroInit ? "_d_arraysetlengthT" : "_d_arraysetlengthiT" );
36
c0967c4b2a74 [svn r40] Cleaned up some of the array routines to use gep/load/store instead of memcpy/memset.
lindquist
parents: 34
diff changeset
494
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
495 LLSmallVector<LLValue*,4> args;
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
496 args.push_back(DtoTypeInfoOf(arrayType));
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
497 args.push_back(newdim->getRVal());
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
498 args.push_back(DtoArrayLen(array));
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
499
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
500 LLValue* arrPtr = DtoArrayPtr(array);
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
501 Logger::cout() << "arrPtr = " << *arrPtr << '\n';
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
502 args.push_back(DtoBitCast(arrPtr, fn->getFunctionType()->getParamType(3), "tmp"));
36
c0967c4b2a74 [svn r40] Cleaned up some of the array routines to use gep/load/store instead of memcpy/memset.
lindquist
parents: 34
diff changeset
503
315
a9697749e898 [svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents: 308
diff changeset
504 LLValue* newptr = gIR->CreateCallOrInvoke(fn, args.begin(), args.end(), ".gc_mem")->get();
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
505 if (newptr->getType() != arrPtr->getType())
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
506 newptr = DtoBitCast(newptr, arrPtr->getType(), ".gc_mem");
36
c0967c4b2a74 [svn r40] Cleaned up some of the array routines to use gep/load/store instead of memcpy/memset.
lindquist
parents: 34
diff changeset
507
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
508 return new DSliceValue(arrayType, newdim->getRVal(), newptr);
34
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
509 }
4648206ca213 [svn r38] * resizing dynamic arrays support
lindquist
parents: 22
diff changeset
510
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 37
diff changeset
511 //////////////////////////////////////////////////////////////////////////////////////////
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
512 DSliceValue* DtoCatAssignElement(DValue* array, Expression* exp)
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 37
diff changeset
513 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
514 Logger::println("DtoCatAssignElement");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
515 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
516
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
517 assert(array);
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 37
diff changeset
518
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
519 LLValue* idx = DtoArrayLen(array);
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
520 LLValue* one = DtoConstSize_t(1);
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
521 LLValue* len = gIR->ir->CreateAdd(idx,one,"tmp");
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
522
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
523 DValue* newdim = new DImValue(Type::tsize_t, len);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
524 DSliceValue* slice = DtoResizeDynArray(array->getType(), array, newdim);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
525
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
526 LLValue* ptr = slice->ptr;
205
9d44ec83acd1 [svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents: 203
diff changeset
527 ptr = llvm::GetElementPtrInst::Create(ptr, idx, "tmp", gIR->scopebb());
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 37
diff changeset
528
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
529 DValue* dptr = new DVarValue(exp->type, ptr, true);
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
530
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
531 DValue* e = exp->toElem(gIR);
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
532
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
533 if (!e->inPlace())
399
0e6b4d65d3f8 Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents: 398
diff changeset
534 DtoAssign(exp->loc, dptr, e);
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
535
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
536 return slice;
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
537 }
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
538
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
539 //////////////////////////////////////////////////////////////////////////////////////////
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
540 DSliceValue* DtoCatAssignArray(DValue* arr, Expression* exp)
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
541 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
542 Logger::println("DtoCatAssignArray");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
543 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
544
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
545 DValue* e = exp->toElem(gIR);
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
546
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
547 llvm::Value *len1, *len2, *src1, *src2, *res;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
548
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
549 len1 = DtoArrayLen(arr);
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
550 len2 = DtoArrayLen(e);
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
551 res = gIR->ir->CreateAdd(len1,len2,"tmp");
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
552
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
553 DValue* newdim = new DImValue(Type::tsize_t, res);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
554 DSliceValue* slice = DtoResizeDynArray(arr->getType(), arr, newdim);
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
555
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
556 src1 = slice->ptr;
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
557 src2 = DtoArrayPtr(e);
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
558
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
559 // advance ptr
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
560 src1 = gIR->ir->CreateGEP(src1,len1,"tmp");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
561
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
562 // memcpy
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
563 LLValue* elemSize = DtoConstSize_t(getABITypeSize(src2->getType()->getContainedType(0)));
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
564 LLValue* bytelen = gIR->ir->CreateMul(len2, elemSize, "tmp");
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
565 DtoMemCpy(src1,src2,bytelen);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
566
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
567 return slice;
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 37
diff changeset
568 }
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 37
diff changeset
569
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 37
diff changeset
570 //////////////////////////////////////////////////////////////////////////////////////////
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
571 DSliceValue* DtoCatArrays(Type* type, Expression* exp1, Expression* exp2)
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
572 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
573 Logger::println("DtoCatArrays");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
574 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
575
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 69
diff changeset
576 Type* t1 = DtoDType(exp1->type);
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 69
diff changeset
577 Type* t2 = DtoDType(exp2->type);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
578
360
9c9544fd769d [svn r381] Allow concatenating with static arrays.
ChristianK
parents: 350
diff changeset
579 assert(t1->ty == Tarray || t1->ty == Tsarray);
9c9544fd769d [svn r381] Allow concatenating with static arrays.
ChristianK
parents: 350
diff changeset
580 assert(t2->ty == Tarray || t2->ty == Tsarray);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
581
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
582 DValue* e1 = exp1->toElem(gIR);
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
583 DValue* e2 = exp2->toElem(gIR);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
584
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
585 llvm::Value *len1, *len2, *src1, *src2, *res;
174
16e676ae5ab4 [svn r190] Fixed array concatenation for some broken cases.
lindquist
parents: 173
diff changeset
586
16e676ae5ab4 [svn r190] Fixed array concatenation for some broken cases.
lindquist
parents: 173
diff changeset
587 len1 = DtoArrayLen(e1);
16e676ae5ab4 [svn r190] Fixed array concatenation for some broken cases.
lindquist
parents: 173
diff changeset
588 len2 = DtoArrayLen(e2);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
589 res = gIR->ir->CreateAdd(len1,len2,"tmp");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
590
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
591 DValue* lenval = new DImValue(Type::tsize_t, res);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
592 DSliceValue* slice = DtoNewDynArray(type, lenval, false);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
593 LLValue* mem = slice->ptr;
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
594
174
16e676ae5ab4 [svn r190] Fixed array concatenation for some broken cases.
lindquist
parents: 173
diff changeset
595 src1 = DtoArrayPtr(e1);
16e676ae5ab4 [svn r190] Fixed array concatenation for some broken cases.
lindquist
parents: 173
diff changeset
596 src2 = DtoArrayPtr(e2);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
597
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
598 // first memcpy
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
599 LLValue* elemSize = DtoConstSize_t(getABITypeSize(src1->getType()->getContainedType(0)));
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
600 LLValue* bytelen = gIR->ir->CreateMul(len1, elemSize, "tmp");
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
601 DtoMemCpy(mem,src1,bytelen);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
602
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
603 // second memcpy
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
604 mem = gIR->ir->CreateGEP(mem,len1,"tmp");
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
605 bytelen = gIR->ir->CreateMul(len2, elemSize, "tmp");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
606 DtoMemCpy(mem,src2,bytelen);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
607
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
608 return slice;
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
609 }
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
610
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 54
diff changeset
611 //////////////////////////////////////////////////////////////////////////////////////////
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
612 DSliceValue* DtoCatArrayElement(Type* type, Expression* exp1, Expression* exp2)
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
613 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
614 Logger::println("DtoCatArrayElement");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
615 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
616
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
617 Type* t1 = DtoDType(exp1->type);
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
618 Type* t2 = DtoDType(exp2->type);
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
619
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
620 DValue* e1 = exp1->toElem(gIR);
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
621 DValue* e2 = exp2->toElem(gIR);
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
622
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
623 llvm::Value *len1, *src1, *res;
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
624
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
625 // handle prefix case, eg. int~int[]
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
626 if (t2->next && t1 == DtoDType(t2->next))
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
627 {
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
628 len1 = DtoArrayLen(e2);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
629 res = gIR->ir->CreateAdd(len1,DtoConstSize_t(1),"tmp");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
630
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
631 DValue* lenval = new DImValue(Type::tsize_t, res);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
632 DSliceValue* slice = DtoNewDynArray(type, lenval, false);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
633 LLValue* mem = slice->ptr;
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
634
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
635 DVarValue* memval = new DVarValue(e1->getType(), mem, true);
399
0e6b4d65d3f8 Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents: 398
diff changeset
636 DtoAssign(exp1->loc, memval, e1);
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
637
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
638 src1 = DtoArrayPtr(e2);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
639
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
640 mem = gIR->ir->CreateGEP(mem,DtoConstSize_t(1),"tmp");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
641
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
642 LLValue* elemSize = DtoConstSize_t(getABITypeSize(src1->getType()->getContainedType(0)));
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
643 LLValue* bytelen = gIR->ir->CreateMul(len1, elemSize, "tmp");
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
644 DtoMemCpy(mem,src1,bytelen);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
645
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
646
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
647 return slice;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
648 }
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
649 // handle suffix case, eg. int[]~int
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
650 else
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
651 {
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
652 len1 = DtoArrayLen(e1);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
653 res = gIR->ir->CreateAdd(len1,DtoConstSize_t(1),"tmp");
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
654
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
655 DValue* lenval = new DImValue(Type::tsize_t, res);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
656 DSliceValue* slice = DtoNewDynArray(type, lenval, false);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
657 LLValue* mem = slice->ptr;
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
658
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
659 src1 = DtoArrayPtr(e1);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
660
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
661 LLValue* elemSize = DtoConstSize_t(getABITypeSize(src1->getType()->getContainedType(0)));
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
662 LLValue* bytelen = gIR->ir->CreateMul(len1, elemSize, "tmp");
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
663 DtoMemCpy(mem,src1,bytelen);
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
664
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
665 mem = gIR->ir->CreateGEP(mem,len1,"tmp");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
666 DVarValue* memval = new DVarValue(e2->getType(), mem, true);
399
0e6b4d65d3f8 Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents: 398
diff changeset
667 DtoAssign(exp1->loc, memval, e2);
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
668
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
669 return slice;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
670 }
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
671 }
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
672
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 127
diff changeset
673 //////////////////////////////////////////////////////////////////////////////////////////
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
674 // helper for eq and cmp
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
675 static LLValue* DtoArrayEqCmp_impl(Loc& loc, const char* func, DValue* l, DValue* r, bool useti)
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 37
diff changeset
676 {
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
677 Logger::println("comparing arrays");
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
678 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, func);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
679 assert(fn);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
680
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
681 LLValue* lmem;
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
682 LLValue* rmem;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
683
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
684 // cast static arrays to dynamic ones, this turns them into DSliceValues
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
685 Logger::println("casting to dynamic arrays");
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
686 Type* l_ty = DtoDType(l->getType());
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
687 Type* r_ty = DtoDType(r->getType());
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
688 assert(l_ty->next == r_ty->next);
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
689 if ((l_ty->ty == Tsarray) || (r_ty->ty == Tsarray)) {
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
690 Type* a_ty = l_ty->next->arrayOf();
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
691 if (l_ty->ty == Tsarray)
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
692 l = DtoCastArray(loc, l, a_ty);
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
693 if (r_ty->ty == Tsarray)
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
694 r = DtoCastArray(loc, r, a_ty);
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
695 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
696
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
697 Logger::println("giving storage");
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
698
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
699 // we need to give slices storage
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
700 if (l->isSlice()) {
479
672eb4893b55 Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents: 442
diff changeset
701 lmem = DtoAlloca(DtoType(l->getType()), "tmpparam");
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
702 DtoSetArray(lmem, DtoArrayLen(l), DtoArrayPtr(l));
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
703 }
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
704 // also null
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
705 else if (l->isNull())
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
706 {
479
672eb4893b55 Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents: 442
diff changeset
707 lmem = DtoAlloca(DtoType(l->getType()), "tmpparam");
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
708 DtoSetArray(lmem, llvm::Constant::getNullValue(DtoSize_t()), llvm::Constant::getNullValue(DtoType(l->getType()->next->pointerTo())));
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
709 }
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
710 else
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
711 lmem = l->getRVal();
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
712
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
713 // and for the rvalue ...
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
714 // we need to give slices storage
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
715 if (r->isSlice()) {
479
672eb4893b55 Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents: 442
diff changeset
716 rmem = DtoAlloca(DtoType(r->getType()), "tmpparam");
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
717 DtoSetArray(rmem, DtoArrayLen(r), DtoArrayPtr(r));
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
718 }
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
719 // also null
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
720 else if (r->isNull())
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
721 {
479
672eb4893b55 Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents: 442
diff changeset
722 rmem = DtoAlloca(DtoType(r->getType()), "tmpparam");
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
723 DtoSetArray(rmem, llvm::Constant::getNullValue(DtoSize_t()), llvm::Constant::getNullValue(DtoType(r->getType()->next->pointerTo())));
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
724 }
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
725 else
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
726 rmem = r->getRVal();
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
727
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
728 const LLType* pt = fn->getFunctionType()->getParamType(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
729
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
730 LLSmallVector<LLValue*, 3> args;
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
731 Logger::cout() << "bitcasting to " << *pt << '\n';
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
732 Logger::cout() << *lmem << '\n';
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
733 Logger::cout() << *rmem << '\n';
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
734 args.push_back(DtoBitCast(lmem,pt));
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
735 args.push_back(DtoBitCast(rmem,pt));
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
736
291
068cb3c60afb [svn r312] Changed assert codegen to insert an unreachable terminator after the call to the assert function, which currently calls abort().
lindquist
parents: 287
diff changeset
737 // pass array typeinfo ?
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 99
diff changeset
738 if (useti) {
291
068cb3c60afb [svn r312] Changed assert codegen to insert an unreachable terminator after the call to the assert function, which currently calls abort().
lindquist
parents: 287
diff changeset
739 Type* t = l->getType();
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
740 LLValue* tival = DtoTypeInfoOf(t);
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
741 // DtoTypeInfoOf only does declare, not enough in this case :/
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
742 DtoForceConstInitDsymbol(t->vtinfo);
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
743 Logger::cout() << "typeinfo decl: " << *tival << '\n';
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 99
diff changeset
744
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 99
diff changeset
745 pt = fn->getFunctionType()->getParamType(2);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
746 args.push_back(DtoBitCast(tival, pt));
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
747 }
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
748
315
a9697749e898 [svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents: 308
diff changeset
749 CallOrInvoke* call = gIR->CreateCallOrInvoke(fn, args.begin(), args.end(), "tmp");
275
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
750
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
751 // set param attrs
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
752 llvm::PAListPtr palist;
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
753 palist = palist.addAttr(1, llvm::ParamAttr::ByVal);
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
754 palist = palist.addAttr(2, llvm::ParamAttr::ByVal);
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
755 call->setParamAttrs(palist);
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
756
315
a9697749e898 [svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents: 308
diff changeset
757 return call->get();
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
758 }
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
759
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
760 //////////////////////////////////////////////////////////////////////////////////////////
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
761 LLValue* DtoArrayEquals(Loc& loc, TOK op, DValue* l, DValue* r)
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
762 {
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
763 LLValue* res = DtoArrayEqCmp_impl(loc, "_adEq", l, r, true);
365
bfb9d28f045a [svn r386] Fixed broken DtoBoolean.
lindquist
parents: 364
diff changeset
764 res = gIR->ir->CreateICmpNE(res, DtoConstInt(0), "tmp");
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
765 if (op == TOKnotequal)
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
766 res = gIR->ir->CreateNot(res, "tmp");
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
767
297
5de180867c46 [svn r318] Moved the call to DtoBoolean before the not instruction.
ChristianK
parents: 296
diff changeset
768 return res;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
769 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
770
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
771 //////////////////////////////////////////////////////////////////////////////////////////
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
772 LLValue* DtoArrayCompare(Loc& loc, TOK op, DValue* l, DValue* r)
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
773 {
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
774 LLValue* res = 0;
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
775
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
776 llvm::ICmpInst::Predicate cmpop;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
777 bool skip = false;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
778
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
779 switch(op)
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
780 {
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
781 case TOKlt:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
782 case TOKul:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
783 cmpop = llvm::ICmpInst::ICMP_SLT;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
784 break;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
785 case TOKle:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
786 case TOKule:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
787 cmpop = llvm::ICmpInst::ICMP_SLE;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
788 break;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
789 case TOKgt:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
790 case TOKug:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
791 cmpop = llvm::ICmpInst::ICMP_SGT;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
792 break;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
793 case TOKge:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
794 case TOKuge:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
795 cmpop = llvm::ICmpInst::ICMP_SGE;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
796 break;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
797 case TOKue:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
798 cmpop = llvm::ICmpInst::ICMP_EQ;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
799 break;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
800 case TOKlg:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
801 cmpop = llvm::ICmpInst::ICMP_NE;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
802 break;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
803 case TOKleg:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
804 skip = true;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
805 res = llvm::ConstantInt::getTrue();
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
806 break;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
807 case TOKunord:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
808 skip = true;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
809 res = llvm::ConstantInt::getFalse();
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
810 break;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
811
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
812 default:
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
813 assert(0);
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
814 }
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
815
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
816 if (!skip)
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
817 {
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 99
diff changeset
818 Type* t = DtoDType(DtoDType(l->getType())->next);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 99
diff changeset
819 if (t->ty == Tchar)
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
820 res = DtoArrayEqCmp_impl(loc, "_adCmpChar", l, r, false);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 99
diff changeset
821 else
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
822 res = DtoArrayEqCmp_impl(loc, "_adCmp", l, r, true);
365
bfb9d28f045a [svn r386] Fixed broken DtoBoolean.
lindquist
parents: 364
diff changeset
823 res = gIR->ir->CreateICmp(cmpop, res, DtoConstInt(0), "tmp");
99
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
824 }
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
825
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
826 assert(res);
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
827 return res;
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
828 }
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
829
a676a7743642 [svn r103] Array comparisons are now fully implemented, that is - to the extent that TypeInfo is.
lindquist
parents: 98
diff changeset
830 //////////////////////////////////////////////////////////////////////////////////////////
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
831 LLValue* DtoArrayCastLength(LLValue* len, const LLType* elemty, const LLType* newelemty)
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
832 {
182
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
833 Logger::println("DtoArrayCastLength");
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
834 LOG_SCOPE;
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
835
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
836 assert(len);
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
837 assert(elemty);
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
838 assert(newelemty);
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
839
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
840 size_t esz = getABITypeSize(elemty);
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
841 size_t nsz = getABITypeSize(newelemty);
94
61615fa85940 [svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
lindquist
parents: 88
diff changeset
842 if (esz == nsz)
61615fa85940 [svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
lindquist
parents: 88
diff changeset
843 return len;
61615fa85940 [svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
lindquist
parents: 88
diff changeset
844
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
845 LLSmallVector<LLValue*, 3> args;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
846 args.push_back(len);
94
61615fa85940 [svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
lindquist
parents: 88
diff changeset
847 args.push_back(llvm::ConstantInt::get(DtoSize_t(), esz, false));
61615fa85940 [svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
lindquist
parents: 88
diff changeset
848 args.push_back(llvm::ConstantInt::get(DtoSize_t(), nsz, false));
61615fa85940 [svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
lindquist
parents: 88
diff changeset
849
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
850 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_array_cast_len");
315
a9697749e898 [svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents: 308
diff changeset
851 return gIR->CreateCallOrInvoke(fn, args.begin(), args.end(), "tmp")->get();
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 51
diff changeset
852 }
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
853
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
854 //////////////////////////////////////////////////////////////////////////////////////////
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
855 LLValue* DtoDynArrayIs(TOK op, DValue* l, DValue* r)
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
856 {
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
857 LLValue *len1, *ptr1, *len2, *ptr2;
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
858
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
859 assert(l);
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
860 assert(r);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
861
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
862 // compare lengths
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
863 len1 = DtoArrayLen(l);
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
864 len2 = DtoArrayLen(r);
365
bfb9d28f045a [svn r386] Fixed broken DtoBoolean.
lindquist
parents: 364
diff changeset
865 LLValue* b1 = gIR->ir->CreateICmpEQ(len1,len2,"tmp");
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
866
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
867 // compare pointers
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
868 ptr1 = DtoArrayPtr(l);
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
869 ptr2 = DtoArrayPtr(r);
365
bfb9d28f045a [svn r386] Fixed broken DtoBoolean.
lindquist
parents: 364
diff changeset
870 LLValue* b2 = gIR->ir->CreateICmpEQ(ptr1,ptr2,"tmp");
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 64
diff changeset
871
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
872 // combine
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
873 LLValue* res = gIR->ir->CreateAnd(b1,b2,"tmp");
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 64
diff changeset
874
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
875 // return result
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
876 return (op == TOKnotidentity) ? gIR->ir->CreateNot(res) : res;
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
877 }
64
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
878
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
879 //////////////////////////////////////////////////////////////////////////////////////////
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
880 LLConstant* DtoConstStaticArray(const LLType* t, LLConstant* c)
64
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
881 {
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
882 const LLArrayType* at = isaArray(t);
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 94
diff changeset
883 assert(at);
64
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
884
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 94
diff changeset
885 if (isaArray(at->getElementType()))
64
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
886 {
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 69
diff changeset
887 c = DtoConstStaticArray(at->getElementType(), c);
64
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
888 }
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
889 else {
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
890 assert(at->getElementType() == c->getType());
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
891 }
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
892 std::vector<LLConstant*> initvals;
64
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
893 initvals.resize(at->getNumElements(), c);
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
894 return llvm::ConstantArray::get(at, initvals);
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 58
diff changeset
895 }
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
896
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
897 //////////////////////////////////////////////////////////////////////////////////////////
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
898 LLValue* DtoArrayLen(DValue* v)
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
899 {
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
900 Logger::println("DtoArrayLen");
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
901 LOG_SCOPE;
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
902
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
903 Type* t = DtoDType(v->getType());
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
904 if (t->ty == Tarray) {
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
905 if (DSliceValue* s = v->isSlice())
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
906 return s->len;
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
907 else if (v->isNull())
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
908 return DtoConstSize_t(0);
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
909 return DtoLoad(DtoGEPi(v->getRVal(), 0,0));
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
910 }
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
911 else if (t->ty == Tsarray) {
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 109
diff changeset
912 assert(!v->isSlice());
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
913 assert(!v->isNull());
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
914 LLValue* rv = v->getRVal();
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
915 const LLArrayType* t = isaArray(rv->getType()->getContainedType(0));
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
916 assert(t);
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
917 return DtoConstSize_t(t->getNumElements());
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
918 }
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
919 assert(0 && "unsupported array for len");
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
920 return 0;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
921 }
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
922
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
923 //////////////////////////////////////////////////////////////////////////////////////////
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
924 LLValue* DtoArrayPtr(DValue* v)
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
925 {
203
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
926 Logger::println("DtoArrayPtr");
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
927 LOG_SCOPE;
e881c9b1c738 [svn r219] Fixed: the tango/lib/gc/basic garbage collector now compiles and links into an executable (change in tango/lib/llvmdc-posix.mak), closes #5 .
lindquist
parents: 193
diff changeset
928
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
929 Type* t = DtoDType(v->getType());
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
930 if (t->ty == Tarray) {
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
931 if (DSliceValue* s = v->isSlice())
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
932 return s->ptr;
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
933 else if (v->isNull())
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
934 return getNullPtr(getPtrToType(DtoType(t->next)));
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
935 return DtoLoad(DtoGEPi(v->getRVal(), 0,1));
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
936 }
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
937 else if (t->ty == Tsarray) {
308
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
938 assert(!v->isSlice());
6b62e8cdf970 [svn r329] Cleaned up a bunch of array code for handling special slice cases no
lindquist
parents: 297
diff changeset
939 assert(!v->isNull());
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
940 return DtoGEPi(v->getRVal(), 0,0);
86
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
941 }
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
942 assert(0);
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
943 return 0;
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
944 }
fd32135dca3e [svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents: 81
diff changeset
945
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
946 //////////////////////////////////////////////////////////////////////////////////////////
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
947 DValue* DtoCastArray(Loc& loc, DValue* u, Type* to)
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
948 {
182
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
949 Logger::println("DtoCastArray");
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
950 LOG_SCOPE;
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
951
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
952 const LLType* tolltype = DtoType(to);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
953
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
954 Type* totype = DtoDType(to);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
955 Type* fromtype = DtoDType(u->getType());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
956 assert(fromtype->ty == Tarray || fromtype->ty == Tsarray);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
957
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
958 LLValue* rval;
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
959 LLValue* rval2;
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
960 bool isslice = false;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
961
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
962 Logger::cout() << "from array or sarray" << '\n';
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
963 if (totype->ty == Tpointer) {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
964 Logger::cout() << "to pointer" << '\n';
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 162
diff changeset
965 rval = DtoArrayPtr(u);
193
aca17e55b7a5 [svn r209] Fixed: exotic array to pointer casts were broken.
lindquist
parents: 182
diff changeset
966 if (rval->getType() != tolltype)
aca17e55b7a5 [svn r209] Fixed: exotic array to pointer casts were broken.
lindquist
parents: 182
diff changeset
967 rval = gIR->ir->CreateBitCast(rval, tolltype, "tmp");
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
968 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
969 else if (totype->ty == Tarray) {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
970 Logger::cout() << "to array" << '\n';
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
971
328
7086a84ab3d6 [svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents: 315
diff changeset
972 const LLType* ptrty = DtoArrayType(totype)->getContainedType(1);
7086a84ab3d6 [svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents: 315
diff changeset
973 const LLType* ety = DtoTypeNotVoid(fromtype->next);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
974
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
975 if (DSliceValue* usl = u->isSlice()) {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
976 Logger::println("from slice");
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
977 Logger::cout() << "from: " << *usl->ptr << " to: " << *ptrty << '\n';
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
978 rval = DtoBitCast(usl->ptr, ptrty);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
979 if (fromtype->next->size() == totype->next->size())
182
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
980 rval2 = DtoArrayLen(usl);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
981 else
182
6526cf5bb2be [svn r198] Fixed: doing a length-changing cast of a full slice segfaulted. eg:
lindquist
parents: 176
diff changeset
982 rval2 = DtoArrayCastLength(DtoArrayLen(usl), ety, ptrty->getContainedType(0));
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
983 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
984 else {
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
985 LLValue* uval = u->getRVal();
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
986 if (fromtype->ty == Tsarray) {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
987 Logger::cout() << "uvalTy = " << *uval->getType() << '\n';
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
988 assert(isaPointer(uval->getType()));
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
989 const LLArrayType* arrty = isaArray(uval->getType()->getContainedType(0));
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
990
425
944d43f3779f Fix the static array cast size check.
Christian Kamm <kamm incasoftware de>
parents: 424
diff changeset
991 if(arrty->getNumElements()*fromtype->next->size() % totype->next->size() != 0)
424
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
992 {
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
993 error(loc, "invalid cast from '%s' to '%s', the element sizes don't line up", fromtype->toChars(), totype->toChars());
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
994 fatal();
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
995 }
c8d98ccad0cc Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents: 400
diff changeset
996
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
997 rval2 = llvm::ConstantInt::get(DtoSize_t(), arrty->getNumElements(), false);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
998 rval2 = DtoArrayCastLength(rval2, ety, ptrty->getContainedType(0));
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
999 rval = DtoBitCast(uval, ptrty);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1000 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1001 else {
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
1002 LLValue* zero = llvm::ConstantInt::get(LLType::Int32Ty, 0, false);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
1003 LLValue* one = llvm::ConstantInt::get(LLType::Int32Ty, 1, false);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
1004 rval2 = DtoGEP(uval,zero,zero);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
1005 rval2 = DtoLoad(rval2);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1006 rval2 = DtoArrayCastLength(rval2, ety, ptrty->getContainedType(0));
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1007
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
1008 rval = DtoGEP(uval,zero,one);
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 234
diff changeset
1009 rval = DtoLoad(rval);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1010 //Logger::cout() << *e->mem->getType() << '|' << *ptrty << '\n';
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 211
diff changeset
1011 rval = DtoBitCast(rval, ptrty);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1012 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1013 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1014 isslice = true;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1015 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1016 else if (totype->ty == Tsarray) {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1017 Logger::cout() << "to sarray" << '\n';
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1018 assert(0);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1019 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1020 else {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1021 assert(0);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1022 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1023
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1024 if (isslice) {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1025 Logger::println("isslice");
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1026 return new DSliceValue(to, rval2, rval);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1027 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1028
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1029 return new DImValue(to, rval);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
1030 }
442
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1031
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1032
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1033 //////////////////////////////////////////////////////////////////////////////////////////
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1034 void DtoArrayBoundsCheck(Loc& loc, DValue* arr, DValue* index, bool isslice)
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1035 {
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1036 Type* arrty = arr->getType()->toBasetype();
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1037 assert((arrty->ty == Tsarray || arrty->ty == Tarray) && "Can only array bounds check for static or dynamic arrays");
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1038
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1039 // static arrays can get static checks for static indices
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1040
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1041 if(arr->getType()->ty == Tsarray)
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1042 {
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1043 TypeSArray* tsa = (TypeSArray*)arrty;
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1044 size_t tdim = tsa->dim->toInteger();
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1045
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1046 if(llvm::ConstantInt* cindex = llvm::dyn_cast<llvm::ConstantInt>(index->getRVal()))
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1047 if(cindex->uge(tdim + (isslice ? 1 : 0))) {
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1048 size_t cindexval = cindex->getValue().getZExtValue();
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1049 if(!isslice)
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1050 error(loc, "index %u is larger or equal array size %u", cindexval, tdim);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1051 else
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1052 error(loc, "slice upper bound %u is larger than array size %u", cindexval, tdim);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1053 return;
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1054 }
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1055 }
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1056
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1057 // runtime check
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1058
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1059 llvm::BasicBlock* oldend = gIR->scopeend();
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1060 llvm::BasicBlock* failbb = llvm::BasicBlock::Create("arrayboundscheckfail", gIR->topfunc(), oldend);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1061 llvm::BasicBlock* okbb = llvm::BasicBlock::Create("arrayboundsok", gIR->topfunc(), oldend);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1062
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1063 llvm::ICmpInst::Predicate cmpop = isslice ? llvm::ICmpInst::ICMP_ULE : llvm::ICmpInst::ICMP_ULT;
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1064 LLValue* cond = gIR->ir->CreateICmp(cmpop, index->getRVal(), DtoArrayLen(arr), "boundscheck");
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1065 gIR->ir->CreateCondBr(cond, okbb, failbb);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1066
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1067 // set up failbb to call the array bounds error runtime function
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1068
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1069 gIR->scope() = IRScope(failbb, okbb);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1070
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1071 std::vector<LLValue*> args;
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1072 llvm::PAListPtr palist;
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1073
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1074 // file param
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1075 // FIXME: every array bounds check creates a global for the filename !!!
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1076 LLConstant* c = DtoConstString(loc.filename);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1077
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1078 llvm::AllocaInst* alloc = gIR->func()->srcfileArg;
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1079 if (!alloc)
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1080 {
479
672eb4893b55 Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents: 442
diff changeset
1081 alloc = DtoAlloca(c->getType(), ".srcfile");
442
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1082 gIR->func()->srcfileArg = alloc;
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1083 }
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1084 LLValue* ptr = DtoGEPi(alloc, 0,0, "tmp");
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1085 DtoStore(c->getOperand(0), ptr);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1086 ptr = DtoGEPi(alloc, 0,1, "tmp");
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1087 DtoStore(c->getOperand(1), ptr);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1088
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1089 args.push_back(alloc);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1090 palist = palist.addAttr(1, llvm::ParamAttr::ByVal);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1091
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1092 // line param
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1093 c = DtoConstUint(loc.linnum);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1094 args.push_back(c);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1095
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1096 // call
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1097 llvm::Function* errorfn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_array_bounds");
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1098 CallOrInvoke* call = gIR->CreateCallOrInvoke(errorfn, args.begin(), args.end());
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1099 call->setParamAttrs(palist);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1100
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1101 // the function does not return
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1102 gIR->ir->CreateUnreachable();
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1103
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1104
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1105 // if ok, proceed in okbb
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1106 gIR->scope() = IRScope(okbb, oldend);
76078c8ab5b9 Move DtoArrayBoundsCheck from llvmhelpers to arrays.
Christian Kamm <kamm incasoftware de>
parents: 425
diff changeset
1107 }