annotate ir/irclass.cpp @ 1562:95d710d405e3

Fixed compiling with llvm rev > 77732
author Tomas Lindquist Olsen <tomas.l.olsen gmail com>
date Sat, 01 Aug 2009 18:23:52 +0200
parents 8912aabdb26e
children 755abafbf25d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
1 #include "llvm/Constants.h"
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
2 #include "llvm/DerivedTypes.h"
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
3
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
4 #include "aggregate.h"
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
5 #include "declaration.h"
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
1561
8912aabdb26e MDNode left the Context!
Benjamin Kramer <benny.kra@gmail.com>
parents: 1558
diff changeset
8 #include "gen/llvm-version.h"
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
9 #include "gen/irstate.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/tollvm.h"
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
12 #include "gen/llvmhelpers.h"
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
13 #include "gen/utils.h"
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
14 #include "gen/arrays.h"
1317
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
15 #include "gen/metadata.h"
1228
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 #include "ir/irstruct.h"
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
18 #include "ir/irtypeclass.h"
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
19
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
20 //////////////////////////////////////////////////////////////////////////////
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
21
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
22 extern LLConstant* get_default_initializer(VarDeclaration* vd, Initializer* init);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
23 extern size_t add_zeros(std::vector<llvm::Constant*>& constants, size_t diff);
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 extern LLConstant* DtoDefineClassInfo(ClassDeclaration* cd);
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 LLGlobalVariable * IrStruct::getVtblSymbol()
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
30 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
31 if (vtbl)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
32 return vtbl;
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 // create the initZ symbol
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
35 std::string initname("_D");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
36 initname.append(aggrdecl->mangle());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
37 initname.append("6__vtblZ");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
38
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
39 llvm::GlobalValue::LinkageTypes _linkage = DtoExternalLinkage(aggrdecl);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
40
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
41 const LLType* vtblTy = type->irtype->isClass()->getVtbl();
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 vtbl = new llvm::GlobalVariable(
1529
ad7f2f1862d6 Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents: 1463
diff changeset
44 *gIR->module, vtblTy, true, _linkage, NULL, initname);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
45
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
46 return vtbl;
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
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
49 //////////////////////////////////////////////////////////////////////////////
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
50
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
51 LLGlobalVariable * IrStruct::getClassInfoSymbol()
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 if (classInfo)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
54 return classInfo;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
55
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
56 // create the initZ symbol
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
57 std::string initname("_D");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
58 initname.append(aggrdecl->mangle());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
59 if (aggrdecl->isInterfaceDeclaration())
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
60 initname.append("11__InterfaceZ");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
61 else
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
62 initname.append("7__ClassZ");
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 llvm::GlobalValue::LinkageTypes _linkage = DtoExternalLinkage(aggrdecl);
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 ClassDeclaration* cinfo = ClassDeclaration::classinfo;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
67 DtoType(cinfo->type);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
68 IrTypeClass* tc = cinfo->type->irtype->isClass();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
69 assert(tc && "invalid ClassInfo type");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
70
1241
fc579f389f9a !ClassInfo instances were not mutable, this is necessary for .classinfo based locking to work. !ModuleInfo generation was commented out as well.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1236
diff changeset
71 // classinfos cannot be constants since they're used a locks for synchronized
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
72 classInfo = new llvm::GlobalVariable(
1529
ad7f2f1862d6 Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents: 1463
diff changeset
73 *gIR->module, tc->getPA().get(), false, _linkage, NULL, initname);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
74
1558
3adcb70700cb Added back option to disable metadata generation and users. Set USE_METADATA to OFF in ccmake.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1555
diff changeset
75 #if USE_METADATA
1317
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
76 // Generate some metadata on this ClassInfo if it's for a class.
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
77 ClassDeclaration* classdecl = aggrdecl->isClassDeclaration();
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
78 if (classdecl && !aggrdecl->isInterfaceDeclaration()) {
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
79 // Gather information
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
80 const LLType* type = DtoType(aggrdecl->type);
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
81 const LLType* bodyType = llvm::cast<LLPointerType>(type)->getElementType();
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
82 bool hasDestructor = (classdecl->dtor != NULL);
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
83 bool hasCustomDelete = (classdecl->aggDelete != NULL);
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
84 // Construct the fields
1343
c21a6654cce2 Update for metadata changes in LLVM trunk.
Frits van Bommel <fvbommel wxs.nl>
parents: 1317
diff changeset
85 MDNodeField* mdVals[CD_NumFields];
1317
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
86 mdVals[CD_BodyType] = llvm::UndefValue::get(bodyType);
1554
d6e8d5db259f LLVMContext changes up to r77366
Benjamin Kramer <benny.kra@gmail.com>
parents: 1545
diff changeset
87 mdVals[CD_Finalize] = LLConstantInt::get(LLType::Int1Ty, hasDestructor);
d6e8d5db259f LLVMContext changes up to r77366
Benjamin Kramer <benny.kra@gmail.com>
parents: 1545
diff changeset
88 mdVals[CD_CustomDelete] = LLConstantInt::get(LLType::Int1Ty, hasCustomDelete);
1317
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
89 // Construct the metadata
1561
8912aabdb26e MDNode left the Context!
Benjamin Kramer <benny.kra@gmail.com>
parents: 1558
diff changeset
90 #if LLVM_REV < 77733
1555
ed0cffe895ec use the new NamedMDNode class
Benjamin Kramer <benny.kra@gmail.com>
parents: 1554
diff changeset
91 llvm::MetadataBase* metadata = gIR->context().getMDNode(mdVals, CD_NumFields);
1561
8912aabdb26e MDNode left the Context!
Benjamin Kramer <benny.kra@gmail.com>
parents: 1558
diff changeset
92 #else
1562
95d710d405e3 Fixed compiling with llvm rev > 77732
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1561
diff changeset
93 llvm::MetadataBase* metadata = llvm::MDNode::get(gIR->context(), mdVals, CD_NumFields);
1561
8912aabdb26e MDNode left the Context!
Benjamin Kramer <benny.kra@gmail.com>
parents: 1558
diff changeset
94 #endif
1317
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
95 // Insert it into the module
1555
ed0cffe895ec use the new NamedMDNode class
Benjamin Kramer <benny.kra@gmail.com>
parents: 1554
diff changeset
96 std::string metaname = CD_PREFIX + initname;
ed0cffe895ec use the new NamedMDNode class
Benjamin Kramer <benny.kra@gmail.com>
parents: 1554
diff changeset
97 llvm::NamedMDNode::Create(metaname, &metadata, 1, gIR->module);
1317
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
98 }
1558
3adcb70700cb Added back option to disable metadata generation and users. Set USE_METADATA to OFF in ccmake.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1555
diff changeset
99 #endif // USE_METADATA
1317
4099548c80e0 Allocate objects on the stack if they (a) don't have a destructor, and
Frits van Bommel <fvbommel wxs.nl>
parents: 1278
diff changeset
100
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
101 return classInfo;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
102 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
103
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
104 //////////////////////////////////////////////////////////////////////////////
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
105
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
106 LLGlobalVariable * IrStruct::getInterfaceArraySymbol()
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
107 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
108 if (classInterfacesArray)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
109 return classInterfacesArray;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
110
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
111 ClassDeclaration* cd = aggrdecl->isClassDeclaration();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
112
1235
ded6a557220a Too strict assertion with generating the interfaceInfosZ symbol. Baseclasses might introduce interfaces.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1231
diff changeset
113 size_t n = type->irtype->isClass()->getNumInterfaceVtbls();
ded6a557220a Too strict assertion with generating the interfaceInfosZ symbol. Baseclasses might introduce interfaces.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1231
diff changeset
114 assert(n > 0 && "getting ClassInfo.interfaces storage symbol, but we "
ded6a557220a Too strict assertion with generating the interfaceInfosZ symbol. Baseclasses might introduce interfaces.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1231
diff changeset
115 "don't implement any interfaces");
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
116
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
117 VarDeclarationIter idx(ClassDeclaration::classinfo->fields, 3);
1452
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents: 1403
diff changeset
118 const llvm::Type* InterfaceTy = DtoType(idx->type->nextOf());
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
119
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
120 // create Interface[N]
1235
ded6a557220a Too strict assertion with generating the interfaceInfosZ symbol. Baseclasses might introduce interfaces.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1231
diff changeset
121 const llvm::ArrayType* array_type = llvm::ArrayType::get(InterfaceTy,n);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
122
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
123 // put it in a global
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
124 std::string name("_D");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
125 name.append(cd->mangle());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
126 name.append("16__interfaceInfosZ");
1403
e5c5d354c649 Tentative fix for semantic3 on imported modules and unnecessary template
Christian Kamm <kamm incasoftware de>
parents: 1351
diff changeset
127
e5c5d354c649 Tentative fix for semantic3 on imported modules and unnecessary template
Christian Kamm <kamm incasoftware de>
parents: 1351
diff changeset
128 llvm::GlobalValue::LinkageTypes _linkage = DtoExternalLinkage(aggrdecl);
1529
ad7f2f1862d6 Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents: 1463
diff changeset
129 classInterfacesArray = new llvm::GlobalVariable(*gIR->module,
ad7f2f1862d6 Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents: 1463
diff changeset
130 array_type, true, _linkage, NULL, name);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
131
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
132 return classInterfacesArray;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
133 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
134
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
135 //////////////////////////////////////////////////////////////////////////////
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
136
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
137 LLConstant * IrStruct::getVtblInit()
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
138 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
139 if (constVtbl)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
140 return constVtbl;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
141
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
142 IF_LOG Logger::println("Building vtbl initializer");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
143 LOG_SCOPE;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
144
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
145 ClassDeclaration* cd = aggrdecl->isClassDeclaration();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
146 assert(cd && "not class");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
147
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
148 std::vector<llvm::Constant*> constants;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
149 constants.reserve(cd->vtbl.dim);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
150
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
151 // start with the classinfo
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
152 llvm::Constant* c = getClassInfoSymbol();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
153 c = DtoBitCast(c, DtoType(ClassDeclaration::classinfo->type));
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
154 constants.push_back(c);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
155
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
156 // add virtual function pointers
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
157 size_t n = cd->vtbl.dim;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
158 for (size_t i = 1; i < n; i++)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
159 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
160 Dsymbol* dsym = (Dsymbol*)cd->vtbl.data[i];
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
161 assert(dsym && "null vtbl member");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
162
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
163 FuncDeclaration* fd = dsym->isFuncDeclaration();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
164 assert(fd && "vtbl entry not a function");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
165
1261
854e86eaa022 Revert change to treat bodyless functions in abstract classes as abstract.
Christian Kamm <kamm incasoftware de>
parents: 1253
diff changeset
166 if (fd->isAbstract() && !fd->fbody)
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
167 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
168 c = getNullValue(DtoType(fd->type->pointerTo()));
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
169 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
170 else
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 fd->codegen(Type::sir);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
173 assert(fd->ir.irFunc && "invalid vtbl function");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
174 c = fd->ir.irFunc->func;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
175 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
176 constants.push_back(c);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
177 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
178
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
179 // build the constant struct
1554
d6e8d5db259f LLVMContext changes up to r77366
Benjamin Kramer <benny.kra@gmail.com>
parents: 1545
diff changeset
180 constVtbl = LLConstantStruct::get(constants, false);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
181
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
182 #if 0
1453
f35a9a77d256 More tweaks.
Robert Clipsham <robert@octarineparrot.com>
parents: 1452
diff changeset
183 IF_LOG Logger::cout() << "constVtbl type: " << *constVtbl->getType() << std::endl;
f35a9a77d256 More tweaks.
Robert Clipsham <robert@octarineparrot.com>
parents: 1452
diff changeset
184 IF_LOG Logger::cout() << "vtbl type: " << *type->irtype->isClass()->getVtbl() << std::endl;
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
185 #endif
1463
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
186
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
187 #if 1
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
188
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
189 size_t nc = constants.size();
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
190 const LLType* vtblTy = type->irtype->isClass()->getVtbl();
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
191 for (size_t i = 0; i < nc; ++i)
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
192 {
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
193 if (constVtbl->getOperand(i)->getType() != vtblTy->getContainedType(i))
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
194 {
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
195 Logger::cout() << "type mismatch for entry # " << i << " in vtbl initializer" << std::endl;
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
196
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
197 constVtbl->getOperand(i)->dump();
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
198 vtblTy->getContainedType(i)->dump(gIR->module);
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
199 }
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
200 }
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
201
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
202 #endif
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1457
diff changeset
203
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
204 assert(constVtbl->getType() == type->irtype->isClass()->getVtbl() &&
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
205 "vtbl initializer type mismatch");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
206
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
207 return constVtbl;
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
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
210 //////////////////////////////////////////////////////////////////////////////
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
211
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
212 LLConstant * IrStruct::getClassInfoInit()
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
213 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
214 if (constClassInfo)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
215 return constClassInfo;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
216 constClassInfo = DtoDefineClassInfo(aggrdecl->isClassDeclaration());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
217 return constClassInfo;
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
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 void IrStruct::addBaseClassInits(
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
223 std::vector<llvm::Constant*>& constants,
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
224 ClassDeclaration* base,
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
225 size_t& offset,
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
226 size_t& field_index)
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 if (base->baseClass)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
229 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
230 addBaseClassInits(constants, base->baseClass, offset, field_index);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
231 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
232
1270
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
233 IrTypeClass* tc = base->type->irtype->isClass();
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
234 assert(tc);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
235
1270
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
236 // go through fields
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
237 IrTypeAggr::iterator it;
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
238 for (it = tc->def_begin(); it != tc->def_end(); ++it)
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
239 {
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
240 VarDeclaration* vd = *it;
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
241
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
242 IF_LOG Logger::println("Adding default field %s %s (+%u)", vd->type->toChars(), vd->toChars(), vd->offset);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
243 LOG_SCOPE;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
244
1270
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
245 assert(vd->offset >= offset && "default fields not sorted by offset");
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
246
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
247 // get next aligned offset for this type
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: 1343
diff changeset
248 size_t alignedoffset = realignOffset(offset, vd->type);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
249
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
250 // insert explicit padding?
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
251 if (alignedoffset < vd->offset)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
252 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
253 add_zeros(constants, vd->offset - alignedoffset);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
254 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
255
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
256 // add default type
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
257 constants.push_back(get_default_initializer(vd, vd->init));
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
258
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
259 // advance offset to right past this field
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
260 offset = vd->offset + vd->type->size();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
261 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
262
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
263 // has interface vtbls?
1270
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
264 if (base->vtblInterfaces && base->vtblInterfaces->dim > 0)
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
265 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
266 // false when it's not okay to use functions from super classes
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
267 bool newinsts = (base == aggrdecl->isClassDeclaration());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
268
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
269 size_t inter_idx = interfacesWithVtbls.size();
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
270
1270
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
271 offset = (offset + PTRSIZE - 1) & ~(PTRSIZE - 1);
dd135ff697fa Fixed class default initializers and type generation. Bug #260 is fixed.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1263
diff changeset
272
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
273 ArrayIter<BaseClass> it2(*base->vtblInterfaces);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
274 for (; !it2.done(); it2.next())
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
275 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
276 BaseClass* b = it2.get();
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
277 constants.push_back(getInterfaceVtbl(b, newinsts, inter_idx));
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
278 offset += PTRSIZE;
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
279
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
280 // add to the interface list
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
281 interfacesWithVtbls.push_back(b);
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
282 inter_idx++;
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
283 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
284 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
285
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
286 // tail padding?
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
287 if (offset < base->structsize)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
288 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
289 add_zeros(constants, base->structsize - offset);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
290 offset = base->structsize;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
291 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
292 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
293
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
294 //////////////////////////////////////////////////////////////////////////////
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
295
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
296 LLConstant * IrStruct::createClassDefaultInitializer()
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
297 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
298 ClassDeclaration* cd = aggrdecl->isClassDeclaration();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
299 assert(cd && "invalid class aggregate");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
300
1278
8fb39f7f1a7c Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1270
diff changeset
301 IF_LOG Logger::println("Building class default initializer %s @ %s", cd->toPrettyChars(), cd->loc.toChars());
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
302 LOG_SCOPE;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
303 IF_LOG Logger::println("Instance size: %u", cd->structsize);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
304
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
305 // find the fields that contribute to the default initializer.
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
306 // these will define the default type.
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
307
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
308 std::vector<llvm::Constant*> constants;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
309 constants.reserve(32);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
310
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
311 // add vtbl
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
312 constants.push_back(getVtblSymbol());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
313 // add monitor
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
314 constants.push_back(getNullValue(DtoType(Type::tvoid->pointerTo())));
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
315
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
316 // we start right after the vtbl and monitor
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
317 size_t offset = PTRSIZE * 2;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
318 size_t field_index = 2;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
319
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
320 // add data members recursively
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
321 addBaseClassInits(constants, cd, offset, field_index);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
322
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
323 // build the constant
1554
d6e8d5db259f LLVMContext changes up to r77366
Benjamin Kramer <benny.kra@gmail.com>
parents: 1545
diff changeset
324 llvm::Constant* definit = LLConstantStruct::get(constants, false);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
325
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
326 return definit;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
327 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
328
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
329 //////////////////////////////////////////////////////////////////////////////
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
330
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
331 llvm::GlobalVariable * IrStruct::getInterfaceVtbl(BaseClass * b, bool new_instance, size_t interfaces_index)
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
332 {
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
333 ClassGlobalMap::iterator it = interfaceVtblMap.find(b->base);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
334 if (it != interfaceVtblMap.end())
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
335 return it->second;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
336
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
337 IF_LOG Logger::println("Building vtbl for implementation of interface %s in class %s",
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
338 b->base->toPrettyChars(), aggrdecl->toPrettyChars());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
339 LOG_SCOPE;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
340
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
341 ClassDeclaration* cd = aggrdecl->isClassDeclaration();
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
342 assert(cd && "not a class aggregate");
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
343
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
344 Array vtbl_array;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
345 b->fillVtbl(cd, &vtbl_array, new_instance);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
346
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
347 std::vector<llvm::Constant*> constants;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
348 constants.reserve(vtbl_array.dim);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
349
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
350 // start with the interface info
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
351 VarDeclarationIter interfaces_idx(ClassDeclaration::classinfo->fields, 3);
1452
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents: 1403
diff changeset
352 Type* first = interfaces_idx->type->nextOf()->pointerTo();
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
353
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
354 // index into the interfaces array
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
355 llvm::Constant* idxs[2] = {
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
356 DtoConstSize_t(0),
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
357 DtoConstSize_t(interfaces_index)
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
358 };
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
359
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
360 llvm::Constant* c = llvm::ConstantExpr::getGetElementPtr(
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
361 getInterfaceArraySymbol(), idxs, 2);
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
362
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
363 constants.push_back(c);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
364
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
365 // add virtual function pointers
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
366 size_t n = vtbl_array.dim;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
367 for (size_t i = 1; i < n; i++)
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
368 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
369 Dsymbol* dsym = (Dsymbol*)vtbl_array.data[i];
1231
212ec2d9d176 Fixed some minitest regressions.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1230
diff changeset
370 if (dsym == NULL)
212ec2d9d176 Fixed some minitest regressions.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1230
diff changeset
371 {
212ec2d9d176 Fixed some minitest regressions.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1230
diff changeset
372 // FIXME
212ec2d9d176 Fixed some minitest regressions.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1230
diff changeset
373 // why is this null?
212ec2d9d176 Fixed some minitest regressions.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1230
diff changeset
374 // happens for mini/s.d
212ec2d9d176 Fixed some minitest regressions.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1230
diff changeset
375 constants.push_back(getNullValue(getVoidPtrType()));
212ec2d9d176 Fixed some minitest regressions.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1230
diff changeset
376 continue;
212ec2d9d176 Fixed some minitest regressions.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1230
diff changeset
377 }
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
378
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
379 FuncDeclaration* fd = dsym->isFuncDeclaration();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
380 assert(fd && "vtbl entry not a function");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
381
1261
854e86eaa022 Revert change to treat bodyless functions in abstract classes as abstract.
Christian Kamm <kamm incasoftware de>
parents: 1253
diff changeset
382 assert((!fd->isAbstract() || fd->fbody) &&
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
383 "null symbol in interface implementation vtable");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
384
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
385 fd->codegen(Type::sir);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
386 assert(fd->ir.irFunc && "invalid vtbl function");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
387
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
388 constants.push_back(fd->ir.irFunc->func);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
389 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
390
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
391 // build the vtbl constant
1554
d6e8d5db259f LLVMContext changes up to r77366
Benjamin Kramer <benny.kra@gmail.com>
parents: 1545
diff changeset
392 llvm::Constant* vtbl_constant = LLConstantStruct::get(constants, false);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
393
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
394 // create the global variable to hold it
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
395 llvm::GlobalValue::LinkageTypes _linkage = DtoExternalLinkage(aggrdecl);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
396
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
397 std::string mangle("_D");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
398 mangle.append(cd->mangle());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
399 mangle.append("11__interface");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
400 mangle.append(b->base->mangle());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
401 mangle.append("6__vtblZ");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
402
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
403 llvm::GlobalVariable* GV = new llvm::GlobalVariable(
1529
ad7f2f1862d6 Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents: 1463
diff changeset
404 *gIR->module,
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
405 vtbl_constant->getType(),
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
406 true,
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
407 _linkage,
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
408 vtbl_constant,
1529
ad7f2f1862d6 Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents: 1463
diff changeset
409 mangle
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
410 );
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
411
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
412 // insert into the vtbl map
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
413 interfaceVtblMap.insert(std::make_pair(b->base, GV));
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
414
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
415 return GV;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
416 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
417
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
418 //////////////////////////////////////////////////////////////////////////////
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
419
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
420 LLConstant * IrStruct::getClassInfoInterfaces()
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
421 {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
422 IF_LOG Logger::println("Building ClassInfo.interfaces");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
423 LOG_SCOPE;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
424
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
425 ClassDeclaration* cd = aggrdecl->isClassDeclaration();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
426 assert(cd);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
427
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
428 size_t n = interfacesWithVtbls.size();
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
429 assert(type->irtype->isClass()->getNumInterfaceVtbls() == n &&
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
430 "inconsistent number of interface vtables in this class");
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
431
1236
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
432 VarDeclarationIter interfaces_idx(ClassDeclaration::classinfo->fields, 3);
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
433
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
434 if (n == 0)
1236
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
435 return getNullValue(DtoType(interfaces_idx->type));
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
436
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
437 // Build array of:
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
438 //
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
439 // struct Interface
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
440 // {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
441 // ClassInfo classinfo;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
442 // void*[] vtbl;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
443 // ptrdiff_t offset;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
444 // }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
445
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
446 LLSmallVector<LLConstant*, 6> constants;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
447 constants.reserve(cd->vtblInterfaces->dim);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
448
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
449 const LLType* classinfo_type = DtoType(ClassDeclaration::classinfo->type);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
450 const LLType* voidptrptr_type = DtoType(
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
451 Type::tvoid->pointerTo()->pointerTo());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
452
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
453 const LLType* our_type = type->irtype->isClass()->getPA().get();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
454
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
455 for (size_t i = 0; i < n; ++i)
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
456 {
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
457 BaseClass* it = interfacesWithVtbls[i];
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
458
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
459 IF_LOG Logger::println("Adding interface %s", it->base->toPrettyChars());
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
460
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
461 IrStruct* irinter = it->base->ir.irStruct;
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
462 assert(irinter && "interface has null IrStruct");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
463 IrTypeClass* itc = irinter->type->irtype->isClass();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
464 assert(itc && "null interface IrTypeClass");
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
465
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
466 // classinfo
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
467 LLConstant* ci = irinter->getClassInfoSymbol();
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
468 ci = DtoBitCast(ci, classinfo_type);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
469
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
470 // vtbl
1253
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
471 LLConstant* vtb;
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
472 // interface get a null
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
473 if (cd->isInterfaceDeclaration())
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
474 {
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
475 vtb = DtoConstSlice(DtoConstSize_t(0), getNullValue(voidptrptr_type));
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
476 }
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
477 else
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
478 {
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
479 ClassGlobalMap::iterator itv = interfaceVtblMap.find(it->base);
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
480 assert(itv != interfaceVtblMap.end() && "interface vtbl not found");
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
481 vtb = itv->second;
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
482 vtb = DtoBitCast(vtb, voidptrptr_type);
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
483 vtb = DtoConstSlice(DtoConstSize_t(itc->getVtblSize()), vtb);
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
484 }
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
485
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
486 // offset
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
487 LLConstant* off = DtoConstSize_t(it->offset);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
488
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
489 // create Interface struct
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
490 LLConstant* inits[3] = { ci, vtb, off };
1554
d6e8d5db259f LLVMContext changes up to r77366
Benjamin Kramer <benny.kra@gmail.com>
parents: 1545
diff changeset
491 LLConstant* entry = LLConstantStruct::get(inits, 3);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
492 constants.push_back(entry);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
493 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
494
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
495 // create Interface[N]
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
496 const llvm::ArrayType* array_type = llvm::ArrayType::get(
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
497 constants[0]->getType(),
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
498 n);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
499
1554
d6e8d5db259f LLVMContext changes up to r77366
Benjamin Kramer <benny.kra@gmail.com>
parents: 1545
diff changeset
500 LLConstant* arr = LLConstantArray::get(
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
501 array_type,
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
502 &constants[0],
1236
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
503 n);
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
504
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
505 // apply the initializer
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
506 classInterfacesArray->setInitializer(arr);
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
507
1236
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
508 // return null, only baseclass provide interfaces
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
509 if (cd->vtblInterfaces->dim == 0)
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
510 {
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
511 return getNullValue(DtoType(interfaces_idx->type));
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
512 }
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
513
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
514 // only the interface explicitly implemented by this class
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
515 // (not super classes) should show in ClassInfo
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
516 LLConstant* idxs[2] = {
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
517 DtoConstSize_t(0),
1230
e67c85d6e680 Completed interface implementation. Hopefully that's it for now..
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1229
diff changeset
518 DtoConstSize_t(n - cd->vtblInterfaces->dim)
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
519 };
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
520
1236
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
521 LLConstant* ptr = llvm::ConstantExpr::getGetElementPtr(
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
522 classInterfacesArray, idxs, 2);
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
523
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
524 // return as a slice
1236
57db55766118 Fixed ClassInfo.interfaces. mini/s.d now runs again.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1235
diff changeset
525 return DtoConstSlice( DtoConstSize_t(cd->vtblInterfaces->dim), ptr );
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
526 }
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
527
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
diff changeset
528 //////////////////////////////////////////////////////////////////////////////
1253
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
529
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
530 void IrStruct::initializeInterface()
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
531 {
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
532 InterfaceDeclaration* base = aggrdecl->isInterfaceDeclaration();
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
533 assert(base && "not interface");
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
534
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
535 // has interface vtbls?
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
536 if (!base->vtblInterfaces)
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
537 return;
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
538
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
539 ArrayIter<BaseClass> it(*base->vtblInterfaces);
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
540 for (; !it.done(); it.next())
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
541 {
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
542 // add to the interface list
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
543 interfacesWithVtbls.push_back(it.get());
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
544 }
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
545 }
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
546
752bed475b75 Fixed classinfo.interfaces for .. interfaces!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1249
diff changeset
547 //////////////////////////////////////////////////////////////////////////////