Make size computation less brittle.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132222 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 53580d7..f29b199 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -2586,17 +2586,16 @@
       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
       DIVariable DV(Entry.Variable);
+      Asm->OutStreamer.AddComment("Loc expr size");
+      MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
+      MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
+      Asm->EmitLabelDifference(end, begin, 2);
+      Asm->OutStreamer.EmitLabel(begin);
       if (DV.hasComplexAddress()) {
         unsigned N = DV.getNumAddrElements();
         unsigned i = 0;
-        Asm->OutStreamer.AddComment("Loc expr size");
         if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
           if (Entry.Loc.getOffset()) {
-            unsigned Size = Asm->getDwarfRegOpSize(Entry.Loc);
-            unsigned OffsetSize = 
-              MCAsmInfo::getSLEB128Size(DV.getAddrElement(1));
-            // breg + deref + plus + offset
-            Asm->EmitInt16(Size + 1 + 1 + OffsetSize + N - 2);
             i = 2;
             Asm->EmitDwarfRegOp(Entry.Loc);
             Asm->OutStreamer.AddComment("DW_OP_deref");
@@ -2608,12 +2607,10 @@
             // If first address element is OpPlus then emit
             // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
             MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
-            Asm->EmitInt16(Asm->getDwarfRegOpSize(Loc) + N - 2);
             Asm->EmitDwarfRegOp(Loc);
             i = 2;
           }
         } else {
-          Asm->EmitInt16(Asm->getDwarfRegOpSize(Entry.Loc) + N);
           Asm->EmitDwarfRegOp(Entry.Loc);
         }
 
@@ -2628,10 +2625,9 @@
           else llvm_unreachable("unknown Opcode found in complex address");
         }
       } else {
-        Asm->OutStreamer.AddComment("Loc expr size");
-        Asm->EmitInt16(Asm->getDwarfRegOpSize(Entry.Loc));
         Asm->EmitDwarfRegOp(Entry.Loc);
       }
+      Asm->OutStreamer.EmitLabel(end);
     }
   }
 }