diff gen/todebug.cpp @ 268:23d0d9855cad trunk

[svn r289] Fixed: right shift >> was broken for unsigned types. Fixed: debug info for classes now started.
author lindquist
date Sun, 15 Jun 2008 18:52:27 +0200
parents e3355ce5444b
children 297690b5d4a5
line wrap: on
line diff
--- a/gen/todebug.cpp	Sun Jun 15 18:37:23 2008 +0200
+++ b/gen/todebug.cpp	Sun Jun 15 18:52:27 2008 +0200
@@ -129,20 +129,20 @@
 
 static LLGlobalVariable* dwarfCompileUnit(Module* m)
 {
-    std::vector<LLConstant*> vals;
-    vals.push_back(DBG_TAG(DW_TAG_compile_unit));
-    vals.push_back(DBG_CAST(getDwarfAnchor(DW_TAG_compile_unit)));
+    std::vector<LLConstant*> vals(6);
+    vals[0] = DBG_TAG(DW_TAG_compile_unit);
+    vals[1] = 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"));
+    vals[2] = DtoConstUint(DW_LANG_C);// _D)); // doesn't seem to work
+    vals[3] = DtoConstStringPtr(m->srcfile->name->toChars(), "llvm.metadata");
     std::string srcpath(FileName::path(m->srcfile->name->toChars()));
     if (srcpath.empty()) {
         const char* str = get_current_dir_name();
         assert(str != NULL);
         srcpath = str;
     }
-    vals.push_back(DtoConstStringPtr(srcpath.c_str(), "llvm.metadata"));
-    vals.push_back(DtoConstStringPtr("LLVMDC (http://www.dsource.org/projects/llvmdc)", "llvm.metadata"));
+    vals[4] = DtoConstStringPtr(srcpath.c_str(), "llvm.metadata");
+    vals[5] = DtoConstStringPtr("LLVMDC (http://www.dsource.org/projects/llvmdc)", "llvm.metadata");
 
     LLGlobalVariable* gv = emitDwarfGlobal(getDwarfCompileUnitType(), vals, "llvm.dbg.compile_unit");
     m->ir.irModule->dwarfCompileUnit = gv;
@@ -153,25 +153,28 @@
 
 static LLGlobalVariable* dwarfSubProgram(FuncDeclaration* fd, llvm::GlobalVariable* compileUnit)
 {
-    std::vector<LLConstant*> vals;
-    vals.push_back(DBG_TAG(DW_TAG_subprogram));
-    vals.push_back(DBG_CAST(getDwarfAnchor(DW_TAG_subprogram)));
+    std::vector<LLConstant*> vals(11);
+    vals[0] = DBG_TAG(DW_TAG_subprogram);
+    vals[1] = DBG_CAST(getDwarfAnchor(DW_TAG_subprogram));
 
-    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(DBG_CAST( DtoDwarfCompileUnit(fd->getModule()) ));
-    vals.push_back(DtoConstUint(fd->loc.linnum));
-    vals.push_back(DBG_NULL);
-    vals.push_back(DtoConstBool(fd->protection == PROTprivate));
-    vals.push_back(DtoConstBool(fd->getModule() == gIR->dmodule));
+    vals[2] = DBG_CAST(compileUnit);
+    vals[3] = DtoConstStringPtr(fd->toPrettyChars(), "llvm.metadata");
+    vals[4] = vals[3];
+    vals[5] = DtoConstStringPtr(fd->mangle(), "llvm.metadata");
+    vals[6] = DBG_CAST( DtoDwarfCompileUnit(fd->getModule()) );
+    vals[7] = DtoConstUint(fd->loc.linnum);
+    vals[8] = DBG_NULL;
+    vals[9] = DtoConstBool(fd->protection == PROTprivate);
+    vals[10] = DtoConstBool(fd->getModule() == gIR->dmodule);
+
+    Logger::println("emitting subprogram global");
 
     return emitDwarfGlobal(getDwarfSubProgramType(), vals, "llvm.dbg.subprogram");
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
+static LLGlobalVariable* dwarfTypeDescription_impl(Type* type, LLGlobalVariable* cu, const char* c_name);
 static LLGlobalVariable* dwarfTypeDescription(Type* type, LLGlobalVariable* cu, const char* c_name);
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
@@ -182,34 +185,34 @@
 
     const LLType* T = DtoType(type);
 
-    std::vector<LLConstant*> vals;
+    std::vector<LLConstant*> vals(10);
 
     // tag
-    vals.push_back(DBG_TAG(DW_TAG_base_type));
+    vals[0] = DBG_TAG(DW_TAG_base_type);
 
     // context
-    vals.push_back(DBG_CAST(compileUnit));
+    vals[1] = DBG_CAST(compileUnit);
 
     // name
-    vals.push_back(DtoConstStringPtr(type->toChars(), "llvm.metadata"));
+    vals[2] = DtoConstStringPtr(type->toChars(), "llvm.metadata");
 
     // compile unit where defined
-    vals.push_back(DBG_NULL);
+    vals[3] = DBG_NULL;
 
     // line number where defined
-    vals.push_back(DtoConstInt(0));
+    vals[4] = DtoConstInt(0);
 
     // size in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false));
+    vals[5] = LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false);
 
     // alignment in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false));
+    vals[6] = LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false);
 
     // offset in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, 0, false));
+    vals[7] = LLConstantInt::get(LLType::Int64Ty, 0, false);
 
     // FIXME: dont know what this is
-    vals.push_back(DtoConstUint(0));
+    vals[8] = DtoConstUint(0);
 
     // dwarf type
     unsigned id;
@@ -228,7 +231,7 @@
     {
         assert(0 && "unsupported basictype for debug info");
     }
-    vals.push_back(DtoConstUint(id));
+    vals[9] = DtoConstUint(id);
 
     return emitDwarfGlobal(getDwarfBasicTypeType(), vals, "llvm.dbg.basictype");
 }
@@ -254,42 +257,42 @@
         assert(0 && "unsupported derivedtype for debug info");
     }
 
-    std::vector<LLConstant*> vals;
+    std::vector<LLConstant*> vals(10);
 
     // tag
-    vals.push_back(DBG_TAG(tag));
+    vals[0] = DBG_TAG(tag);
 
     // context
-    vals.push_back(DBG_CAST(compileUnit));
+    vals[1] = DBG_CAST(compileUnit);
 
     // name
-    vals.push_back(name);
+    vals[2] = name;
 
     // compile unit where defined
-    vals.push_back(DBG_NULL);
+    vals[3] = DBG_NULL;
 
     // line number where defined
-    vals.push_back(DtoConstInt(0));
+    vals[4] = DtoConstInt(0);
 
     // size in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false));
+    vals[5] = LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false);
 
     // alignment in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false));
+    vals[6] = LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false);
 
     // offset in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, 0, false));
+    vals[7] = LLConstantInt::get(LLType::Int64Ty, 0, false);
 
     // FIXME: dont know what this is
-    vals.push_back(DtoConstUint(0));
+    vals[8] = DtoConstUint(0);
 
     // base type
     Type* nt = t->nextOf();
-    LLGlobalVariable* nTD = dwarfTypeDescription(nt, compileUnit, NULL);
+    LLGlobalVariable* nTD = dwarfTypeDescription_impl(nt, compileUnit, NULL);
     if (nt->ty == Tvoid || !nTD)
-        vals.push_back(DBG_NULL);
+        vals[9] = DBG_NULL;
     else
-        vals.push_back(DBG_CAST(nTD));
+        vals[9] = DBG_CAST(nTD);
 
     return emitDwarfGlobal(getDwarfDerivedTypeType(), vals, "llvm.dbg.derivedtype");
 }
@@ -308,44 +311,44 @@
     else
         name = getNullPtr(getVoidPtrType());
 
-    std::vector<LLConstant*> vals;
+    std::vector<LLConstant*> vals(10);
 
     // tag
-    vals.push_back(DBG_TAG(DW_TAG_member));
+    vals[0] = DBG_TAG(DW_TAG_member);
 
     // context
-    vals.push_back(DBG_CAST(compileUnit));
+    vals[1] = DBG_CAST(compileUnit);
 
     // name
-    vals.push_back(name);
+    vals[2] = name;
 
     // compile unit where defined
     if (definedCU)
-        vals.push_back(DBG_CAST(definedCU));
+        vals[3] = DBG_CAST(definedCU);
     else
-        vals.push_back(DBG_NULL);
+        vals[3] = DBG_NULL;
 
     // line number where defined
-    vals.push_back(DtoConstInt(linnum));
+    vals[4] = DtoConstInt(linnum);
 
     // size in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false));
+    vals[5] = LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false);
 
     // alignment in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false));
+    vals[6] = LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false);
 
     // offset in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, offset*8, false));
+    vals[7] = LLConstantInt::get(LLType::Int64Ty, offset*8, false);
 
     // FIXME: dont know what this is
-    vals.push_back(DtoConstUint(0));
+    vals[8] = DtoConstUint(0);
 
     // base type
     LLGlobalVariable* nTD = dwarfTypeDescription(t, compileUnit, NULL);
     if (t->ty == Tvoid || !nTD)
-        vals.push_back(DBG_NULL);
+        vals[9] = DBG_NULL;
     else
-        vals.push_back(DBG_CAST(nTD));
+        vals[9] = DBG_CAST(nTD);
 
     return emitDwarfGlobal(getDwarfDerivedTypeType(), vals, "llvm.dbg.derivedtype");
 }
@@ -381,9 +384,9 @@
 
         const LLArrayType* at = LLArrayType::get(DBG_TYPE, 2);
 
-        std::vector<LLConstant*> elems;
-        elems.push_back(DBG_CAST(len));
-        elems.push_back(DBG_CAST(ptr));
+        std::vector<LLConstant*> elems(2);
+        elems[0] = DBG_CAST(len);
+        elems[1] = DBG_CAST(ptr);
 
         LLConstant* ca = LLConstantArray::get(at, elems);
         members = new LLGlobalVariable(ca->getType(), true, LLGlobalValue::InternalLinkage, ca, ".array", gIR->module);
@@ -392,11 +395,20 @@
         name = DtoConstStringPtr(t->toChars(), "llvm.metadata");
     }
 
-    // struct
-    else if (t->ty == Tstruct)
+    // struct/class
+    else if (t->ty == Tstruct || t->ty == Tclass)
     {
-        TypeStruct* ts = (TypeStruct*)t;
-        StructDeclaration* sd = ts->sym;
+        AggregateDeclaration* sd;
+        if (t->ty == Tstruct)
+        {
+            TypeStruct* ts = (TypeStruct*)t;
+            sd = ts->sym;
+        }
+        else
+        {
+            TypeClass* tc = (TypeClass*)t;
+            sd = tc->sym;
+        }
         assert(sd);
 
         IrStruct* ir = sd->ir.irStruct;
@@ -415,6 +427,7 @@
         definedCU = DtoDwarfCompileUnit(sd->getModule());
 
         std::vector<LLConstant*> elems;
+        elems.reserve(ir->offsets.size());
         for (IrStruct::OffsetMap::iterator i=ir->offsets.begin(); i!=ir->offsets.end(); ++i)
         {
             unsigned offset = i->first;
@@ -436,46 +449,46 @@
         assert(0 && "unsupported compositetype for debug info");
     }
 
-    std::vector<LLConstant*> vals;
+    std::vector<LLConstant*> vals(11);
 
     // tag
-    vals.push_back(DBG_TAG(tag));
+    vals[0] = DBG_TAG(tag);
 
     // context
-    vals.push_back(DBG_CAST(compileUnit));
+    vals[1] = DBG_CAST(compileUnit);
 
     // name
-    vals.push_back(name);
+    vals[2] = name;
 
     // compile unit where defined
     if (definedCU)
-        vals.push_back(DBG_CAST(definedCU));
+        vals[3] = DBG_CAST(definedCU);
     else
-        vals.push_back(DBG_NULL);
+        vals[3] = DBG_NULL;
 
     // line number where defined
-    vals.push_back(DtoConstInt(linnum));
+    vals[4] = DtoConstInt(linnum);
 
     // size in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false));
+    vals[5] = LLConstantInt::get(LLType::Int64Ty, getTypeBitSize(T), false);
 
     // alignment in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false));
+    vals[6] = LLConstantInt::get(LLType::Int64Ty, getABITypeAlign(T)*8, false);
 
     // offset in bits
-    vals.push_back(LLConstantInt::get(LLType::Int64Ty, 0, false));
+    vals[7] = LLConstantInt::get(LLType::Int64Ty, 0, false);
 
     // FIXME: dont know what this is
-    vals.push_back(DtoConstUint(0));
+    vals[8] = DtoConstUint(0);
 
     // FIXME: ditto
-    vals.push_back(DBG_NULL);
+    vals[9] = DBG_NULL;
 
     // members array
     if (members)
-        vals.push_back(DBG_CAST(members));
+        vals[10] = DBG_CAST(members);
     else
-        vals.push_back(DBG_NULL);
+        vals[10] = DBG_NULL;
 
     // set initializer
     if (!gv)
@@ -493,25 +506,25 @@
     assert(vd->isDataseg());
     LLGlobalVariable* compileUnit = DtoDwarfCompileUnit(gIR->dmodule);
 
-    std::vector<LLConstant*> vals;
-    vals.push_back(DBG_TAG(DW_TAG_variable));
-    vals.push_back(DBG_CAST(getDwarfAnchor(DW_TAG_variable)));
+    std::vector<LLConstant*> vals(12);
+    vals[0] = DBG_TAG(DW_TAG_variable);
+    vals[1] = DBG_CAST(getDwarfAnchor(DW_TAG_variable));
 
-    vals.push_back(DBG_CAST(compileUnit));
+    vals[2] = DBG_CAST(compileUnit);
 
-    vals.push_back(DtoConstStringPtr(vd->mangle(), "llvm.metadata"));
-    vals.push_back(DtoConstStringPtr(vd->toPrettyChars(), "llvm.metadata"));
-    vals.push_back(DtoConstStringPtr(vd->toChars(), "llvm.metadata"));
+    vals[3] = DtoConstStringPtr(vd->mangle(), "llvm.metadata");
+    vals[4] = DtoConstStringPtr(vd->toPrettyChars(), "llvm.metadata");
+    vals[5] = DtoConstStringPtr(vd->toChars(), "llvm.metadata");
 
-    vals.push_back(DBG_CAST(DtoDwarfCompileUnit(vd->getModule())));
-    vals.push_back(DtoConstUint(vd->loc.linnum));
+    vals[6] = DBG_CAST(DtoDwarfCompileUnit(vd->getModule()));
+    vals[7] = DtoConstUint(vd->loc.linnum);
 
-    LLGlobalVariable* TY = dwarfTypeDescription(vd->type, compileUnit, NULL);
-    vals.push_back(TY ? DBG_CAST(TY) : DBG_NULL);
-    vals.push_back(DtoConstBool(vd->protection == PROTprivate));
-    vals.push_back(DtoConstBool(vd->getModule() == gIR->dmodule));
+    LLGlobalVariable* TY = dwarfTypeDescription_impl(vd->type, compileUnit, NULL);
+    vals[8] = TY ? DBG_CAST(TY) : DBG_NULL;
+    vals[9] = DtoConstBool(vd->protection == PROTprivate);
+    vals[10] = DtoConstBool(vd->getModule() == gIR->dmodule);
 
-    vals.push_back(DBG_CAST(ll));
+    vals[11] = DBG_CAST(ll);
 
     return emitDwarfGlobal(getDwarfGlobalVariableType(), vals, "llvm.dbg.global_variable");
 }
@@ -549,15 +562,15 @@
 
 static void dwarfDeclare(LLValue* var, LLGlobalVariable* varDescr)
 {
-    LLSmallVector<LLValue*,2> args;
-    args.push_back(DtoBitCast(var, DBG_TYPE));
-    args.push_back(DBG_CAST(varDescr));
+    LLSmallVector<LLValue*,2> args(2);
+    args[0] = DtoBitCast(var, DBG_TYPE);
+    args[1] = DBG_CAST(varDescr);
     gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.declare"), args.begin(), args.end());
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
-static LLGlobalVariable* dwarfTypeDescription(Type* type, LLGlobalVariable* cu, const char* c_name)
+static LLGlobalVariable* dwarfTypeDescription_impl(Type* type, LLGlobalVariable* cu, const char* c_name)
 {
     Type* t = type->toBasetype();
     if (t->ty == Tvoid)
@@ -566,16 +579,28 @@
         return dwarfBasicType(type, cu);
     else if (t->ty == Tpointer)
         return dwarfDerivedType(type, cu);
-    else if (t->ty == Tarray || t->ty == Tstruct)
+    else if (t->ty == Tarray || t->ty == Tstruct || t->ty == Tclass)
         return dwarfCompositeType(type, cu);
 
     return NULL;
 }
 
+static LLGlobalVariable* dwarfTypeDescription(Type* type, LLGlobalVariable* cu, const char* c_name)
+{
+    Type* t = type->toBasetype();
+    if (t->ty == Tclass)
+        return dwarfTypeDescription_impl(type->pointerTo(), cu, c_name);
+    else
+        return dwarfTypeDescription_impl(type, cu, c_name);
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
 void DtoDwarfLocalVariable(LLValue* ll, VarDeclaration* vd)
 {
+    Logger::println("D to dwarf local variable");
+    LOG_SCOPE;
+
     // get compile units
     LLGlobalVariable* thisCU = DtoDwarfCompileUnit(gIR->dmodule);
     LLGlobalVariable* varCU = thisCU;
@@ -600,6 +625,9 @@
 
 LLGlobalVariable* DtoDwarfCompileUnit(Module* m)
 {
+    Logger::println("D to dwarf compile_unit");
+    LOG_SCOPE;
+
     // we might be generating for an import
     if (!m->ir.irModule)
         m->ir.irModule = new IrModule(m);
@@ -618,6 +646,9 @@
 
 LLGlobalVariable* DtoDwarfSubProgram(FuncDeclaration* fd)
 {
+    Logger::println("D to dwarf subprogram");
+    LOG_SCOPE;
+
     // FIXME: duplicates ?
     return dwarfSubProgram(fd, DtoDwarfCompileUnit(gIR->dmodule));
 }
@@ -626,6 +657,9 @@
 
 LLGlobalVariable* DtoDwarfGlobalVariable(LLGlobalVariable* ll, VarDeclaration* vd)
 {
+    Logger::println("D to dwarf global_variable");
+    LOG_SCOPE;
+
     // FIXME: duplicates ?
     return dwarfGlobalVariable(ll, vd);
 }
@@ -634,6 +668,9 @@
 
 void DtoDwarfFuncStart(FuncDeclaration* fd)
 {
+    Logger::println("D to dwarf funcstart");
+    LOG_SCOPE;
+
     assert(fd->ir.irFunc->dwarfSubProg);
     gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(fd->ir.irFunc->dwarfSubProg));
 }
@@ -642,6 +679,9 @@
 
 void DtoDwarfFuncEnd(FuncDeclaration* fd)
 {
+    Logger::println("D to dwarf funcend");
+    LOG_SCOPE;
+
     assert(fd->ir.irFunc->dwarfSubProg);
     gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(fd->ir.irFunc->dwarfSubProg));
 }
@@ -650,10 +690,13 @@
 
 void DtoDwarfStopPoint(unsigned ln)
 {
-    LLSmallVector<LLValue*,3> args;
-    args.push_back(DtoConstUint(ln));
-    args.push_back(DtoConstUint(0));
+    Logger::println("D to dwarf stoppoint at line %u", ln);
+    LOG_SCOPE;
+
+    LLSmallVector<LLValue*,3> args(3);
+    args[0] = DtoConstUint(ln);
+    args[1] = DtoConstUint(0);
     FuncDeclaration* fd = gIR->func()->decl;
-    args.push_back(DBG_CAST(DtoDwarfCompileUnit(fd->getModule())));
+    args[2] = DBG_CAST(DtoDwarfCompileUnit(fd->getModule()));
     gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.stoppoint"), args.begin(), args.end());
 }