Mercurial > projects > ldc
diff gen/functions.cpp @ 213:7816aafeea3c trunk
[svn r229] Updated the object.d implementation to the latest Tango.
Fixed a bunch of the built-in typeinfos for arrays, they did not inherit TypeInfo_Array.
Applied patch to tango/text/convert/Layout.d by fvbommel, closes #47 .
Cleaned up some type code.
Replaced uses of llvm::Type with LLType (a typedef), same for Value and Constant.
Fixed a few cases where typeinfo for user structs could be emitted multiple times, seems to still be some cases of this :/
author | lindquist |
---|---|
date | Fri, 30 May 2008 19:32:04 +0200 |
parents | 9d44ec83acd1 |
children | a58d8f4b84df |
line wrap: on
line diff
--- a/gen/functions.cpp Tue May 27 22:14:24 2008 +0200 +++ b/gen/functions.cpp Fri May 30 19:32:04 2008 +0200 @@ -18,7 +18,7 @@ #include "gen/classes.h" #include "gen/dvalue.h" -const llvm::FunctionType* DtoFunctionType(Type* type, const llvm::Type* thistype, bool ismain) +const llvm::FunctionType* DtoFunctionType(Type* type, const LLType* thistype, bool ismain) { TypeFunction* f = (TypeFunction*)type; assert(f != 0); @@ -38,8 +38,8 @@ } // return value type - const llvm::Type* rettype; - const llvm::Type* actualRettype; + const LLType* rettype; + const LLType* actualRettype; Type* rt = f->next; bool retinptr = false; bool usesthis = false; @@ -63,7 +63,7 @@ } // parameter types - std::vector<const llvm::Type*> paramvec; + std::vector<const LLType*> paramvec; if (retinptr) { //Logger::cout() << "returning through pointer parameter: " << *rettype << '\n'; @@ -80,10 +80,10 @@ ti->toObjFile(); DtoForceConstInitDsymbol(ti); assert(ti->ir.irStruct->constInit); - std::vector<const llvm::Type*> types; + std::vector<const LLType*> types; types.push_back(DtoSize_t()); types.push_back(getPtrToType(getPtrToType(ti->ir.irStruct->constInit->getType()))); - const llvm::Type* t1 = llvm::StructType::get(types); + const LLType* t1 = llvm::StructType::get(types); paramvec.push_back(getPtrToType(t1)); paramvec.push_back(getPtrToType(llvm::Type::Int8Ty)); } @@ -100,7 +100,7 @@ Type* argT = DtoDType(arg->type); assert(argT); - const llvm::Type* at = DtoType(argT); + const LLType* at = DtoType(argT); if (isaStruct(at)) { Logger::println("struct param"); paramvec.push_back(getPtrToType(at)); @@ -156,7 +156,7 @@ assert(f != 0); const llvm::PointerType* i8pty = getPtrToType(llvm::Type::Int8Ty); - std::vector<const llvm::Type*> args; + std::vector<const LLType*> args; if (fdecl->llvmInternal == LLVMva_start) { args.push_back(i8pty); @@ -187,7 +187,7 @@ // unittest has null type, just build it manually /*if (fdecl->isUnitTestDeclaration()) { - std::vector<const llvm::Type*> args; + std::vector<const LLType*> args; return llvm::FunctionType::get(llvm::Type::VoidTy, args, false); }*/ @@ -196,7 +196,7 @@ return llvm::cast<llvm::FunctionType>(fdecl->type->ir.type->get()); } - const llvm::Type* thisty = NULL; + const LLType* thisty = NULL; if (fdecl->needThis()) { if (AggregateDeclaration* ad = fdecl->isMember2()) { Logger::println("isMember = this is: %s", ad->type->toChars()); @@ -225,7 +225,7 @@ { TypeFunction* f = (TypeFunction*)DtoDType(fdecl->type); const llvm::FunctionType* fty = DtoVaFunctionType(fdecl); - llvm::Constant* fn = 0; + LLConstant* fn = 0; if (fdecl->llvmInternal == LLVMva_start) { fn = gIR->module->getOrInsertFunction("llvm.va_start", fty); @@ -499,7 +499,7 @@ gIR->scopes.push_back(IRScope(beginbb, endbb)); // create alloca point - llvm::Instruction* allocaPoint = new llvm::BitCastInst(llvm::ConstantInt::get(llvm::Type::Int32Ty,0,false),llvm::Type::Int32Ty,"alloca point",gIR->scopebb()); + llvm::Instruction* allocaPoint = new llvm::AllocaInst(llvm::Type::Int32Ty, "alloca point", beginbb); gIR->func()->allocapoint = allocaPoint; // need result variable? (not nested) @@ -522,13 +522,13 @@ if (!vd->needsStorage || vd->nestedref || vd->isRef() || vd->isOut() || DtoIsPassedByRef(vd->type)) continue; - llvm::Value* a = vd->ir.irLocal->value; + LLValue* a = vd->ir.irLocal->value; assert(a); std::string s(a->getName()); Logger::println("giving argument '%s' storage", s.c_str()); s.append("_storage"); - llvm::Value* v = new llvm::AllocaInst(a->getType(),s,allocaPoint); + LLValue* v = new llvm::AllocaInst(a->getType(),s,allocaPoint); gIR->ir->CreateStore(a,v); vd->ir.irLocal->value = v; } @@ -537,7 +537,7 @@ // debug info if (global.params.symdebug) DtoDwarfFuncStart(fd); - llvm::Value* parentNested = NULL; + LLValue* parentNested = NULL; if (FuncDeclaration* fd2 = fd->toParent2()->isFuncDeclaration()) { if (!fd->isStatic()) // huh? parentNested = fd2->ir.irFunc->nestedVar; @@ -551,7 +551,7 @@ // construct nested variables struct if (!fd->nestedVars.empty() || parentNested) { - std::vector<const llvm::Type*> nestTypes; + std::vector<const LLType*> nestTypes; int j = 0; if (parentNested) { nestTypes.push_back(parentNested->getType()); @@ -580,7 +580,7 @@ fd->ir.irFunc->nestedVar = new llvm::AllocaInst(nestSType,"nestedvars",allocaPoint); if (parentNested) { assert(fd->ir.irFunc->thisVar); - llvm::Value* ptr = gIR->ir->CreateBitCast(fd->ir.irFunc->thisVar, parentNested->getType(), "tmp"); + LLValue* ptr = gIR->ir->CreateBitCast(fd->ir.irFunc->thisVar, parentNested->getType(), "tmp"); gIR->ir->CreateStore(ptr, DtoGEPi(fd->ir.irFunc->nestedVar, 0,0, "tmp")); } for (std::set<VarDeclaration*>::iterator i=fd->nestedVars.begin(); i!=fd->nestedVars.end(); ++i) { @@ -596,7 +596,7 @@ // copy _argptr to a memory location if (f->linkage == LINKd && f->varargs == 1) { - llvm::Value* argptrmem = new llvm::AllocaInst(fd->ir.irFunc->_argptr->getType(), "_argptrmem", gIR->topallocapoint()); + LLValue* argptrmem = new llvm::AllocaInst(fd->ir.irFunc->_argptr->getType(), "_argptrmem", gIR->topallocapoint()); new llvm::StoreInst(fd->ir.irFunc->_argptr, argptrmem, gIR->scopebb()); fd->ir.irFunc->_argptr = argptrmem; } @@ -665,12 +665,12 @@ assert(ir.emitMain && ir.mainFunc); // parameter types - std::vector<const llvm::Type*> pvec; - pvec.push_back((const llvm::Type*)llvm::Type::Int32Ty); - const llvm::Type* chPtrType = (const llvm::Type*)getPtrToType(llvm::Type::Int8Ty); - pvec.push_back((const llvm::Type*)getPtrToType(chPtrType)); - pvec.push_back((const llvm::Type*)getPtrToType(chPtrType)); - const llvm::Type* rettype = (const llvm::Type*)llvm::Type::Int32Ty; + std::vector<const LLType*> pvec; + pvec.push_back((const LLType*)llvm::Type::Int32Ty); + const LLType* chPtrType = (const LLType*)getPtrToType(llvm::Type::Int8Ty); + pvec.push_back((const LLType*)getPtrToType(chPtrType)); + pvec.push_back((const LLType*)getPtrToType(chPtrType)); + const LLType* rettype = (const LLType*)llvm::Type::Int32Ty; llvm::FunctionType* functype = llvm::FunctionType::get(rettype, pvec, false); llvm::Function* func = llvm::Function::Create(functype,llvm::GlobalValue::ExternalLinkage,"main",ir.module); @@ -694,18 +694,18 @@ { // main with arguments assert(mainty->getNumParams() == 1); - std::vector<llvm::Value*> args; + std::vector<LLValue*> args; llvm::Function* mfn = LLVM_D_GetRuntimeFunction(ir.module,"_d_main_args"); llvm::Function::arg_iterator argi = func->arg_begin(); args.push_back(argi++); args.push_back(argi++); - const llvm::Type* at = mainty->getParamType(0)->getContainedType(0); - llvm::Value* arr = new llvm::AllocaInst(at->getContainedType(1)->getContainedType(0), func->arg_begin(), "argstorage", apt); - llvm::Value* a = new llvm::AllocaInst(at, "argarray", apt); - llvm::Value* ptr = DtoGEPi(a,0,0,"tmp",bb); - llvm::Value* v = args[0]; + const LLType* at = mainty->getParamType(0)->getContainedType(0); + LLValue* arr = new llvm::AllocaInst(at->getContainedType(1)->getContainedType(0), func->arg_begin(), "argstorage", apt); + LLValue* a = new llvm::AllocaInst(at, "argarray", apt); + LLValue* ptr = DtoGEPi(a,0,0,"tmp",bb); + LLValue* v = args[0]; if (v->getType() != DtoSize_t()) v = new llvm::ZExtInst(v, DtoSize_t(), "tmp", bb); new llvm::StoreInst(v,ptr,bb); @@ -778,7 +778,7 @@ // aggregate arg else if (DtoIsPassedByRef(argexp->type)) { - llvm::Value* alloc = new llvm::AllocaInst(DtoType(argexp->type), "tmpparam", gIR->topallocapoint()); + LLValue* alloc = new llvm::AllocaInst(DtoType(argexp->type), "tmpparam", gIR->topallocapoint()); DVarValue* vv = new DVarValue(argexp->type, alloc, true); DtoAssign(vv, arg); arg = vv; @@ -794,7 +794,7 @@ ////////////////////////////////////////////////////////////////////////////////////////// -void DtoVariadicArgument(Expression* argexp, llvm::Value* dst) +void DtoVariadicArgument(Expression* argexp, LLValue* dst) { Logger::println("DtoVariadicArgument"); LOG_SCOPE;