Mercurial > projects > ldc
comparison gen/toir.cpp @ 887:7f6eeb7b003e
Fix #163.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sat, 17 Jan 2009 14:53:32 +0100 |
parents | af7a6faf9406 |
children | 29c0d1194033 |
comparison
equal
deleted
inserted
replaced
886:7ddd03a2ce02 | 887:7f6eeb7b003e |
---|---|
2097 LOG_SCOPE; | 2097 LOG_SCOPE; |
2098 | 2098 |
2099 Type* dtype = type->toBasetype(); | 2099 Type* dtype = type->toBasetype(); |
2100 const LLType* resty = DtoType(dtype); | 2100 const LLType* resty = DtoType(dtype); |
2101 | 2101 |
2102 // allocate a temporary for the final result. failed to come up with a better way :/ | 2102 DValue* dvv; |
2103 LLValue* resval = DtoAlloca(resty,"condtmp"); | 2103 // voids returns will need no storage |
2104 DVarValue* dvv = new DVarValue(type, resval); | 2104 if (dtype->ty != Tvoid) { |
2105 // allocate a temporary for the final result. failed to come up with a better way :/ | |
2106 LLValue* resval = DtoAlloca(resty,"condtmp"); | |
2107 dvv = new DVarValue(type, resval); | |
2108 } else { | |
2109 dvv = new DConstValue(type, getNullValue(DtoTypeNotVoid(dtype))); | |
2110 } | |
2105 | 2111 |
2106 llvm::BasicBlock* oldend = p->scopeend(); | 2112 llvm::BasicBlock* oldend = p->scopeend(); |
2107 llvm::BasicBlock* condtrue = llvm::BasicBlock::Create("condtrue", gIR->topfunc(), oldend); | 2113 llvm::BasicBlock* condtrue = llvm::BasicBlock::Create("condtrue", gIR->topfunc(), oldend); |
2108 llvm::BasicBlock* condfalse = llvm::BasicBlock::Create("condfalse", gIR->topfunc(), oldend); | 2114 llvm::BasicBlock* condfalse = llvm::BasicBlock::Create("condfalse", gIR->topfunc(), oldend); |
2109 llvm::BasicBlock* condend = llvm::BasicBlock::Create("condend", gIR->topfunc(), oldend); | 2115 llvm::BasicBlock* condend = llvm::BasicBlock::Create("condend", gIR->topfunc(), oldend); |
2112 LLValue* cond_val = DtoCast(loc, c, Type::tbool)->getRVal(); | 2118 LLValue* cond_val = DtoCast(loc, c, Type::tbool)->getRVal(); |
2113 llvm::BranchInst::Create(condtrue,condfalse,cond_val,p->scopebb()); | 2119 llvm::BranchInst::Create(condtrue,condfalse,cond_val,p->scopebb()); |
2114 | 2120 |
2115 p->scope() = IRScope(condtrue, condfalse); | 2121 p->scope() = IRScope(condtrue, condfalse); |
2116 DValue* u = e1->toElem(p); | 2122 DValue* u = e1->toElem(p); |
2117 DtoAssign(loc, dvv, u); | 2123 if (dtype->ty != Tvoid) |
2124 DtoAssign(loc, dvv, u); | |
2118 llvm::BranchInst::Create(condend,p->scopebb()); | 2125 llvm::BranchInst::Create(condend,p->scopebb()); |
2119 | 2126 |
2120 p->scope() = IRScope(condfalse, condend); | 2127 p->scope() = IRScope(condfalse, condend); |
2121 DValue* v = e2->toElem(p); | 2128 DValue* v = e2->toElem(p); |
2122 DtoAssign(loc, dvv, v); | 2129 if (dtype->ty != Tvoid) |
2130 DtoAssign(loc, dvv, v); | |
2123 llvm::BranchInst::Create(condend,p->scopebb()); | 2131 llvm::BranchInst::Create(condend,p->scopebb()); |
2124 | 2132 |
2125 p->scope() = IRScope(condend, oldend); | 2133 p->scope() = IRScope(condend, oldend); |
2126 return dvv; | 2134 return dvv; |
2127 } | 2135 } |