Some revisions to Devang's change r136759 for merged global debug info.
authorBob Wilson <bob.wilson@apple.com>
Wed, 3 Aug 2011 19:42:51 +0000 (19:42 +0000)
committerBob Wilson <bob.wilson@apple.com>
Wed, 3 Aug 2011 19:42:51 +0000 (19:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136802 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/DwarfDebug.cpp

index ffd6c80008154ad7cdc1a3d4e1f6e74513263c22..4900e943104b710b765b241c8e0feb70a651e392 100644 (file)
@@ -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);
   }