Mercurial > projects > ldc
changeset 246:b604c56945b0 trunk
[svn r263] Changed *** ATTENTION *** to warnings.
Implemented debug info for dynamic arrays, start of general composite support.
author | lindquist |
---|---|
date | Mon, 09 Jun 2008 15:52:22 +0200 |
parents | d61ce72c39ab |
children | 56199753e637 |
files | gen/logger.cpp gen/todebug.cpp gen/tollvm.cpp llvmdc.kdevelop.filelist tangotests/debug6.d |
diffstat | 5 files changed, 236 insertions(+), 66 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/logger.cpp Mon Jun 09 12:43:16 2008 +0200 +++ b/gen/logger.cpp Mon Jun 09 15:52:22 2008 +0200 @@ -71,7 +71,7 @@ } void attention(const Loc& loc, const char* fmt,...) { - printf("***ATTENTION***: %s: ", loc.toChars()); + printf("Warning: %s: ", loc.toChars()); va_list va; va_start(va,fmt); vprintf(fmt,va);
--- a/gen/todebug.cpp Mon Jun 09 12:43:16 2008 +0200 +++ b/gen/todebug.cpp Mon Jun 09 15:52:22 2008 +0200 @@ -15,22 +15,9 @@ using namespace llvm::dwarf; -static const llvm::PointerType* ptrTy(const LLType* t) -{ - return llvm::PointerType::get(t, 0); -} - -static const llvm::PointerType* dbgArrTy() -{ - return ptrTy(llvm::StructType::get(NULL,NULL)); -} - -static LLConstant* dbgToArrTy(LLConstant* c) -{ - return llvm::ConstantExpr::getBitCast(c, dbgArrTy()); -} - -#define Ty(X) LLType::X +#define DBG_NULL ( LLConstant::getNullValue(DBG_TYPE) ) +#define DBG_TYPE ( getPtrToType(llvm::StructType::get(NULL,NULL)) ) +#define DBG_CAST(X) ( llvm::ConstantExpr::getBitCast(X, DBG_TYPE) ) ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -100,26 +87,30 @@ ////////////////////////////////////////////////////////////////////////////////////////////////// -static const llvm::StructType* GetDwarfCompileUnitType() { +static const llvm::StructType* getDwarfCompileUnitType() { return isaStruct(gIR->module->getTypeByName("llvm.dbg.compile_unit.type")); } -static const llvm::StructType* GetDwarfSubProgramType() { +static const llvm::StructType* getDwarfSubProgramType() { return isaStruct(gIR->module->getTypeByName("llvm.dbg.subprogram.type")); } -static const llvm::StructType* GetDwarfVariableType() { +static const llvm::StructType* getDwarfVariableType() { return isaStruct(gIR->module->getTypeByName("llvm.dbg.variable.type")); } -static const llvm::StructType* GetDwarfDerivedTypeType() { +static const llvm::StructType* getDwarfDerivedTypeType() { return isaStruct(gIR->module->getTypeByName("llvm.dbg.derivedtype.type")); } -static const llvm::StructType* GetDwarfBasicTypeType() { +static const llvm::StructType* getDwarfBasicTypeType() { return isaStruct(gIR->module->getTypeByName("llvm.dbg.basictype.type")); } +static const llvm::StructType* getDwarfCompositeTypeType() { + return isaStruct(gIR->module->getTypeByName("llvm.dbg.compositetype.type")); +} + ////////////////////////////////////////////////////////////////////////////////////////////////// LLGlobalVariable* DtoDwarfCompileUnit(Module* m) @@ -140,7 +131,7 @@ vals.push_back(llvm::ConstantExpr::getAdd( DtoConstUint(DW_TAG_compile_unit), DtoConstUint(llvm::LLVMDebugVersion))); - vals.push_back(dbgToArrTy(GetDwarfAnchor(DW_TAG_compile_unit))); + vals.push_back(DBG_CAST(GetDwarfAnchor(DW_TAG_compile_unit))); vals.push_back(DtoConstUint(DW_LANG_C));// _D)); // doesn't seem to work vals.push_back(DtoConstStringPtr(m->srcfile->name->toChars(), "llvm.metadata")); @@ -153,9 +144,9 @@ vals.push_back(DtoConstStringPtr(srcpath.c_str(), "llvm.metadata")); vals.push_back(DtoConstStringPtr("LLVMDC (http://www.dsource.org/projects/llvmdc)", "llvm.metadata")); - c = llvm::ConstantStruct::get(GetDwarfCompileUnitType(), vals); + c = llvm::ConstantStruct::get(getDwarfCompileUnitType(), vals); - llvm::GlobalVariable* gv = new llvm::GlobalVariable(GetDwarfCompileUnitType(), true, llvm::GlobalValue::InternalLinkage, c, "llvm.dbg.compile_unit", gIR->module); + llvm::GlobalVariable* gv = new llvm::GlobalVariable(c->getType(), true, llvm::GlobalValue::InternalLinkage, c, "llvm.dbg.compile_unit", gIR->module); gv->setSection("llvm.metadata"); m->ir.irModule->dwarfCompileUnit = gv; @@ -170,19 +161,19 @@ vals.push_back(llvm::ConstantExpr::getAdd( DtoConstUint(DW_TAG_subprogram), DtoConstUint(llvm::LLVMDebugVersion))); - vals.push_back(dbgToArrTy(GetDwarfAnchor(DW_TAG_subprogram))); + vals.push_back(DBG_CAST(GetDwarfAnchor(DW_TAG_subprogram))); - vals.push_back(dbgToArrTy(compileUnit)); + vals.push_back(DBG_CAST(compileUnit)); vals.push_back(DtoConstStringPtr(fd->toPrettyChars(), "llvm.metadata")); vals.push_back(vals.back()); vals.push_back(DtoConstStringPtr(fd->mangle(), "llvm.metadata")); - vals.push_back(dbgToArrTy(compileUnit)); + vals.push_back(DBG_CAST(compileUnit)); vals.push_back(DtoConstUint(fd->loc.linnum)); - vals.push_back(llvm::ConstantPointerNull::get(dbgArrTy())); + vals.push_back(DBG_NULL); vals.push_back(DtoConstBool(fd->protection == PROTprivate)); vals.push_back(DtoConstBool(fd->getModule() == gIR->dmodule)); - LLConstant* c = llvm::ConstantStruct::get(GetDwarfSubProgramType(), vals); + LLConstant* c = llvm::ConstantStruct::get(getDwarfSubProgramType(), vals); llvm::GlobalVariable* gv = new llvm::GlobalVariable(c->getType(), true, llvm::GlobalValue::InternalLinkage, c, "llvm.dbg.subprogram", gIR->module); gv->setSection("llvm.metadata"); return gv; @@ -193,13 +184,13 @@ void DtoDwarfFuncStart(FuncDeclaration* fd) { assert(fd->ir.irFunc->dwarfSubProg); - gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), dbgToArrTy(fd->ir.irFunc->dwarfSubProg)); + gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(fd->ir.irFunc->dwarfSubProg)); } void DtoDwarfFuncEnd(FuncDeclaration* fd) { assert(fd->ir.irFunc->dwarfSubProg); - gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), dbgToArrTy(fd->ir.irFunc->dwarfSubProg)); + gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(fd->ir.irFunc->dwarfSubProg)); } ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -210,44 +201,53 @@ args.push_back(DtoConstUint(ln)); args.push_back(DtoConstUint(0)); FuncDeclaration* fd = gIR->func()->decl; - args.push_back(dbgToArrTy(DtoDwarfCompileUnit(fd->getModule()))); + args.push_back(DBG_CAST(DtoDwarfCompileUnit(fd->getModule()))); gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.stoppoint"), args.begin(), args.end()); } ////////////////////////////////////////////////////////////////////////////////////////////////// -static LLGlobalVariable* DtoDwarfTypeDescription(Loc loc, Type* type, LLGlobalVariable* cu); +static LLGlobalVariable* dwarfTypeDescription(Loc loc, Type* type, LLGlobalVariable* cu, const char* c_name); ////////////////////////////////////////////////////////////////////////////////////////////////// -static LLGlobalVariable* DtoDwarfBasicType(Type* type, llvm::GlobalVariable* compileUnit) +static LLGlobalVariable* dwarfBasicType(Type* type, llvm::GlobalVariable* compileUnit) { Type* t = type->toBasetype(); - const LLType* T = DtoType(type); std::vector<LLConstant*> vals; + // tag vals.push_back(llvm::ConstantExpr::getAdd( DtoConstUint(DW_TAG_base_type), DtoConstUint(llvm::LLVMDebugVersion))); + // context - vals.push_back(dbgToArrTy(compileUnit)); + vals.push_back(DBG_CAST(compileUnit)); + // name vals.push_back(DtoConstStringPtr(type->toChars(), "llvm.metadata")); + // compile unit where defined - vals.push_back(getNullPtr(dbgArrTy())); + vals.push_back(DBG_NULL); + // line number where defined vals.push_back(DtoConstInt(0)); + // size in bits vals.push_back(LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false)); + // alignment in bits vals.push_back(LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false)); + // offset in bits vals.push_back(LLConstantInt::get(LLType::Int64Ty, 0, false)); + // FIXME: dont know what this is vals.push_back(DtoConstUint(0)); + // dwarf type unsigned id; if (t->isintegral()) @@ -267,7 +267,7 @@ } vals.push_back(DtoConstUint(id)); - LLConstant* c = llvm::ConstantStruct::get(GetDwarfBasicTypeType(), vals); + LLConstant* c = llvm::ConstantStruct::get(getDwarfBasicTypeType(), vals); LLGlobalVariable* gv = new LLGlobalVariable(c->getType(), true, LLGlobalValue::InternalLinkage, c, "llvm.dbg.basictype", gIR->module); gv->setSection("llvm.metadata"); return gv; @@ -275,7 +275,7 @@ ////////////////////////////////////////////////////////////////////////////////////////////////// -static LLGlobalVariable* DtoDwarfDerivedType(Loc loc, Type* type, llvm::GlobalVariable* compileUnit) +static LLGlobalVariable* dwarfDerivedType(Loc loc, Type* type, llvm::GlobalVariable* compileUnit) { const LLType* T = DtoType(type); Type* t = DtoDType(type); @@ -295,35 +295,45 @@ } std::vector<LLConstant*> vals; + // tag vals.push_back(llvm::ConstantExpr::getAdd( DtoConstUint(tag), DtoConstUint(llvm::LLVMDebugVersion))); + // context - vals.push_back(dbgToArrTy(compileUnit)); + vals.push_back(DBG_CAST(compileUnit)); + // name vals.push_back(name); + // compile unit where defined - vals.push_back(getNullPtr(dbgArrTy())); + vals.push_back(DBG_NULL); + // line number where defined vals.push_back(DtoConstInt(0)); + // size in bits vals.push_back(LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false)); + // alignment in bits vals.push_back(LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false)); + // offset in bits vals.push_back(LLConstantInt::get(LLType::Int64Ty, 0, false)); + // FIXME: dont know what this is vals.push_back(DtoConstUint(0)); + // base type Type* nt = t->nextOf(); - LLGlobalVariable* nTD = DtoDwarfTypeDescription(loc, nt, compileUnit); + LLGlobalVariable* nTD = dwarfTypeDescription(loc, nt, compileUnit, NULL); if (nt->ty == Tvoid || !nTD) - vals.push_back(getNullPtr(dbgArrTy())); + vals.push_back(DBG_NULL); else - vals.push_back(dbgToArrTy(nTD)); + vals.push_back(DBG_CAST(nTD)); - LLConstant* c = llvm::ConstantStruct::get(GetDwarfDerivedTypeType(), vals); + LLConstant* c = llvm::ConstantStruct::get(getDwarfDerivedTypeType(), vals); LLGlobalVariable* gv = new LLGlobalVariable(c->getType(), true, LLGlobalValue::InternalLinkage, c, "llvm.dbg.derivedtype", gIR->module); gv->setSection("llvm.metadata"); return gv; @@ -331,7 +341,152 @@ ////////////////////////////////////////////////////////////////////////////////////////////////// -static LLGlobalVariable* DtoDwarfVariable(VarDeclaration* vd, LLGlobalVariable* typeDescr) +static LLGlobalVariable* dwarfMemberType(Loc loc, Type* type, llvm::GlobalVariable* compileUnit, const char* c_name, unsigned offset) +{ + const LLType* T = DtoType(type); + Type* t = DtoDType(type); + + // defaults + LLConstant* name; + if (c_name) + name = DtoConstStringPtr(c_name, "llvm.metadata"); + else + name = getNullPtr(getVoidPtrType()); + + std::vector<LLConstant*> vals; + + // tag + vals.push_back(llvm::ConstantExpr::getAdd( + DtoConstUint(llvm::dwarf::DW_TAG_member), + DtoConstUint(llvm::LLVMDebugVersion))); + + // context + vals.push_back(DBG_CAST(compileUnit)); + + // name + vals.push_back(name); + + // compile unit where defined + vals.push_back(DBG_NULL); + + // line number where defined + vals.push_back(DtoConstInt(0)); + + // size in bits + vals.push_back(LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false)); + + // alignment in bits + vals.push_back(LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false)); + + // offset in bits + vals.push_back(LLConstantInt::get(LLType::Int64Ty, offset*8, false)); + + // FIXME: dont know what this is + vals.push_back(DtoConstUint(0)); + + // base type + LLGlobalVariable* nTD = dwarfTypeDescription(loc, t, compileUnit, NULL); + if (t->ty == Tvoid || !nTD) + vals.push_back(DBG_NULL); + else + vals.push_back(DBG_CAST(nTD)); + + LLConstant* c = llvm::ConstantStruct::get(getDwarfDerivedTypeType(), vals); + LLGlobalVariable* gv = new LLGlobalVariable(c->getType(), true, LLGlobalValue::InternalLinkage, c, "llvm.dbg.derivedtype", gIR->module); + gv->setSection("llvm.metadata"); + return gv; +} + +////////////////////////////////////////////////////////////////////////////////////////////////// + +static LLGlobalVariable* dwarfCompositeType(Loc loc, Type* type, llvm::GlobalVariable* compileUnit) +{ + const LLType* T = DtoType(type); + Type* t = DtoDType(type); + + // defaults + LLConstant* name = getNullPtr(getVoidPtrType()); + LLGlobalVariable* members = NULL; + + // find tag + unsigned tag; + if (t->ty == Tarray) + { + tag = llvm::dwarf::DW_TAG_structure_type; + + LLGlobalVariable* len = dwarfMemberType(loc, Type::tsize_t, compileUnit, "length", 0); + assert(len); + LLGlobalVariable* ptr = dwarfMemberType(loc, t->nextOf()->pointerTo(), compileUnit, "ptr", global.params.is64bit?8:4); + assert(ptr); + + const LLArrayType* at = LLArrayType::get(DBG_TYPE, 2); + + std::vector<LLConstant*> elems; + elems.push_back(DBG_CAST(len)); + elems.push_back(DBG_CAST(ptr)); + +// elems[0]->dump(); +// elems[1]->dump(); +// at->dump(); + + LLConstant* ca = LLConstantArray::get(at, elems); + members = new LLGlobalVariable(ca->getType(), true, LLGlobalValue::InternalLinkage, ca, ".array", gIR->module); + members->setSection("llvm.metadata"); + } + else + { + assert(0 && "unsupported compositetype for debug info"); + } + + std::vector<LLConstant*> vals; + + // tag + vals.push_back(llvm::ConstantExpr::getAdd( + DtoConstUint(tag), + DtoConstUint(llvm::LLVMDebugVersion))); + + // context + vals.push_back(DBG_CAST(compileUnit)); + + // name + vals.push_back(name); + + // compile unit where defined + vals.push_back(DBG_NULL); + + // line number where defined + vals.push_back(DtoConstInt(0)); + + // size in bits + vals.push_back(LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false)); + + // alignment in bits + vals.push_back(LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false)); + + // offset in bits + vals.push_back(LLConstantInt::get(LLType::Int64Ty, 0, false)); + + // FIXME: dont know what this is + vals.push_back(DtoConstUint(0)); + + // FIXME: ditto + vals.push_back(DBG_NULL); + + // members array + if (members) + vals.push_back(DBG_CAST(members)); + else + vals.push_back(DBG_NULL); + + LLConstant* c = llvm::ConstantStruct::get(getDwarfCompositeTypeType(), vals); + LLGlobalVariable* gv = new LLGlobalVariable(c->getType(), true, LLGlobalValue::InternalLinkage, c, "llvm.dbg.compositetype", gIR->module); + gv->setSection("llvm.metadata"); + return gv; +} + +////////////////////////////////////////////////////////////////////////////////////////////////// + +static LLGlobalVariable* dwarfVariable(VarDeclaration* vd, LLGlobalVariable* typeDescr) { unsigned tag; if (vd->isParameter()) @@ -347,17 +502,17 @@ DtoConstUint(tag), DtoConstUint(llvm::LLVMDebugVersion))); // context - vals.push_back(dbgToArrTy(gIR->func()->dwarfSubProg)); + vals.push_back(DBG_CAST(gIR->func()->dwarfSubProg)); // name vals.push_back(DtoConstStringPtr(vd->toChars(), "llvm.metadata")); // compile unit where defined - vals.push_back(dbgToArrTy(DtoDwarfCompileUnit(vd->getModule()))); + vals.push_back(DBG_CAST(DtoDwarfCompileUnit(vd->getModule()))); // line number where defined vals.push_back(DtoConstUint(vd->loc.linnum)); // type descriptor - vals.push_back(dbgToArrTy(typeDescr)); + vals.push_back(DBG_CAST(typeDescr)); - LLConstant* c = llvm::ConstantStruct::get(GetDwarfVariableType(), vals); + LLConstant* c = llvm::ConstantStruct::get(getDwarfVariableType(), vals); LLGlobalVariable* gv = new LLGlobalVariable(c->getType(), true, LLGlobalValue::InternalLinkage, c, "llvm.dbg.variable", gIR->module); gv->setSection("llvm.metadata"); return gv; @@ -365,28 +520,35 @@ ////////////////////////////////////////////////////////////////////////////////////////////////// -static void DtoDwarfDeclare(LLValue* var, LLGlobalVariable* varDescr) +static void dwarfDeclare(LLValue* var, LLGlobalVariable* varDescr) { LLSmallVector<LLValue*,2> args; - args.push_back(DtoBitCast(var, dbgArrTy())); - args.push_back(dbgToArrTy(varDescr)); + args.push_back(DtoBitCast(var, DBG_TYPE)); + args.push_back(DBG_CAST(varDescr)); gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.declare"), args.begin(), args.end()); } ////////////////////////////////////////////////////////////////////////////////////////////////// -static LLGlobalVariable* DtoDwarfTypeDescription(Loc loc, Type* type, LLGlobalVariable* cu) +static LLGlobalVariable* dwarfTypeDescription(Loc loc, Type* type, LLGlobalVariable* cu, const char* c_name) { Type* t = type->toBasetype(); - if (t->isintegral() || t->isfloating()) - return DtoDwarfBasicType(type, cu); + if (t->ty == Tvoid) + return NULL; + else if (t->isintegral() || t->isfloating()) + return dwarfBasicType(type, cu); else if (t->ty == Tpointer) - return DtoDwarfDerivedType(loc, type, cu); + return dwarfDerivedType(loc, type, cu); + else if (t->ty == Tarray) + return dwarfCompositeType(loc, type, cu); - Logger::attention(loc, "unsupport type for debug info: %s", type->toChars()); + if (global.params.warnings) + warning("%s: unsupported type for debug info: %s", loc.toChars(), type->toChars()); return NULL; } +////////////////////////////////////////////////////////////////////////////////////////////////// + void DtoDwarfLocalVariable(LLValue* ll, VarDeclaration* vd) { // get compile units @@ -397,16 +559,16 @@ // get type description Type* t = vd->type->toBasetype(); - LLGlobalVariable* TD = DtoDwarfTypeDescription(vd->loc, vd->type, thisCU); + LLGlobalVariable* TD = dwarfTypeDescription(vd->loc, vd->type, thisCU, NULL); if (TD == NULL) return; // unsupported // get variable description LLGlobalVariable* VD; - VD = DtoDwarfVariable(vd, TD); + VD = dwarfVariable(vd, TD); // declare - DtoDwarfDeclare(ll, VD); + dwarfDeclare(ll, VD); }
--- a/gen/tollvm.cpp Mon Jun 09 12:43:16 2008 +0200 +++ b/gen/tollvm.cpp Mon Jun 09 15:52:22 2008 +0200 @@ -504,7 +504,7 @@ std::string s(str); LLConstant* init = llvm::ConstantArray::get(s, true); llvm::GlobalVariable* gvar = new llvm::GlobalVariable( - init->getType(), true,llvm::GlobalValue::InternalLinkage, init, "stringliteral", gIR->module); + init->getType(), true,llvm::GlobalValue::InternalLinkage, init, ".str", gIR->module); LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) }; return DtoConstSlice( DtoConstSize_t(s.length()), @@ -516,7 +516,7 @@ std::string s(str); LLConstant* init = llvm::ConstantArray::get(s, true); llvm::GlobalVariable* gvar = new llvm::GlobalVariable( - init->getType(), true,llvm::GlobalValue::InternalLinkage, init, "stringliteral", gIR->module); + init->getType(), true,llvm::GlobalValue::InternalLinkage, init, ".str", gIR->module); if (section) gvar->setSection(section); LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) }; return llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2);
--- a/llvmdc.kdevelop.filelist Mon Jun 09 12:43:16 2008 +0200 +++ b/llvmdc.kdevelop.filelist Mon Jun 09 15:52:22 2008 +0200 @@ -116,8 +116,6 @@ gen/enums.h gen/functions.cpp gen/functions.h -gen/intrinsics.cpp -gen/intrinsics.h gen/irstate.cpp gen/irstate.h gen/linker.h @@ -769,6 +767,7 @@ tangotests/debug3.d tangotests/debug4.d tangotests/debug5.d +tangotests/debug6.d tangotests/e.d tangotests/f.d tangotests/files1.d