Mercurial > projects > ldc
diff gen/statements.cpp @ 271:1e6e2b5d5bfe trunk
[svn r292] Fixed: string switch was broken in several ways.
Fixed: TypeInfo_Typedef.next was incorrect (return base of base instead of just base).
Fixed: ClassInfo offset type info (offTi) had invalid offsets.
author | lindquist |
---|---|
date | Wed, 18 Jun 2008 21:31:05 +0200 |
parents | d9d5d59873d8 |
children | 3b8ada4c9f8b |
line wrap: on
line diff
--- a/gen/statements.cpp Mon Jun 16 16:01:19 2008 +0200 +++ b/gen/statements.cpp Wed Jun 18 21:31:05 2008 +0200 @@ -681,7 +681,14 @@ } assert(llval->getType() == fn->getFunctionType()->getParamType(1)); - return gIR->ir->CreateCall2(fn, table, llval, "tmp"); + llvm::CallInst* call = gIR->ir->CreateCall2(fn, table, llval, "tmp"); + + llvm::PAListPtr palist; + palist = palist.addAttr(1, llvm::ParamAttr::ByVal); + palist = palist.addAttr(2, llvm::ParamAttr::ByVal); + call->setParamAttrs(palist); + + return call; } void SwitchStatement::toIR(IRState* p) @@ -709,6 +716,7 @@ { Logger::println("is string switch"); // build array of the stringexpS + caseArray.reserve(cases->dim); for (int i=0; i<cases->dim; ++i) { CaseStatement* cs = (CaseStatement*)cases->data[i]; @@ -719,13 +727,13 @@ // first sort it caseArray.sort(); // iterate and add indices to cases - std::vector<LLConstant*> inits; + std::vector<LLConstant*> inits(caseArray.dim); for (size_t i=0; i<caseArray.dim; ++i) { - CaseStatement* cs = (CaseStatement*)cases->data[i]; + Case* c = (Case*)caseArray.data[i]; + CaseStatement* cs = (CaseStatement*)cases->data[c->index]; cs->llvmIdx = DtoConstUint(i); - Case* c = (Case*)caseArray.data[i]; - inits.push_back(c->str->toConstElem(p)); + inits[i] = c->str->toConstElem(p); } // build static array for ptr or final array const LLType* elemTy = DtoType(condition->type); @@ -811,13 +819,10 @@ } bodyBB = nbb; - if (exp->type->isintegral()) { + if (llvmIdx == NULL) { LLConstant* c = exp->toConstElem(p); llvmIdx = isaConstantInt(c); } - else { - assert(llvmIdx); - } if (!p->scopereturned()) llvm::BranchInst::Create(bodyBB, p->scopebb());