[llvm-dwp] Deduplicate strings in the debug_str.dwo section
authorDavid Blaikie <dblaikie@gmail.com>
Tue, 1 Dec 2015 19:17:58 +0000 (19:17 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Tue, 1 Dec 2015 19:17:58 +0000 (19:17 +0000)
Also, ensure that references to those strings in debug_str_offsets.dwo
correctly refer to the deduplicated strings.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254441 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-dwp/X86/simple.test
tools/llvm-dwp/llvm-dwp.cpp

index d70bdda072c5b691c3ccbdfb60db821d50f608ef..754450f13f3fb3ba36bb5db09904555aeec17a69 100644 (file)
@@ -46,13 +46,11 @@ FIXME: Emit and verify the cu_index contents
 CHECK: .debug_str.dwo contents:
 CHECK: "clang version
 CHECK: 0x[[ACPP:.*]]: "a.cpp"
-FIXME: Remove duplicates
-CHECK: 0x[[SECONDREV:.*]]: "clang version
+CHECK-NOT: "clang version
 CHECK: 0x[[BCPP:.*]]: "b.cpp"
 
 CHECK: .debug_str_offsets.dwo contents:
 CHECK: : 00000000
 CHECK: : [[ACPP]]
-CHECK: : [[SECONDREV]]
-FIXME: Update str offset indexes, this should be BCPP \/
+CHECK: : 00000000
 CHECK: : [[BCPP]]
index c89be222e6c9a7e7d33ccaf730e32c462db4af7a..9ce37ec2ceee4b8b9c0f334bdc7aef8edc6ee6fd 100644 (file)
@@ -40,8 +40,9 @@ static int error(const Twine &Error, const Twine &Context) {
 
 static std::error_code
 writeStringsAndOffsets(MCStreamer &Out, StringMap<uint32_t> &Strings,
-                       uint32_t &StringOffset, MCSection *StrOffsetSection,
-                       StringRef CurStrSection, StringRef CurStrOffsetSection) {
+                       uint32_t &StringOffset, MCSection *StrSection,
+                       MCSection *StrOffsetSection, StringRef CurStrSection,
+                       StringRef CurStrOffsetSection) {
   // Could possibly produce an error or warning if one of these was non-null but
   // the other was null.
   if (CurStrSection.empty() || CurStrOffsetSection.empty())
@@ -54,9 +55,14 @@ writeStringsAndOffsets(MCStreamer &Out, StringMap<uint32_t> &Strings,
   uint32_t PrevOffset = 0;
   while (const char *s = Data.getCStr(&LocalOffset)) {
     StringRef Str(s, LocalOffset - PrevOffset - 1);
-    OffsetRemapping[PrevOffset] = StringOffset;
-    // insert, if successful, write new string to the str.dwo section
-    StringOffset += Str.size() + 1;
+    auto Pair = Strings.insert(std::make_pair(Str, StringOffset));
+    if (Pair.second) {
+      Out.SwitchSection(StrSection);
+      Out.EmitBytes(
+          StringRef(Pair.first->getKeyData(), Pair.first->getKeyLength() + 1));
+      StringOffset += Str.size() + 1;
+    }
+    OffsetRemapping[PrevOffset] = Pair.first->second;
     PrevOffset = LocalOffset;
   }
 
@@ -106,19 +112,19 @@ static std::error_code write(MCStreamer &Out, ArrayRef<std::string> Inputs) {
         StringRef Contents;
         if (auto Err = Section.getContents(Contents))
           return Err;
-        if (OutSection == StrOffsetSection) {
+        if (OutSection == StrOffsetSection)
           CurStrOffsetSection = Contents;
-          continue;
-        }
-        if (OutSection == StrSection)
+        else if (OutSection == StrSection)
           CurStrSection = Contents;
-        Out.SwitchSection(OutSection);
-        Out.EmitBytes(Contents);
+        else {
+          Out.SwitchSection(OutSection);
+          Out.EmitBytes(Contents);
+        }
       }
     }
-    if (auto Err =
-            writeStringsAndOffsets(Out, Strings, StringOffset, StrOffsetSection,
-                                   CurStrSection, CurStrOffsetSection))
+    if (auto Err = writeStringsAndOffsets(Out, Strings, StringOffset,
+                                          StrSection, StrOffsetSection,
+                                          CurStrSection, CurStrOffsetSection))
       return Err;
   }
   return std::error_code();