diff options
author | Bob Wilson <bob.wilson@apple.com> | 2011-08-03 19:42:51 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2011-08-03 19:42:51 +0000 |
commit | cfc55c2fc94a7b58e9b9090bc47eb791e029d7a2 (patch) | |
tree | 41600c070aeef9f6e50aaf490750f04d7a92910d | |
parent | e4ad50bb437249100fd40c156b5c5078ba7bce2e (diff) | |
download | external_llvm-cfc55c2fc94a7b58e9b9090bc47eb791e029d7a2.zip external_llvm-cfc55c2fc94a7b58e9b9090bc47eb791e029d7a2.tar.gz external_llvm-cfc55c2fc94a7b58e9b9090bc47eb791e029d7a2.tar.bz2 |
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
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 32 |
1 files changed, 9 insertions, 23 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index ffd6c80..4900e94 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<ConstantExpr>(V); if (!CE || CE->getNumOperands() != 3 || - CE->getOpcode() != Instruction::GetElementPtr || - !isa<PointerType>(CE->getOperand(0)->getType())) + CE->getOpcode() != Instruction::GetElementPtr) return NULL; - // First operand points to a global value. - if (!isa<GlobalValue>(CE->getOperand(0))) + // First operand points to a global struct. + Value *Ptr = CE->getOperand(0); + if (!isa<GlobalValue>(Ptr) || + !isa<StructType>(cast<PointerType>(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<ConstantInt>(CE->getOperand(2))->getZExtValue(); - if (e == 0) return 0; - - uint64_t Offset = 0; - const PointerType *PTy = dyn_cast<PointerType>(CE->getOperand(0)->getType()); - const StructType *STy = dyn_cast<StructType>(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<GlobalValue>(CE->getOperand(0)))); + Asm->Mang->getSymbol(cast<GlobalValue>(Ptr))); TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); + SmallVector<Value*, 3> 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); } |