Mercurial > projects > ldc
comparison gen/structs.cpp @ 205:9d44ec83acd1 trunk
[svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
Fixed: Implemented volatile statements. Uses the LLVM memory barrier intrinsic, closes #21 .
author | lindquist |
---|---|
date | Tue, 13 May 2008 17:58:11 +0200 |
parents | db9890b3fb64 |
children | 7816aafeea3c |
comparison
equal
deleted
inserted
replaced
204:11fe364b9a3e | 205:9d44ec83acd1 |
---|---|
41 llargs[0] = sarr; | 41 llargs[0] = sarr; |
42 llargs[1] = llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false); | 42 llargs[1] = llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false); |
43 llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); | 43 llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); |
44 llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); | 44 llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); |
45 | 45 |
46 llvm::Value* ret = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); | 46 llvm::Value* ret = llvm::CallInst::Create(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); |
47 | 47 |
48 return ret; | 48 return ret; |
49 } | 49 } |
50 | 50 |
51 ////////////////////////////////////////////////////////////////////////////////////////// | 51 ////////////////////////////////////////////////////////////////////////////////////////// |
69 llargs[0] = dstarr; | 69 llargs[0] = dstarr; |
70 llargs[1] = srcarr; | 70 llargs[1] = srcarr; |
71 llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); | 71 llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false); |
72 llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); | 72 llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); |
73 | 73 |
74 return new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); | 74 return llvm::CallInst::Create(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); |
75 } | 75 } |
76 | 76 |
77 ////////////////////////////////////////////////////////////////////////////////////////// | 77 ////////////////////////////////////////////////////////////////////////////////////////// |
78 llvm::Constant* DtoConstStructInitializer(StructInitializer* si) | 78 llvm::Constant* DtoConstStructInitializer(StructInitializer* si) |
79 { | 79 { |
128 idxs.push_back(vd->ir.irField->index); | 128 idxs.push_back(vd->ir.irField->index); |
129 ptr = DtoGEP(ptr, idxs, "tmp"); | 129 ptr = DtoGEP(ptr, idxs, "tmp"); |
130 if (ptr->getType() != llt) | 130 if (ptr->getType() != llt) |
131 ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp"); | 131 ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp"); |
132 if (vd->ir.irField->indexOffset) | 132 if (vd->ir.irField->indexOffset) |
133 ptr = new llvm::GetElementPtrInst(ptr, DtoConstUint(vd->ir.irField->indexOffset), "tmp", gIR->scopebb()); | 133 ptr = llvm::GetElementPtrInst::Create(ptr, DtoConstUint(vd->ir.irField->indexOffset), "tmp", gIR->scopebb()); |
134 return ptr; | 134 return ptr; |
135 } | 135 } |
136 else if (vdtype->ty == Tstruct && (vd->offset + vdtype->size()) > os) { | 136 else if (vdtype->ty == Tstruct && (vd->offset + vdtype->size()) > os) { |
137 TypeStruct* ts = (TypeStruct*)vdtype; | 137 TypeStruct* ts = (TypeStruct*)vdtype; |
138 StructDeclaration* ssd = ts->sym; | 138 StructDeclaration* ssd = ts->sym; |
140 if (vd->ir.irField->indexOffset) { | 140 if (vd->ir.irField->indexOffset) { |
141 Logger::println("has union field offset"); | 141 Logger::println("has union field offset"); |
142 ptr = DtoGEP(ptr, idxs, "tmp"); | 142 ptr = DtoGEP(ptr, idxs, "tmp"); |
143 if (ptr->getType() != llt) | 143 if (ptr->getType() != llt) |
144 ptr = DtoBitCast(ptr, llt); | 144 ptr = DtoBitCast(ptr, llt); |
145 ptr = new llvm::GetElementPtrInst(ptr, DtoConstUint(vd->ir.irField->indexOffset), "tmp", gIR->scopebb()); | 145 ptr = llvm::GetElementPtrInst::Create(ptr, DtoConstUint(vd->ir.irField->indexOffset), "tmp", gIR->scopebb()); |
146 std::vector<unsigned> tmp; | 146 std::vector<unsigned> tmp; |
147 return DtoIndexStruct(ptr, ssd, t, os-vd->offset, tmp); | 147 return DtoIndexStruct(ptr, ssd, t, os-vd->offset, tmp); |
148 } | 148 } |
149 else { | 149 else { |
150 const llvm::Type* sty = getPtrToType(DtoType(vd->type)); | 150 const llvm::Type* sty = getPtrToType(DtoType(vd->type)); |
161 } | 161 } |
162 | 162 |
163 size_t llt_sz = getTypeStoreSize(llt->getContainedType(0)); | 163 size_t llt_sz = getTypeStoreSize(llt->getContainedType(0)); |
164 assert(os % llt_sz == 0); | 164 assert(os % llt_sz == 0); |
165 ptr = DtoBitCast(ptr, llt); | 165 ptr = DtoBitCast(ptr, llt); |
166 return new llvm::GetElementPtrInst(ptr, DtoConstUint(os / llt_sz), "tmp", gIR->scopebb()); | 166 return llvm::GetElementPtrInst::Create(ptr, DtoConstUint(os / llt_sz), "tmp", gIR->scopebb()); |
167 } | 167 } |
168 | 168 |
169 ////////////////////////////////////////////////////////////////////////////////////////// | 169 ////////////////////////////////////////////////////////////////////////////////////////// |
170 | 170 |
171 void DtoResolveStruct(StructDeclaration* sd) | 171 void DtoResolveStruct(StructDeclaration* sd) |