Mercurial > projects > ldc
annotate ir/irtypestruct.cpp @ 1638:0de4525a9ed6
Apply workaround for #395 by klickverbot.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Mon, 08 Mar 2010 20:06:08 +0100 |
parents | 8c37dcd7cfde |
children |
rev | line source |
---|---|
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
1 #include "llvm/DerivedTypes.h" |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
2 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
3 #include "aggregate.h" |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
4 #include "declaration.h" |
1632
8c37dcd7cfde
Allow unions with void-initialized members.
Matti Niemenmaa <matti.niemenmaa+hg@iki.fi>
parents:
1574
diff
changeset
|
5 #include "init.h" |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
6 #include "mtype.h" |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
7 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
8 #include "gen/irstate.h" |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
9 #include "gen/tollvm.h" |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
10 #include "gen/logger.h" |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
11 #include "gen/utils.h" |
1351
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1309
diff
changeset
|
12 #include "gen/llvmhelpers.h" |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
13 #include "ir/irtypestruct.h" |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
14 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
15 ////////////////////////////////////////////////////////////////////////////// |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
16 ////////////////////////////////////////////////////////////////////////////// |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
17 ////////////////////////////////////////////////////////////////////////////// |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
18 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
19 IrTypeAggr::IrTypeAggr(AggregateDeclaration * ad) |
1571
8d086d552909
IntegerType is now contextifed.
Benjamin Kramer <benny.kra@gmail.com>
parents:
1569
diff
changeset
|
20 : IrType(ad->type, llvm::OpaqueType::get(gIR->context())), |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
21 aggr(ad) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
22 { |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
23 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
24 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
25 ////////////////////////////////////////////////////////////////////////////// |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
26 ////////////////////////////////////////////////////////////////////////////// |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
27 ////////////////////////////////////////////////////////////////////////////// |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
28 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
29 IrTypeStruct::IrTypeStruct(StructDeclaration * sd) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
30 : IrTypeAggr(sd), |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
31 sd(sd), |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
32 ts((TypeStruct*)sd->type) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
33 { |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
34 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
35 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
36 ////////////////////////////////////////////////////////////////////////////// |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
37 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
38 size_t add_zeros(std::vector<const llvm::Type*>& defaultTypes, size_t diff) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
39 { |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
40 size_t n = defaultTypes.size(); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
41 while (diff) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
42 { |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
43 if (global.params.is64bit && diff % 8 == 0) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
44 { |
1571
8d086d552909
IntegerType is now contextifed.
Benjamin Kramer <benny.kra@gmail.com>
parents:
1569
diff
changeset
|
45 defaultTypes.push_back(llvm::Type::getInt64Ty(gIR->context())); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
46 diff -= 8; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
47 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
48 else if (diff % 4 == 0) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
49 { |
1571
8d086d552909
IntegerType is now contextifed.
Benjamin Kramer <benny.kra@gmail.com>
parents:
1569
diff
changeset
|
50 defaultTypes.push_back(llvm::Type::getInt32Ty(gIR->context())); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
51 diff -= 4; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
52 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
53 else if (diff % 2 == 0) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
54 { |
1571
8d086d552909
IntegerType is now contextifed.
Benjamin Kramer <benny.kra@gmail.com>
parents:
1569
diff
changeset
|
55 defaultTypes.push_back(llvm::Type::getInt16Ty(gIR->context())); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
56 diff -= 2; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
57 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
58 else |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
59 { |
1571
8d086d552909
IntegerType is now contextifed.
Benjamin Kramer <benny.kra@gmail.com>
parents:
1569
diff
changeset
|
60 defaultTypes.push_back(llvm::Type::getInt8Ty(gIR->context())); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
61 diff -= 1; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
62 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
63 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
64 return defaultTypes.size() - n; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
65 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
66 |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
67 bool var_offset_sort_cb(const VarDeclaration* v1, const VarDeclaration* v2) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
68 { |
1270
dd135ff697fa
Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1269
diff
changeset
|
69 if (v1 && v2) |
dd135ff697fa
Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1269
diff
changeset
|
70 return v1->offset < v2->offset; |
1574
72f00d740665
Fix bug #356. Our sorting function was wrong if a value was between two NULL pointers.
Benjamin Kramer <benny.kra@gmail.com>
parents:
1571
diff
changeset
|
71 // sort NULL pointers towards the end |
72f00d740665
Fix bug #356. Our sorting function was wrong if a value was between two NULL pointers.
Benjamin Kramer <benny.kra@gmail.com>
parents:
1571
diff
changeset
|
72 return v1 && !v2; |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
73 } |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
74 |
1270
dd135ff697fa
Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1269
diff
changeset
|
75 // this is pretty much the exact same thing we need to do for fields in each |
dd135ff697fa
Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1269
diff
changeset
|
76 // base class of a class |
dd135ff697fa
Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1269
diff
changeset
|
77 |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
78 const llvm::Type* IrTypeStruct::buildType() |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
79 { |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
80 IF_LOG Logger::println("Building struct type %s @ %s", |
1278
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1270
diff
changeset
|
81 sd->toPrettyChars(), sd->loc.toChars()); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
82 LOG_SCOPE; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
83 |
1234
9201e0d41ee5
Fixed forward referenced structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1231
diff
changeset
|
84 // if it's a forward declaration, all bets are off, stick with the opaque |
9201e0d41ee5
Fixed forward referenced structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1231
diff
changeset
|
85 if (sd->sizeok != 1) |
9201e0d41ee5
Fixed forward referenced structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1231
diff
changeset
|
86 return pa.get(); |
9201e0d41ee5
Fixed forward referenced structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1231
diff
changeset
|
87 |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
88 // mirror the sd->fields array but only fill in contributors |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
89 size_t n = sd->fields.dim; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
90 LLSmallVector<VarDeclaration*, 16> data(n, NULL); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
91 default_fields.reserve(n); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
92 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
93 // first fill in the fields with explicit initializers |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
94 VarDeclarationIter field_it(sd->fields); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
95 for (; field_it.more(); field_it.next()) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
96 { |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
97 // init is !null for explicit inits |
1632
8c37dcd7cfde
Allow unions with void-initialized members.
Matti Niemenmaa <matti.niemenmaa+hg@iki.fi>
parents:
1574
diff
changeset
|
98 if (field_it->init != NULL && !field_it->init->isVoidInitializer()) |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
99 { |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
100 IF_LOG Logger::println("adding explicit initializer for struct field %s", |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
101 field_it->toChars()); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
102 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
103 data[field_it.index] = *field_it; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
104 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
105 size_t f_begin = field_it->offset; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
106 size_t f_end = f_begin + field_it->type->size(); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
107 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
108 // make sure there is no overlap |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
109 for (size_t i = 0; i < field_it.index; i++) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
110 { |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
111 if (data[i] != NULL) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
112 { |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
113 VarDeclaration* vd = data[i]; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
114 size_t v_begin = vd->offset; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
115 size_t v_end = v_begin + vd->type->size(); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
116 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
117 if (v_begin >= f_end || v_end <= f_begin) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
118 continue; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
119 |
1269
b8a51aa44d4c
Added testcase for overlapping struct default initializer I has missed. Slight tweak of the relevant error message.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1262
diff
changeset
|
120 sd->error(vd->loc, "has overlapping initialization for %s and %s", |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
121 field_it->toChars(), vd->toChars()); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
122 } |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
123 } |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
124 } |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
125 } |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
126 |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
127 if (global.errors) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
128 { |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
129 fatal(); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
130 } |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
131 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
132 // fill in default initializers |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
133 field_it = VarDeclarationIter(sd->fields); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
134 for (;field_it.more(); field_it.next()) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
135 { |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
136 if (data[field_it.index]) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
137 continue; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
138 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
139 size_t f_begin = field_it->offset; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
140 size_t f_end = f_begin + field_it->type->size(); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
141 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
142 // make sure it doesn't overlap anything explicit |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
143 bool overlaps = false; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
144 for (size_t i = 0; i < n; i++) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
145 { |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
146 if (data[i]) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
147 { |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
148 size_t v_begin = data[i]->offset; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
149 size_t v_end = v_begin + data[i]->type->size(); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
150 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
151 if (v_begin >= f_end || v_end <= f_begin) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
152 continue; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
153 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
154 overlaps = true; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
155 break; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
156 } |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
157 } |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
158 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
159 // if no overlap was found, add the default initializer |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
160 if (!overlaps) |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
161 { |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
162 IF_LOG Logger::println("adding default initializer for struct field %s", |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
163 field_it->toChars()); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
164 data[field_it.index] = *field_it; |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
165 } |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
166 } |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
167 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
168 // ok. now we can build a list of llvm types. and make sure zeros are inserted if necessary. |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
169 std::vector<const llvm::Type*> defaultTypes; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
170 defaultTypes.reserve(16); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
171 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
172 size_t offset = 0; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
173 size_t field_index = 0; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
174 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
175 bool packed = (sd->type->alignsize() == 1); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
176 |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
177 // first we sort the list by offset |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
178 std::sort(data.begin(), data.end(), var_offset_sort_cb); |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
179 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
180 // add types to list |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
181 for (size_t i = 0; i < n; i++) |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
182 { |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
183 VarDeclaration* vd = data[i]; |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
184 |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
185 if (vd == NULL) |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
186 continue; |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
187 |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
188 assert(vd->offset >= offset); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
189 |
1262
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
190 // add to default field list |
ec1d9dc1d32a
Fixed struct default initializers.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1245
diff
changeset
|
191 default_fields.push_back(vd); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
192 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
193 // get next aligned offset for this type |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
194 size_t alignedoffset = offset; |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
195 if (!packed) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
196 { |
1351
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1309
diff
changeset
|
197 alignedoffset = realignOffset(alignedoffset, vd->type); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
198 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
199 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
200 // insert explicit padding? |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
201 if (alignedoffset < vd->offset) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
202 { |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
203 field_index += add_zeros(defaultTypes, vd->offset - alignedoffset); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
204 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
205 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
206 // add default type |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
207 defaultTypes.push_back(DtoType(vd->type)); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
208 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
209 // advance offset to right past this field |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
210 offset = vd->offset + vd->type->size(); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
211 |
1309
0c03ba6f7c24
Fixed deal breaker bug for more-at-once compilation when any module contained aggregates. Fixes ticket #272 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1278
diff
changeset
|
212 // set the field index |
0c03ba6f7c24
Fixed deal breaker bug for more-at-once compilation when any module contained aggregates. Fixes ticket #272 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1278
diff
changeset
|
213 vd->aggrIndex = (unsigned)field_index++; |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
214 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
215 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
216 // tail padding? |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
217 if (offset < sd->structsize) |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
218 { |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
219 add_zeros(defaultTypes, sd->structsize - offset); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
220 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
221 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
222 // build the llvm type |
1569
755abafbf25d
Push the context through StructType::get.
Benjamin Kramer <benny.kra@gmail.com>
parents:
1502
diff
changeset
|
223 const llvm::Type* st = llvm::StructType::get(gIR->context(), defaultTypes, packed); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
224 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
225 // refine type |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
226 llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(st); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
227 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
228 // name types |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
229 Type::sir->getState()->module->addTypeName(sd->toPrettyChars(), pa.get()); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
230 |
1231
212ec2d9d176
Fixed some minitest regressions.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1228
diff
changeset
|
231 IF_LOG Logger::cout() << "final struct type: " << *pa.get() << std::endl; |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
232 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
233 return pa.get(); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
234 } |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
235 |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff
changeset
|
236 ////////////////////////////////////////////////////////////////////////////// |