From: Bob Wilson Date: Wed, 3 Aug 2011 19:42:51 +0000 (+0000) Subject: Some revisions to Devang's change r136759 for merged global debug info. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=cfc55c2fc94a7b58e9b9090bc47eb791e029d7a2;p=oota-llvm.git Some revisions to Devang's change r136759 for merged global debug info. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136802 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index ffd6c800081..4900e943104 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -955,12 +955,13 @@ CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const { static const ConstantExpr *getMergedGlobalExpr(const Value *V) { const ConstantExpr *CE = dyn_cast_or_null(V); if (!CE || CE->getNumOperands() != 3 || - CE->getOpcode() != Instruction::GetElementPtr || - !isa(CE->getOperand(0)->getType())) + CE->getOpcode() != Instruction::GetElementPtr) return NULL; - // First operand points to a global value. - if (!isa(CE->getOperand(0))) + // First operand points to a global struct. + Value *Ptr = CE->getOperand(0); + if (!isa(Ptr) || + !isa(cast(Ptr->getType())->getElementType())) return NULL; // Second operand is zero. @@ -975,23 +976,6 @@ static const ConstantExpr *getMergedGlobalExpr(const Value *V) { return CE; } -// getMergedGlobalElementOffset - If CE is accessing a merged global -// then find byte offset of the element accessed by CE. This must be -// used only CE returned by getMergedGlobalExpr(). See above. -static uint64_t getMergedGlobalElementOffset(const TargetData &TD, - const ConstantExpr *CE) { - assert (getMergedGlobalExpr(CE) && "This is not a merged global!"); - uint64_t e = cast(CE->getOperand(2))->getZExtValue(); - if (e == 0) return 0; - - uint64_t Offset = 0; - const PointerType *PTy = dyn_cast(CE->getOperand(0)->getType()); - const StructType *STy = dyn_cast(PTy->getElementType()); - for (uint64_t i = 0; i != e; ++i) - Offset += TD.getTypeAllocSize(STy->getElementType(i)); - return Offset; -} - /// constructGlobalVariableDIE - Construct global variable DIE. void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) { DIGlobalVariable GV(N); @@ -1060,12 +1044,14 @@ void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) { else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) { // GV is a merged global. DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); + Value *Ptr = CE->getOperand(0); TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata, - Asm->Mang->getSymbol(cast(CE->getOperand(0)))); + Asm->Mang->getSymbol(cast(Ptr))); TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); + SmallVector Idx(CE->op_begin()+1, CE->op_end()); TheCU->addUInt(Block, 0, dwarf::DW_FORM_udata, - getMergedGlobalElementOffset(Asm->getTargetData(), CE)); + Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx)); TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); }