mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-03-09 21:53:13 +01:00
[svn r57] Added most basic TypeInfo (rebuild lphobos).
Fixed some SymOffExp bugs. Added another typeinfo test case.
This commit is contained in:
18
gen/toir.c
18
gen/toir.c
@@ -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");
|
||||
|
||||
15
gen/tollvm.c
15
gen/tollvm.c
@@ -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;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user