annotate gen/functions.cpp @ 127:facc562f5674 trunk

[svn r131] Fixed #11 All associative array properties now work as they should. Fixed problems with some cases of array.length and array.ptr. Fixed some problems with array properties. Fixed 'in' contracts.
author lindquist
date Fri, 30 Nov 2007 12:56:52 +0100
parents 7f9a0a58394b
children 8096ba7082db
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
1 #include "gen/llvm.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
2
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
3 #include "mtype.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
4 #include "aggregate.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
5 #include "init.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
6 #include "declaration.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
7 #include "template.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
8 #include "module.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
9 #include "statement.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
10
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
11 #include "gen/irstate.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
12 #include "gen/tollvm.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
13 #include "gen/runtime.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
14 #include "gen/arrays.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
15 #include "gen/logger.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
16 #include "gen/functions.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
17 #include "gen/todebug.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
18 #include "gen/classes.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
19
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
20 const llvm::FunctionType* DtoFunctionType(Type* type, const llvm::Type* thistype, bool ismain)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
21 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
22 TypeFunction* f = (TypeFunction*)type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
23 assert(f != 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
24
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
25 if (type->llvmType != NULL) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
26 return llvm::cast<llvm::FunctionType>(type->llvmType->get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
27 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
28
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
29 bool typesafeVararg = false;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
30 if (f->linkage == LINKd && f->varargs == 1) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
31 typesafeVararg = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
32 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
33
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
34 // return value type
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
35 const llvm::Type* rettype;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
36 const llvm::Type* actualRettype;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
37 Type* rt = f->next;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
38 bool retinptr = false;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
39 bool usesthis = false;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
40
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
41 if (ismain) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
42 rettype = llvm::Type::Int32Ty;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
43 actualRettype = rettype;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
44 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
45 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
46 assert(rt);
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 108
diff changeset
47 Type* rtfin = DtoDType(rt);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
48 if (DtoIsPassedByRef(rt)) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
49 rettype = llvm::PointerType::get(DtoType(rt));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
50 actualRettype = llvm::Type::VoidTy;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
51 f->llvmRetInPtr = retinptr = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
52 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
53 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
54 rettype = DtoType(rt);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
55 actualRettype = rettype;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
56 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
57 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
58
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
59 // parameter types
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
60 std::vector<const llvm::Type*> paramvec;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
61
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
62 if (retinptr) {
123
7f9a0a58394b [svn r127] Updated the lphobos build scripts a little. Created a new rebuild profile.
lindquist
parents: 121
diff changeset
63 //Logger::cout() << "returning through pointer parameter: " << *rettype << '\n';
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
64 paramvec.push_back(rettype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
65 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
66
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
67 if (thistype) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
68 paramvec.push_back(thistype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
69 usesthis = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
70 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
71
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
72 if (typesafeVararg) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
73 ClassDeclaration* ti = Type::typeinfo;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
74 ti->toObjFile();
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
75 DtoForceConstInitDsymbol(ti);
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
76 assert(ti->llvmConstInit);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
77 std::vector<const llvm::Type*> types;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
78 types.push_back(DtoSize_t());
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
79 types.push_back(llvm::PointerType::get(llvm::PointerType::get(ti->llvmConstInit->getType())));
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
80 const llvm::Type* t1 = llvm::StructType::get(types);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
81 paramvec.push_back(llvm::PointerType::get(t1));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
82 paramvec.push_back(llvm::PointerType::get(llvm::Type::Int8Ty));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
83 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
84
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
85 size_t n = Argument::dim(f->parameters);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
86
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
87 for (int i=0; i < n; ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
88 Argument* arg = Argument::getNth(f->parameters, i);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
89 // ensure scalar
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
90 Type* argT = DtoDType(arg->type);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
91 assert(argT);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
92
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
93 if ((arg->storageClass & STCref) || (arg->storageClass & STCout)) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
94 //assert(arg->vardecl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
95 //arg->vardecl->refparam = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
96 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
97 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
98 arg->llvmCopy = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
99
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
100 const llvm::Type* at = DtoType(argT);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
101 if (isaStruct(at)) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
102 Logger::println("struct param");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
103 paramvec.push_back(llvm::PointerType::get(at));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
104 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
105 else if (isaArray(at)) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
106 Logger::println("sarray param");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
107 assert(argT->ty == Tsarray);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
108 //paramvec.push_back(llvm::PointerType::get(at->getContainedType(0)));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
109 paramvec.push_back(llvm::PointerType::get(at));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
110 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
111 else if (llvm::isa<llvm::OpaqueType>(at)) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
112 Logger::println("opaque param");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
113 assert(argT->ty == Tstruct || argT->ty == Tclass);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
114 paramvec.push_back(llvm::PointerType::get(at));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
115 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
116 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
117 if (!arg->llvmCopy) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
118 Logger::println("ref param");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
119 at = llvm::PointerType::get(at);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
120 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
121 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
122 Logger::println("in param");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
123 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
124 paramvec.push_back(at);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
125 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
126 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
127
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
128 // construct function type
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
129 bool isvararg = !typesafeVararg && f->varargs;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
130 llvm::FunctionType* functype = llvm::FunctionType::get(actualRettype, paramvec, isvararg);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
131
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
132 f->llvmRetInPtr = retinptr;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
133 f->llvmUsesThis = usesthis;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
134
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
135 //if (!f->llvmType)
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
136 f->llvmType = new llvm::PATypeHolder(functype);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
137 //else
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
138 //assert(functype == f->llvmType->get());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
139
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
140 return functype;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
141 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
142
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
143 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
144
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
145 static const llvm::FunctionType* DtoVaFunctionType(FuncDeclaration* fdecl)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
146 {
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
147 // type has already been resolved
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
148 if (fdecl->type->llvmType != 0) {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
149 return llvm::cast<llvm::FunctionType>(fdecl->type->llvmType->get());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
150 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
151
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
152 TypeFunction* f = (TypeFunction*)fdecl->type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
153 assert(f != 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
154
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
155 const llvm::PointerType* i8pty = llvm::PointerType::get(llvm::Type::Int8Ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
156 std::vector<const llvm::Type*> args;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
157
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
158 if (fdecl->llvmInternal == LLVMva_start) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
159 args.push_back(i8pty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
160 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
161 else if (fdecl->llvmInternal == LLVMva_intrinsic) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
162 size_t n = Argument::dim(f->parameters);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
163 for (size_t i=0; i<n; ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
164 args.push_back(i8pty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
165 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
166 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
167 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
168 assert(0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
169
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
170 const llvm::FunctionType* fty = llvm::FunctionType::get(llvm::Type::VoidTy, args, false);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
171
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
172 f->llvmType = new llvm::PATypeHolder(fty);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
173
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
174 return fty;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
175 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
176
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
177 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
178
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
179 const llvm::FunctionType* DtoFunctionType(FuncDeclaration* fdecl)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
180 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
181 if ((fdecl->llvmInternal == LLVMva_start) || (fdecl->llvmInternal == LLVMva_intrinsic)) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
182 return DtoVaFunctionType(fdecl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
183 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
184
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
185 // unittest has null type, just build it manually
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
186 /*if (fdecl->isUnitTestDeclaration()) {
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
187 std::vector<const llvm::Type*> args;
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
188 return llvm::FunctionType::get(llvm::Type::VoidTy, args, false);
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
189 }*/
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
190
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
191 // type has already been resolved
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
192 if (fdecl->type->llvmType != 0) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
193 return llvm::cast<llvm::FunctionType>(fdecl->type->llvmType->get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
194 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
195
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
196 const llvm::Type* thisty = NULL;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
197 if (fdecl->needThis()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
198 if (AggregateDeclaration* ad = fdecl->isMember()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
199 Logger::print("isMember = this is: %s\n", ad->type->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
200 thisty = DtoType(ad->type);
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 109
diff changeset
201 //Logger::cout() << "this llvm type: " << *thisty << '\n';
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
202 if (isaStruct(thisty) || (!gIR->structs.empty() && thisty == gIR->topstruct()->recty.get()))
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
203 thisty = llvm::PointerType::get(thisty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
204 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
205 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
206 assert(0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
207 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
208 else if (fdecl->isNested()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
209 thisty = llvm::PointerType::get(llvm::Type::Int8Ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
210 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
211
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
212 const llvm::FunctionType* functype = DtoFunctionType(fdecl->type, thisty, fdecl->isMain());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
213
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
214 return functype;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
215 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
216
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
217 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
218
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
219 static llvm::Function* DtoDeclareVaFunction(FuncDeclaration* fdecl)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
220 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
221 TypeFunction* f = (TypeFunction*)DtoDType(fdecl->type);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
222 const llvm::FunctionType* fty = DtoVaFunctionType(fdecl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
223 llvm::Constant* fn = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
224
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
225 if (fdecl->llvmInternal == LLVMva_start) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
226 fn = gIR->module->getOrInsertFunction("llvm.va_start", fty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
227 assert(fn);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
228 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
229 else if (fdecl->llvmInternal == LLVMva_intrinsic) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
230 fn = gIR->module->getOrInsertFunction(fdecl->llvmInternal1, fty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
231 assert(fn);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
232 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
233 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
234 assert(0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
235
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
236 llvm::Function* func = llvm::dyn_cast<llvm::Function>(fn);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
237 assert(func);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
238 assert(func->isIntrinsic());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
239 fdecl->llvmValue = func;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
240 return func;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
241 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
242
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
243 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
244
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
245 void DtoResolveFunction(FuncDeclaration* fdecl)
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
246 {
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
247 if (!global.params.useUnitTests && fdecl->isUnitTestDeclaration()) {
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
248 return; // ignore declaration completely
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
249 }
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
250
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
251 if (fdecl->llvmResolved) return;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
252 fdecl->llvmResolved = true;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
253
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
254 Logger::println("DtoResolveFunction(%s)", fdecl->toPrettyChars());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
255 LOG_SCOPE;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
256
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
257 if (fdecl->llvmRunTimeHack) {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
258 gIR->declareList.push_back(fdecl);
127
facc562f5674 [svn r131] Fixed #11
lindquist
parents: 123
diff changeset
259 TypeFunction* tf = (TypeFunction*)fdecl->type;
facc562f5674 [svn r131] Fixed #11
lindquist
parents: 123
diff changeset
260 tf->llvmRetInPtr = DtoIsPassedByRef(tf->next);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
261 return;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
262 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
263
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
264 if (fdecl->parent)
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
265 if (TemplateInstance* tinst = fdecl->parent->isTemplateInstance())
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
266 {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
267 TemplateDeclaration* tempdecl = tinst->tempdecl;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
268 if (tempdecl->llvmInternal == LLVMva_arg)
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
269 {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
270 Logger::println("magic va_arg found");
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
271 fdecl->llvmInternal = LLVMva_arg;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
272 fdecl->llvmDeclared = true;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
273 fdecl->llvmInitialized = true;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
274 fdecl->llvmDefined = true;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
275 return; // this gets mapped to an instruction so a declaration makes no sence
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
276 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
277 else if (tempdecl->llvmInternal == LLVMva_start)
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
278 {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
279 Logger::println("magic va_start found");
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
280 fdecl->llvmInternal = LLVMva_start;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
281 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
282 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
283
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
284 DtoFunctionType(fdecl);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
285
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
286 // queue declaration
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 109
diff changeset
287 if (!fdecl->isAbstract())
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 109
diff changeset
288 gIR->declareList.push_back(fdecl);
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
289 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
290
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
291 //////////////////////////////////////////////////////////////////////////////////////////
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
292
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
293 void DtoDeclareFunction(FuncDeclaration* fdecl)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
294 {
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
295 if (fdecl->llvmDeclared) return;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
296 fdecl->llvmDeclared = true;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
297
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
298 Logger::println("DtoDeclareFunction(%s)", fdecl->toPrettyChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
299 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
300
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 109
diff changeset
301 assert(!fdecl->isAbstract());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 109
diff changeset
302
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
303 // intrinsic sanity check
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
304 if (fdecl->llvmInternal == LLVMintrinsic && fdecl->fbody) {
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
305 error(fdecl->loc, "intrinsics cannot have function bodies");
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
306 fatal();
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
307 }
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
308
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
309 if (fdecl->llvmRunTimeHack) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
310 Logger::println("runtime hack func chars: %s", fdecl->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
311 if (!fdecl->llvmValue)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
312 fdecl->llvmValue = LLVM_D_GetRuntimeFunction(gIR->module, fdecl->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
313 return;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
314 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
315
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
316 bool declareOnly = false;
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
317 bool templInst = fdecl->parent && DtoIsTemplateInstance(fdecl->parent);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
318 if (!templInst && fdecl->getModule() != gIR->dmodule)
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
319 declareOnly = true;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
320 else if (fdecl->llvmInternal == LLVMva_start)
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
321 declareOnly = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
322
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
323 if (!fdecl->llvmIRFunc) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
324 fdecl->llvmIRFunc = new IRFunction(fdecl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
325 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
326
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
327 // mangled name
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
328 char* mangled_name;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
329 if (fdecl->llvmInternal == LLVMintrinsic)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
330 mangled_name = fdecl->llvmInternal1;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
331 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
332 mangled_name = fdecl->mangle();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
333
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
334 llvm::Function* vafunc = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
335 if ((fdecl->llvmInternal == LLVMva_start) || (fdecl->llvmInternal == LLVMva_intrinsic)) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
336 vafunc = DtoDeclareVaFunction(fdecl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
337 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
338
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
339 Type* t = DtoDType(fdecl->type);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
340 TypeFunction* f = (TypeFunction*)t;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
341
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
342 // construct function
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
343 const llvm::FunctionType* functype = DtoFunctionType(fdecl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
344 llvm::Function* func = vafunc ? vafunc : gIR->module->getFunction(mangled_name);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
345 if (!func)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
346 func = new llvm::Function(functype, DtoLinkage(fdecl->protection, fdecl->storage_class), mangled_name, gIR->module);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
347 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
348 assert(func->getFunctionType() == functype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
349
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
350 // add func to IRFunc
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
351 fdecl->llvmIRFunc->func = func;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
352
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
353 // calling convention
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
354 if (!vafunc && fdecl->llvmInternal != LLVMintrinsic)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
355 func->setCallingConv(DtoCallingConv(f->linkage));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
356
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
357 // template instances should have weak linkage
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
358 if (!vafunc && fdecl->llvmInternal != LLVMintrinsic && fdecl->parent && DtoIsTemplateInstance(fdecl->parent))
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
359 func->setLinkage(llvm::GlobalValue::WeakLinkage);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
360
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
361 fdecl->llvmValue = func;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
362 assert(llvm::isa<llvm::FunctionType>(f->llvmType->get()));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
363
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
364 // main
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
365 if (fdecl->isMain()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
366 gIR->mainFunc = func;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
367 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
368
116
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
369 // static ctor
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
370 if (fdecl->isStaticCtorDeclaration()) {
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
371 gIR->ctors.push_back(fdecl);
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
372 }
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
373 // static dtor
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
374 else if (fdecl->isStaticDtorDeclaration()) {
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
375 gIR->dtors.push_back(fdecl);
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
376 }
fd7ad91fd713 [svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents: 113
diff changeset
377
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
378 // name parameters
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
379 llvm::Function::arg_iterator iarg = func->arg_begin();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
380 int k = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
381 if (f->llvmRetInPtr) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
382 iarg->setName("retval");
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
383 fdecl->llvmRetArg = iarg;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
384 ++iarg;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
385 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
386 if (f->llvmUsesThis) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
387 iarg->setName("this");
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
388 fdecl->llvmThisVar = iarg;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
389 assert(fdecl->llvmThisVar);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
390 ++iarg;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
391 }
119
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
392
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
393 if (f->linkage == LINKd && f->varargs == 1) {
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
394 iarg->setName("_arguments");
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
395 fdecl->llvmArguments = iarg;
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
396 ++iarg;
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
397 iarg->setName("_argptr");
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
398 fdecl->llvmArgPtr = iarg;
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
399 ++iarg;
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
400 }
79c9ac745fbc [svn r123] Fixed some typeinfo module name mismatches.
lindquist
parents: 117
diff changeset
401
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
402 for (; iarg != func->arg_end(); ++iarg)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
403 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
404 Argument* arg = Argument::getNth(f->parameters, k++);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
405 //arg->llvmValue = iarg;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
406 //Logger::println("identifier: '%s' %p\n", arg->ident->toChars(), arg->ident);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
407 if (arg && arg->ident != 0) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
408 if (arg->vardecl) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
409 arg->vardecl->llvmValue = iarg;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
410 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
411 iarg->setName(arg->ident->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
412 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
413 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
414 iarg->setName("unnamed");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
415 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
416 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
417
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
418 if (fdecl->isUnitTestDeclaration())
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
419 gIR->unitTests.push_back(fdecl);
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
420
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
421 if (!declareOnly)
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
422 gIR->defineList.push_back(fdecl);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
423
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
424 Logger::cout() << "func decl: " << *func << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
425 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
426
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
427 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
428
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
429 void DtoDefineFunc(FuncDeclaration* fd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
430 {
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
431 if (fd->llvmDefined) return;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
432 fd->llvmDefined = true;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
433
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
434 assert(fd->llvmDeclared);
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
435
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
436 Logger::println("DtoDefineFunc(%s)", fd->toPrettyChars());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
437 LOG_SCOPE;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
438
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
439 // debug info
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
440 if (global.params.symdebug) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
441 Module* mo = fd->getModule();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
442 if (!mo->llvmCompileUnit) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
443 mo->llvmCompileUnit = DtoDwarfCompileUnit(mo,false);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
444 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
445 fd->llvmDwarfSubProgram = DtoDwarfSubProgram(fd, mo->llvmCompileUnit);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
446 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
447
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
448 Type* t = DtoDType(fd->type);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
449 TypeFunction* f = (TypeFunction*)t;
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
450 assert(f->llvmType);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
451
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
452 llvm::Function* func = fd->llvmIRFunc->func;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
453 const llvm::FunctionType* functype = func->getFunctionType();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
454
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
455 // only members of the current module or template instances maybe be defined
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
456 if (fd->getModule() == gIR->dmodule || DtoIsTemplateInstance(fd->parent))
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
457 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
458 fd->llvmDModule = gIR->dmodule;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
459
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
460 // function definition
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
461 if (fd->fbody != 0)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
462 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
463 Logger::println("Doing function body for: %s", fd->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
464 assert(fd->llvmIRFunc);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
465 gIR->functions.push_back(fd->llvmIRFunc);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
466
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
467 if (fd->isMain())
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
468 gIR->emitMain = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
469
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
470 llvm::BasicBlock* beginbb = new llvm::BasicBlock("entry",func);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
471 llvm::BasicBlock* endbb = new llvm::BasicBlock("endentry",func);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
472
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
473 //assert(gIR->scopes.empty());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
474 gIR->scopes.push_back(IRScope(beginbb, endbb));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
475
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
476 // create alloca point
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
477 llvm::Instruction* allocaPoint = new llvm::BitCastInst(llvm::ConstantInt::get(llvm::Type::Int32Ty,0,false),llvm::Type::Int32Ty,"alloca point",gIR->scopebb());
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
478 gIR->func()->allocapoint = allocaPoint;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
479
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
480 // need result variable? (not nested)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
481 if (fd->vresult && !fd->vresult->nestedref) {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
482 Logger::println("non-nested vresult value");
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
483 fd->vresult->llvmValue = new llvm::AllocaInst(DtoType(fd->vresult->type),"function_vresult",allocaPoint);
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
484 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
485
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
486 // give arguments storage
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
487 size_t n = Argument::dim(f->parameters);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
488 for (int i=0; i < n; ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
489 Argument* arg = Argument::getNth(f->parameters, i);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
490 if (arg && arg->vardecl) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
491 VarDeclaration* vd = arg->vardecl;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
492 if (!vd->llvmNeedsStorage || vd->nestedref || vd->isRef() || vd->isOut() || DtoIsPassedByRef(vd->type))
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
493 continue;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
494 llvm::Value* a = vd->llvmValue;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
495 assert(a);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
496 std::string s(a->getName());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
497 Logger::println("giving argument '%s' storage", s.c_str());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
498 s.append("_storage");
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
499 llvm::Value* v = new llvm::AllocaInst(a->getType(),s,allocaPoint);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
500 gIR->ir->CreateStore(a,v);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
501 vd->llvmValue = v;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
502 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
503 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
504 Logger::attention("some unknown argument: %s", arg ? arg->toChars() : 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
505 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
506 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
507
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
508 // debug info
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
509 if (global.params.symdebug) DtoDwarfFuncStart(fd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
510
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
511 llvm::Value* parentNested = NULL;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
512 if (FuncDeclaration* fd2 = fd->toParent()->isFuncDeclaration()) {
108
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
513 if (!fd->isStatic())
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
514 parentNested = fd2->llvmNested;
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
515 }
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
516
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
517 // need result variable? (nested)
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
518 if (fd->vresult && fd->vresult->nestedref) {
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
519 Logger::println("nested vresult value: %s", fd->vresult->toChars());
288fe1029e1f [svn r112] Fixed 'case 1,2,3:' style case statements.
lindquist
parents: 102
diff changeset
520 fd->llvmNestedVars.insert(fd->vresult);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
521 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
522
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
523 // construct nested variables struct
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
524 if (!fd->llvmNestedVars.empty() || parentNested) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
525 std::vector<const llvm::Type*> nestTypes;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
526 int j = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
527 if (parentNested) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
528 nestTypes.push_back(parentNested->getType());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
529 j++;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
530 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
531 for (std::set<VarDeclaration*>::iterator i=fd->llvmNestedVars.begin(); i!=fd->llvmNestedVars.end(); ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
532 VarDeclaration* vd = *i;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
533 vd->llvmNestedIndex = j++;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
534 if (vd->isParameter()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
535 assert(vd->llvmValue);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
536 nestTypes.push_back(vd->llvmValue->getType());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
537 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
538 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
539 nestTypes.push_back(DtoType(vd->type));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
540 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
541 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
542 const llvm::StructType* nestSType = llvm::StructType::get(nestTypes);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
543 Logger::cout() << "nested var struct has type:" << '\n' << *nestSType;
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
544 fd->llvmNested = new llvm::AllocaInst(nestSType,"nestedvars",allocaPoint);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
545 if (parentNested) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
546 assert(fd->llvmThisVar);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
547 llvm::Value* ptr = gIR->ir->CreateBitCast(fd->llvmThisVar, parentNested->getType(), "tmp");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
548 gIR->ir->CreateStore(ptr, DtoGEPi(fd->llvmNested, 0,0, "tmp"));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
549 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
550 for (std::set<VarDeclaration*>::iterator i=fd->llvmNestedVars.begin(); i!=fd->llvmNestedVars.end(); ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
551 VarDeclaration* vd = *i;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
552 if (vd->isParameter()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
553 gIR->ir->CreateStore(vd->llvmValue, DtoGEPi(fd->llvmNested, 0, vd->llvmNestedIndex, "tmp"));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
554 vd->llvmValue = fd->llvmNested;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
555 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
556 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
557 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
558
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
559 // copy _argptr to a memory location
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
560 if (f->linkage == LINKd && f->varargs == 1)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
561 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
562 llvm::Value* argptrmem = new llvm::AllocaInst(fd->llvmArgPtr->getType(), "_argptrmem", gIR->topallocapoint());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
563 new llvm::StoreInst(fd->llvmArgPtr, argptrmem, gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
564 fd->llvmArgPtr = argptrmem;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
565 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
566
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
567 // output function body
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
568 fd->fbody->toIR(gIR);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
569
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
570 // llvm requires all basic blocks to end with a TerminatorInst but DMD does not put a return statement
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
571 // in automatically, so we do it here.
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
572 if (!fd->isMain()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
573 if (!gIR->scopereturned()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
574 // pass the previous block into this block
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
575 if (global.params.symdebug) DtoDwarfFuncEnd(fd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
576 if (func->getReturnType() == llvm::Type::VoidTy) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
577 new llvm::ReturnInst(gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
578 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
579 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
580 new llvm::ReturnInst(llvm::UndefValue::get(func->getReturnType()), gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
581 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
582 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
583 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
584
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
585 // erase alloca point
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
586 allocaPoint->eraseFromParent();
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
587 allocaPoint = 0;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
588 gIR->func()->allocapoint = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
589
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
590 gIR->scopes.pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
591
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
592 // get rid of the endentry block, it's never used
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
593 assert(!func->getBasicBlockList().empty());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
594 func->getBasicBlockList().pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
595
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
596 // if the last block is empty now, it must be unreachable or it's a bug somewhere else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
597 // would be nice to figure out how to assert that this is correct
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
598 llvm::BasicBlock* lastbb = &func->getBasicBlockList().back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
599 if (lastbb->empty()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
600 if (lastbb->getNumUses() == 0)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
601 lastbb->eraseFromParent();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
602 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
603 new llvm::UnreachableInst(lastbb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
604 /*if (func->getReturnType() == llvm::Type::VoidTy) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
605 new llvm::ReturnInst(lastbb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
606 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
607 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
608 new llvm::ReturnInst(llvm::UndefValue::get(func->getReturnType()), lastbb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
609 }*/
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
610 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
611 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
612
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
613 gIR->functions.pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
614 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
615 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
616 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
617
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
618 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
619
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
620 void DtoMain()
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
621 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
622 // emit main function llvm style
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
623 // int main(int argc, char**argv, char**env);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
624
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
625 assert(gIR != 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
626 IRState& ir = *gIR;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
627
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
628 assert(ir.emitMain && ir.mainFunc);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
629
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
630 // parameter types
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
631 std::vector<const llvm::Type*> pvec;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
632 pvec.push_back((const llvm::Type*)llvm::Type::Int32Ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
633 const llvm::Type* chPtrType = (const llvm::Type*)llvm::PointerType::get(llvm::Type::Int8Ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
634 pvec.push_back((const llvm::Type*)llvm::PointerType::get(chPtrType));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
635 pvec.push_back((const llvm::Type*)llvm::PointerType::get(chPtrType));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
636 const llvm::Type* rettype = (const llvm::Type*)llvm::Type::Int32Ty;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
637
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
638 llvm::FunctionType* functype = llvm::FunctionType::get(rettype, pvec, false);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
639 llvm::Function* func = new llvm::Function(functype,llvm::GlobalValue::ExternalLinkage,"main",ir.module);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
640
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
641 llvm::BasicBlock* bb = new llvm::BasicBlock("entry",func);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
642
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
643 // call static ctors
117
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
644 llvm::Function* fn = LLVM_D_GetRuntimeFunction(ir.module,"_moduleCtor");
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
645 llvm::Instruction* apt = new llvm::CallInst(fn,"",bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
646
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
647 // run unit tests if -unittest is provided
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
648 if (global.params.useUnitTests) {
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
649 fn = LLVM_D_GetRuntimeFunction(ir.module,"_moduleUnitTests");
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
650 llvm::Instruction* apt = new llvm::CallInst(fn,"",bb);
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
651 }
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 119
diff changeset
652
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
653 // call user main function
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
654 const llvm::FunctionType* mainty = ir.mainFunc->getFunctionType();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
655 llvm::CallInst* call;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
656 if (mainty->getNumParams() > 0)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
657 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
658 // main with arguments
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
659 assert(mainty->getNumParams() == 1);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
660 std::vector<llvm::Value*> args;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
661 llvm::Function* mfn = LLVM_D_GetRuntimeFunction(ir.module,"_d_main_args");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
662
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
663 llvm::Function::arg_iterator argi = func->arg_begin();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
664 args.push_back(argi++);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
665 args.push_back(argi++);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
666
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
667 const llvm::Type* at = mainty->getParamType(0)->getContainedType(0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
668 llvm::Value* arr = new llvm::AllocaInst(at->getContainedType(1)->getContainedType(0), func->arg_begin(), "argstorage", apt);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
669 llvm::Value* a = new llvm::AllocaInst(at, "argarray", apt);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
670 llvm::Value* ptr = DtoGEPi(a,0,0,"tmp",bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
671 llvm::Value* v = args[0];
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
672 if (v->getType() != DtoSize_t())
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
673 v = new llvm::ZExtInst(v, DtoSize_t(), "tmp", bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
674 new llvm::StoreInst(v,ptr,bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
675 ptr = DtoGEPi(a,0,1,"tmp",bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
676 new llvm::StoreInst(arr,ptr,bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
677 args.push_back(a);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
678 new llvm::CallInst(mfn, args.begin(), args.end(), "", bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
679 call = new llvm::CallInst(ir.mainFunc,a,"ret",bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
680 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
681 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
682 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
683 // main with no arguments
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
684 call = new llvm::CallInst(ir.mainFunc,"ret",bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
685 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
686 call->setCallingConv(ir.mainFunc->getCallingConv());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
687
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
688 // call static dtors
117
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
689 fn = LLVM_D_GetRuntimeFunction(ir.module,"_moduleDtor");
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
690 new llvm::CallInst(fn,"",bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
691
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
692 // return
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
693 new llvm::ReturnInst(call,bb);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
694 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
695
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
696 //////////////////////////////////////////////////////////////////////////////////////////
117
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
697
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
698 const llvm::FunctionType* DtoBaseFunctionType(FuncDeclaration* fdecl)
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
699 {
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
700 Dsymbol* parent = fdecl->toParent();
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
701 ClassDeclaration* cd = parent->isClassDeclaration();
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
702 assert(cd);
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
703
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
704 FuncDeclaration* f = fdecl;
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
705
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
706 while (cd)
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
707 {
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
708 ClassDeclaration* base = cd->baseClass;
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
709 if (!base)
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
710 break;
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
711 FuncDeclaration* f2 = base->findFunc(fdecl->ident, (TypeFunction*)fdecl->type);
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
712 if (f2) {
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
713 f = f2;
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
714 cd = base;
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
715 }
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
716 else
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
717 break;
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
718 }
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
719
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
720 DtoResolveDsymbol(f);
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
721 return llvm::cast<llvm::FunctionType>(DtoType(f->type));
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
722 }
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
723
56a21f3e5d3e [svn r121] Finished ModuleInfo implementation.
lindquist
parents: 116
diff changeset
724 //////////////////////////////////////////////////////////////////////////////////////////