aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2011-08-03 19:42:51 +0000
committerBob Wilson <bob.wilson@apple.com>2011-08-03 19:42:51 +0000
commitcfc55c2fc94a7b58e9b9090bc47eb791e029d7a2 (patch)
tree41600c070aeef9f6e50aaf490750f04d7a92910d
parente4ad50bb437249100fd40c156b5c5078ba7bce2e (diff)
downloadexternal_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.cpp32
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);
}