Mercurial > projects > ldc
diff gen/tollvm.cpp @ 133:44a95ac7368a trunk
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
In particular, assertions has been fixed to include file/line info, and much more!
author | lindquist |
---|---|
date | Mon, 14 Jan 2008 05:11:54 +0100 |
parents | 1700239cab2e |
children | 176bd52b3cf5 |
line wrap: on
line diff
--- a/gen/tollvm.cpp Fri Jan 11 17:57:40 2008 +0100 +++ b/gen/tollvm.cpp Mon Jan 14 05:11:54 2008 +0100 @@ -82,9 +82,9 @@ case Tpointer: { assert(t->next); if (t->next->ty == Tvoid) - return (const llvm::Type*)llvm::PointerType::get(llvm::Type::Int8Ty); + return (const llvm::Type*)getPtrToType(llvm::Type::Int8Ty); else - return (const llvm::Type*)llvm::PointerType::get(DtoType(t->next)); + return (const llvm::Type*)getPtrToType(DtoType(t->next)); } // arrays @@ -117,11 +117,11 @@ TypeStruct* ts = (TypeStruct*)t; assert(ts->sym); DtoResolveDsymbol(ts->sym); - return t->llvmType->get(); + return ts->sym->llvmIRStruct->recty.get();//t->llvmType->get(); } case Tclass: { - if (!t->llvmType || *t->llvmType == NULL) { + /*if (!t->llvmType || *t->llvmType == NULL) { // recursive or cyclic declaration if (!gIR->structs.empty()) { @@ -130,17 +130,17 @@ { if (t == (*i)->type) { - return llvm::PointerType::get((*i)->recty.get()); + return getPtrToType((*i)->recty.get()); } } } Logger::println("no type found"); - } + }*/ TypeClass* tc = (TypeClass*)t; assert(tc->sym); DtoResolveDsymbol(tc->sym); - return llvm::PointerType::get(t->llvmType->get()); + return getPtrToType(tc->sym->llvmIRStruct->recty.get());//t->llvmType->get()); } // functions @@ -182,7 +182,7 @@ std::vector<const llvm::Type*> types; types.push_back(DtoType(taa->key)); types.push_back(DtoType(taa->next)); - return llvm::PointerType::get(llvm::StructType::get(types)); + return getPtrToType(llvm::StructType::get(types)); } default: @@ -196,9 +196,9 @@ const llvm::StructType* DtoDelegateType(Type* t) { - const llvm::Type* i8ptr = llvm::PointerType::get(llvm::Type::Int8Ty); + const llvm::Type* i8ptr = getPtrToType(llvm::Type::Int8Ty); const llvm::Type* func = DtoFunctionType(t->next, i8ptr); - const llvm::Type* funcptr = llvm::PointerType::get(func); + const llvm::Type* funcptr = getPtrToType(func); std::vector<const llvm::Type*> types; types.push_back(i8ptr); @@ -214,7 +214,7 @@ const llvm::Type* int8ty = (const llvm::Type*)llvm::Type::Int8Ty; const llvm::Type* int32ty = (const llvm::Type*)llvm::Type::Int32Ty; const llvm::Type* int64ty = (const llvm::Type*)llvm::Type::Int64Ty; - const llvm::Type* int8ptrty = (const llvm::Type*)llvm::PointerType::get(llvm::Type::Int8Ty); + const llvm::Type* int8ptrty = (const llvm::Type*)getPtrToType(llvm::Type::Int8Ty); const llvm::Type* voidty = (const llvm::Type*)llvm::Type::VoidTy; assert(gIR); @@ -284,7 +284,7 @@ assert(gIR); d_uns64 n = (global.params.is64bit) ? 16 : 8; - llvm::Type* i8p_ty = llvm::PointerType::get(llvm::Type::Int8Ty); + const llvm::Type* i8p_ty = getPtrToType(llvm::Type::Int8Ty); llvm::Value* arr = new llvm::BitCastInst(v,i8p_ty,"tmp",gIR->scopebb()); @@ -310,7 +310,7 @@ d_uns64 n = (global.params.is64bit) ? 16 : 8; - llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); + const llvm::Type* arrty = getPtrToType(llvm::Type::Int8Ty); llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb()); llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb()); @@ -434,10 +434,8 @@ } } else if (isaPointer(t)) { - const llvm::Type* st = DtoSize_t(); - llvm::Value* ptrasint = new llvm::PtrToIntInst(val,st,"tmp",gIR->scopebb()); - llvm::Value* zero = llvm::ConstantInt::get(st, 0, false); - return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, ptrasint, zero, "tmp", gIR->scopebb()); + llvm::Value* zero = llvm::Constant::getNullValue(t); + return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb()); } else { @@ -615,7 +613,7 @@ /*size_t sz = gTargetData->getTypeSize(ty); llvm::ConstantInt* n = llvm::ConstantInt::get(DtoSize_t(), sz, false); if (ptr == 0) { - llvm::PointerType* i8pty = llvm::PointerType::get(llvm::Type::Int8Ty); + llvm::PointerType* i8pty = getPtrToType(llvm::Type::Int8Ty); ptr = llvm::ConstantPointerNull::get(i8pty); } return DtoRealloc(ptr, n);*/ @@ -634,7 +632,7 @@ llvm::Value* newptr = ptr; - llvm::PointerType* i8pty = llvm::PointerType::get(llvm::Type::Int8Ty); + const llvm::PointerType* i8pty = getPtrToType(llvm::Type::Int8Ty); if (ptr->getType() != i8pty) { newptr = new llvm::BitCastInst(ptr,i8pty,"tmp",gIR->scopebb()); } @@ -649,30 +647,33 @@ ////////////////////////////////////////////////////////////////////////////////////////// -void DtoAssert(llvm::Value* cond, Loc* loc, DValue* msg) +void DtoAssert(Loc* loc, DValue* msg) { - llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_assert"); - const llvm::FunctionType* fnt = fn->getFunctionType(); + std::vector<llvm::Value*> args; + llvm::Constant* c; + + // func + const char* fname = msg ? "_d_assert_msg" : "_d_assert"; + + // msg param + if (msg) args.push_back(msg->getRVal()); - std::vector<llvm::Value*> llargs; - llargs.resize(3); - llargs[0] = cond ? DtoBoolean(cond) : llvm::ConstantInt::getFalse(); - llargs[1] = DtoConstUint(loc->linnum); - if (msg) - llargs[2] = msg->getRVal(); - else { - llvm::Constant* c = DtoConstSlice(DtoConstSize_t(0), DtoConstNullPtr(llvm::Type::Int8Ty)); - static llvm::AllocaInst* alloc = 0; - if (!alloc || alloc->getParent()->getParent() != gIR->func()->func) { - alloc = new llvm::AllocaInst(c->getType(), "assertnullparam", gIR->topallocapoint()); - DtoSetArrayToNull(alloc); - } - llargs[2] = alloc; - } + // file param + c = DtoConstString(loc->filename); + llvm::AllocaInst* alloc = new llvm::AllocaInst(c->getType(), "srcfile", gIR->topallocapoint()); + llvm::Value* ptr = DtoGEPi(alloc, 0,0, "tmp"); + DtoStore(c->getOperand(0), ptr); + ptr = DtoGEPi(alloc, 0,1, "tmp"); + DtoStore(c->getOperand(1), ptr); + args.push_back(alloc); - assert(fn); - llvm::CallInst* call = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); - call->setCallingConv(llvm::CallingConv::C); + // line param + c = DtoConstUint(loc->linnum); + args.push_back(c); + + // call + llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname); + llvm::CallInst* call = new llvm::CallInst(fn, args.begin(), args.end(), "", gIR->scopebb()); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1191,9 +1192,9 @@ { TY ty = DtoDType(t)->ty; if (ty == Tfloat32 || ty == Timaginary32) - return llvm::ConstantFP::get(llvm::Type::FloatTy, float(value)); + return llvm::ConstantFP::get(llvm::Type::FloatTy, llvm::APFloat(float(value))); else if (ty == Tfloat64 || ty == Timaginary64 || ty == Tfloat80 || ty == Timaginary80) - return llvm::ConstantFP::get(llvm::Type::DoubleTy, double(value)); + return llvm::ConstantFP::get(llvm::Type::DoubleTy, llvm::APFloat(double(value))); } @@ -1227,7 +1228,7 @@ llvm::Constant* DtoConstNullPtr(const llvm::Type* t) { return llvm::ConstantPointerNull::get( - llvm::PointerType::get(t) + getPtrToType(t) ); } @@ -1235,7 +1236,7 @@ void DtoMemSetZero(llvm::Value* dst, llvm::Value* nbytes) { - llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); + const llvm::Type* arrty = getPtrToType(llvm::Type::Int8Ty); llvm::Value *dstarr; if (dst->getType() == arrty) { @@ -1263,7 +1264,7 @@ { assert(dst->getType() == src->getType()); - llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); + const llvm::Type* arrty = getPtrToType(llvm::Type::Int8Ty); llvm::Value *dstarr, *srcarr; if (dst->getType() == arrty) { @@ -1309,11 +1310,11 @@ ////////////////////////////////////////////////////////////////////////////////////////// -llvm::Value* DtoBitCast(llvm::Value* v, const llvm::Type* t) +llvm::Value* DtoBitCast(llvm::Value* v, const llvm::Type* t, const char* name) { if (v->getType() == t) return v; - return gIR->ir->CreateBitCast(v, t, "tmp"); + return gIR->ir->CreateBitCast(v, t, name ? name : "tmp"); } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1370,6 +1371,36 @@ ////////////////////////////////////////////////////////////////////////////////////////// +const llvm::PointerType* getPtrToType(const llvm::Type* t) +{ + return llvm::PointerType::get(t, 0); +} + +llvm::ConstantPointerNull* getNullPtr(const llvm::Type* t) +{ + const llvm::PointerType* pt = llvm::cast<llvm::PointerType>(t); + return llvm::ConstantPointerNull::get(pt); +} + +////////////////////////////////////////////////////////////////////////////////////////// + +size_t getTypeBitSize(const llvm::Type* t) +{ + return gTargetData->getTypeSizeInBits(t); +} + +size_t getTypeStoreSize(const llvm::Type* t) +{ + return gTargetData->getTypeStoreSize(t); +} + +size_t getABITypeSize(const llvm::Type* t) +{ + return gTargetData->getABITypeSize(t); +} + +////////////////////////////////////////////////////////////////////////////////////////// + bool DtoIsTemplateInstance(Dsymbol* s) { if (!s) return false; @@ -1656,7 +1687,7 @@ void DtoForceDeclareDsymbol(Dsymbol* dsym) { if (dsym->llvmDeclared) return; - Logger::println("DtoForceDeclareDsymbol(%s)", dsym->toChars()); + Logger::println("DtoForceDeclareDsymbol(%s)", dsym->toPrettyChars()); LOG_SCOPE; DtoResolveDsymbol(dsym); @@ -1670,7 +1701,7 @@ void DtoForceConstInitDsymbol(Dsymbol* dsym) { if (dsym->llvmInitialized) return; - Logger::println("DtoForceConstInitDsymbol(%s)", dsym->toChars()); + Logger::println("DtoForceConstInitDsymbol(%s)", dsym->toPrettyChars()); LOG_SCOPE; DtoResolveDsymbol(dsym); @@ -1685,7 +1716,7 @@ void DtoForceDefineDsymbol(Dsymbol* dsym) { if (dsym->llvmDefined) return; - Logger::println("DtoForceDefineDsymbol(%s)", dsym->toChars()); + Logger::println("DtoForceDefineDsymbol(%s)", dsym->toPrettyChars()); LOG_SCOPE; DtoResolveDsymbol(dsym);