[svn r57] Added most basic TypeInfo (rebuild lphobos).

Fixed some SymOffExp bugs.
Added another typeinfo test case.
This commit is contained in:
Tomas Lindquist Olsen
2007-10-23 07:16:02 +02:00
parent 5fee3fc8b7
commit b72a4fa645
14 changed files with 533 additions and 4 deletions

View File

@@ -1058,7 +1058,7 @@ elem* CallExp::toElem(IRState* p)
Logger::cout() << "what are we calling? : " << *funcval << '\n';
}
assert(llfnty);
Logger::cout() << "Function LLVM type: " << *llfnty << '\n';
//Logger::cout() << "Function LLVM type: " << *llfnty << '\n';
// argument handling
llvm::FunctionType::param_iterator argiter = llfnty->param_begin();
@@ -1132,7 +1132,7 @@ elem* CallExp::toElem(IRState* p)
Logger::cout() << *llargs[i] << '\n';
}
Logger::cout() << "Calling: " << *funcval->getType() << '\n';
//Logger::cout() << "Calling: " << *funcval->getType() << '\n';
// call the function
llvm::CallInst* call = new llvm::CallInst(funcval, llargs.begin(), llargs.end(), varname, p->scopebb());
@@ -1155,7 +1155,7 @@ elem* CallExp::toElem(IRState* p)
elem* CastExp::toElem(IRState* p)
{
Logger::print("CastExp::toElem: %s\n", toChars());
Logger::print("CastExp::toElem: %s | %s\n", toChars(), type->toChars());
LOG_SCOPE;
elem* e = new elem;
elem* u = e1->toElem(p);
@@ -1363,6 +1363,12 @@ elem* SymOffExp::toElem(IRState* p)
e = new elem;
assert(llvalue);
e->mem = llvalue;
const llvm::Type* llt = LLVM_DtoType(t);
if (llvalue->getType() != llt) {
Logger::cout() << "llt is:" << *llt << '\n';
//const llvm::PointerType* vpty = llvm::PointerType::get(llvm::Type::Int8Ty);
e->mem = p->ir->CreateBitCast(e->mem, llt, "tmp");
}
e->type = elem::VAL;
}
else {
@@ -1465,7 +1471,7 @@ elem* DotVarExp::toElem(IRState* p)
llvm::Value* vtblidx = llvm::ConstantInt::get(llvm::Type::Int32Ty, (size_t)fdecl->vtblIndex, false);
funcval = LLVM_DtoGEP(e->arg, zero, zero, "tmp", p->scopebb());
funcval = new llvm::LoadInst(funcval,"tmp",p->scopebb());
funcval = LLVM_DtoGEP(funcval, zero, vtblidx, "tmp", p->scopebb());
funcval = LLVM_DtoGEP(funcval, zero, vtblidx, toChars(), p->scopebb());
funcval = new llvm::LoadInst(funcval,"tmp",p->scopebb());
assert(funcval->getType() == fdecl->llvmValue->getType());
e->callconv = LLVM_DtoCallingConv(fdecl->linkage);
@@ -1925,6 +1931,10 @@ elem* EqualExp::toElem(IRState* p)
{
e->val = LLVM_DtoDynArrayCompare(op,l->mem,r->mem);
}
else if (t->ty == Tdelegate)
{
e->val = LLVM_DtoCompareDelegate(op,l->mem,r->mem);
}
else
{
assert(0 && "Unsupported EqualExp type");

View File

@@ -610,7 +610,22 @@ llvm::Value* LLVM_DtoDelegateCopy(llvm::Value* dst, llvm::Value* src)
return new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
}
//////////////////////////////////////////////////////////////////////////////////////////
llvm::Value* LLVM_DtoCompareDelegate(TOK op, llvm::Value* lhs, llvm::Value* rhs)
{
llvm::ICmpInst::Predicate pred = (op == TOKequal) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE;
llvm::Value* l = gIR->ir->CreateLoad(LLVM_DtoGEPi(lhs,0,0,"tmp"),"tmp");
llvm::Value* r = gIR->ir->CreateLoad(LLVM_DtoGEPi(rhs,0,0,"tmp"),"tmp");
llvm::Value* b1 = gIR->ir->CreateICmp(pred,l,r,"tmp");
l = gIR->ir->CreateLoad(LLVM_DtoGEPi(lhs,0,1,"tmp"),"tmp");
r = gIR->ir->CreateLoad(LLVM_DtoGEPi(rhs,0,1,"tmp"),"tmp");
llvm::Value* b2 = gIR->ir->CreateICmp(pred,l,r,"tmp");
llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp");
if (op == TOKnotequal)
return gIR->ir->CreateNot(b,"tmp");
return b;
}
//////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -18,6 +18,7 @@ llvm::Function* LLVM_DtoDeclareFunction(FuncDeclaration* fdecl);
const llvm::StructType* LLVM_DtoDelegateType(Type* t);
llvm::Value* LLVM_DtoNullDelegate(llvm::Value* v);
llvm::Value* LLVM_DtoDelegateCopy(llvm::Value* dst, llvm::Value* src);
llvm::Value* LLVM_DtoCompareDelegate(TOK op, llvm::Value* lhs, llvm::Value* rhs);
llvm::GlobalValue::LinkageTypes LLVM_DtoLinkage(PROT prot, uint stc);
unsigned LLVM_DtoCallingConv(LINK l);