# HG changeset patch # User Tomas Lindquist Olsen # Date 1228093816 -3600 # Node ID 8e6135be6999dee78267856658751f62645fdc35 # Parent 67fcd9df8b793578abfafd020263b6e547c516cd Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding. Changed -g switch to emit DW_LANG_D debug info, make demangling work with a patched GDB, still more work to do for full support of D's Dwarf extensions. Added getNullValue helper method. diff -r 67fcd9df8b79 -r 8e6135be6999 dmd/mars.c --- a/dmd/mars.c Sun Nov 30 20:41:17 2008 +0100 +++ b/dmd/mars.c Mon Dec 01 02:10:16 2008 +0100 @@ -374,8 +374,10 @@ global.params.link = 0; else if (strcmp(p + 1, "fPIC") == 0) global.params.pic = 1; - else if (strcmp(p + 1, "g") == 0 || strcmp(p + 1, "gc") == 0) + else if (strcmp(p + 1, "g") == 0) global.params.symdebug = 1; + else if (strcmp(p + 1, "gc") == 0) + global.params.symdebug = 2; else if (strcmp(p + 1, "v") == 0) global.params.verbose = 1; else if (strcmp(p + 1, "vv") == 0) { diff -r 67fcd9df8b79 -r 8e6135be6999 dmd2/mars.c --- a/dmd2/mars.c Sun Nov 30 20:41:17 2008 +0100 +++ b/dmd2/mars.c Mon Dec 01 02:10:16 2008 +0100 @@ -391,8 +391,10 @@ global.params.link = 0; else if (strcmp(p + 1, "fPIC") == 0) global.params.pic = 1; - else if (strcmp(p + 1, "g") == 0 || strcmp(p + 1, "gc") == 0) + else if (strcmp(p + 1, "g") == 0) global.params.symdebug = 1; + else if (strcmp(p + 1, "gc") == 0) + global.params.symdebug = 2; else if (strcmp(p + 1, "v") == 0) global.params.verbose = 1; else if (strcmp(p + 1, "vv") == 0) { diff -r 67fcd9df8b79 -r 8e6135be6999 gen/todebug.cpp --- a/gen/todebug.cpp Sun Nov 30 20:41:17 2008 +0100 +++ b/gen/todebug.cpp Mon Dec 01 02:10:16 2008 +0100 @@ -134,7 +134,10 @@ vals[0] = DBG_TAG(DW_TAG_compile_unit); vals[1] = DBG_CAST(getDwarfAnchor(DW_TAG_compile_unit)); - vals[2] = DtoConstUint(DW_LANG_C);// _D)); // doesn't seem to work + if (global.params.symdebug == 2) + vals[2] = DtoConstUint(DW_LANG_C); + else + vals[2] = DtoConstUint(DW_LANG_D); vals[3] = DtoConstStringPtr(FileName::name(m->srcfile->name->toChars()), "llvm.metadata"); std::string srcpath(FileName::path(m->srcfile->name->toChars())); if (!FileName::absolute(srcpath.c_str())) { diff -r 67fcd9df8b79 -r 8e6135be6999 gen/tollvm.cpp --- a/gen/tollvm.cpp Sun Nov 30 20:41:17 2008 +0100 +++ b/gen/tollvm.cpp Mon Dec 01 02:10:16 2008 +0100 @@ -673,6 +673,11 @@ return llvm::ConstantPointerNull::get(pt); } +LLConstant* getNullValue(const LLType* t) +{ + return LLConstant::getNullValue(t); +} + ////////////////////////////////////////////////////////////////////////////////////////// size_t getTypeBitSize(const LLType* t) diff -r 67fcd9df8b79 -r 8e6135be6999 gen/tollvm.h --- a/gen/tollvm.h Sun Nov 30 20:41:17 2008 +0100 +++ b/gen/tollvm.h Mon Dec 01 02:10:16 2008 +0100 @@ -87,6 +87,7 @@ const LLPointerType* getPtrToType(const LLType* t); const LLPointerType* getVoidPtrType(); llvm::ConstantPointerNull* getNullPtr(const LLType* t); +LLConstant* getNullValue(const LLType* t); // type sizes size_t getTypeBitSize(const LLType* t); diff -r 67fcd9df8b79 -r 8e6135be6999 gen/toobj.cpp --- a/gen/toobj.cpp Sun Nov 30 20:41:17 2008 +0100 +++ b/gen/toobj.cpp Mon Dec 01 02:10:16 2008 +0100 @@ -679,18 +679,20 @@ void Module::genmoduleinfo() { -// The layout is: -// { -// void **vptr; -// monitor_t monitor; -// char[] name; // class name -// ModuleInfo importedModules[]; -// ClassInfo localClasses[]; -// uint flags; // initialization state -// void *ctor; -// void *dtor; -// void *unitTest; -// } +// The layout is: +// { +// char[] name; +// ModuleInfo[] importedModules; +// ClassInfo[] localClasses; +// uint flags; +// +// void function() ctor; +// void function() dtor; +// void function() unitTest; +// +// void* xgetMembers; +// void function() ictor; +// } // resolve ModuleInfo assert(moduleinfo); @@ -705,7 +707,6 @@ // moduleinfo llvm struct type const llvm::StructType* moduleinfoTy = isaStruct(moduleinfo->type->ir.type->get()); - // classinfo llvm struct type const llvm::StructType* classinfoTy = isaStruct(ClassDeclaration::classinfo->type->ir.type->get()); @@ -733,16 +734,15 @@ { Module *m = (Module *)aimports.data[i]; if (!m->needModuleInfo()) - aimports_dim--; - else { // declare - // create name - std::string m_name("_D"); - m_name.append(m->mangle()); - m_name.append("8__ModuleZ"); - llvm::GlobalVariable* m_gvar = gIR->module->getGlobalVariable(m_name); - if (!m_gvar) m_gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, NULL, m_name, gIR->module); - importInits.push_back(m_gvar); - } + continue; + + // declare the imported module info + std::string m_name("_D"); + m_name.append(m->mangle()); + m_name.append("8__ModuleZ"); + llvm::GlobalVariable* m_gvar = gIR->module->getGlobalVariable(m_name); + if (!m_gvar) m_gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, NULL, m_name, gIR->module); + importInits.push_back(m_gvar); } // has import array? if (!importInits.empty()) @@ -758,7 +758,7 @@ c = DtoConstSlice(DtoConstSize_t(importInits.size()), c); } else - c = moduleinfo->ir.irStruct->constInit->getOperand(3); + c = DtoConstSlice( DtoConstSize_t(0), getNullValue(getPtrToType(moduleinfoTy)) ); initVec.push_back(c); // localClasses[] @@ -789,7 +789,7 @@ } Logger::println("class: %s", cd->toPrettyChars()); assert(cd->ir.irStruct->classInfo); - c = llvm::ConstantExpr::getBitCast(cd->ir.irStruct->classInfo, getPtrToType(classinfoTy)); + c = DtoBitCast(cd->ir.irStruct->classInfo, getPtrToType(classinfoTy)); classInits.push_back(c); } // has class array? @@ -802,11 +802,11 @@ m_name.append("9__classesZ"); assert(gIR->module->getGlobalVariable(m_name) == NULL); llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); - c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(classArrTy->getElementType())); + c = DtoBitCast(m_gvar, getPtrToType(classinfoTy)); c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); } else - c = moduleinfo->ir.irStruct->constInit->getOperand(4); + c = DtoConstSlice( DtoConstSize_t(0), getNullValue(getPtrToType(classinfoTy)) ); initVec.push_back(c); // flags @@ -815,27 +815,30 @@ c = DtoConstUint(4); // flags (4 means MIstandalone) initVec.push_back(c); + // function pointer type for next three fields + const LLType* fnptrTy = getPtrToType(LLFunctionType::get(LLType::VoidTy, std::vector(), false)); + // ctor llvm::Function* fctor = build_module_ctor(); - c = fctor ? fctor : moduleinfo->ir.irStruct->constInit->getOperand(6); + c = fctor ? fctor : getNullValue(fnptrTy); initVec.push_back(c); // dtor llvm::Function* fdtor = build_module_dtor(); - c = fdtor ? fdtor : moduleinfo->ir.irStruct->constInit->getOperand(7); + c = fdtor ? fdtor : getNullValue(fnptrTy); initVec.push_back(c); // unitTest llvm::Function* unittest = build_module_unittest(); - c = unittest ? unittest : moduleinfo->ir.irStruct->constInit->getOperand(8); + c = unittest ? unittest : getNullValue(fnptrTy); initVec.push_back(c); // xgetMembers - c = moduleinfo->ir.irStruct->constInit->getOperand(9); + c = getNullValue(getVoidPtrType()); initVec.push_back(c); // ictor - c = moduleinfo->ir.irStruct->constInit->getOperand(10); + c = getNullValue(fnptrTy); initVec.push_back(c); /*Logger::println("MODULE INFO INITIALIZERS");