[PATCH] D75485: Support DW_FORM_strx* in llvm-dwp.

Ali Tamur via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 2 15:39:30 PST 2020


tamur created this revision.
tamur added a reviewer: dblaikie.
tamur added a project: LLVM.
Herald added a subscriber: llvm-commits.

Currently llvm-dwp only handled DW_FORM_string and DW_FORM_GNU_str_index; with this patch it also starts to handle DW_FORM_strx[1-4]?


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D75485

Files:
  llvm/test/tools/llvm-dwp/Inputs/handle_strx/a.dwo
  llvm/test/tools/llvm-dwp/Inputs/handle_strx/main.dwo
  llvm/test/tools/llvm-dwp/X86/handle_strx.test
  llvm/test/tools/llvm-dwp/X86/invalid_string_form.test
  llvm/tools/llvm-dwp/llvm-dwp.cpp


Index: llvm/tools/llvm-dwp/llvm-dwp.cpp
===================================================================
--- llvm/tools/llvm-dwp/llvm-dwp.cpp
+++ llvm/tools/llvm-dwp/llvm-dwp.cpp
@@ -121,10 +121,30 @@
                  uint64_t &InfoOffset, StringRef StrOffsets, StringRef Str) {
   if (Form == dwarf::DW_FORM_string)
     return InfoData.getCStr(&InfoOffset);
-  if (Form != dwarf::DW_FORM_GNU_str_index)
+  uint64_t StrIndex;
+  switch (Form) {
+    case dwarf::DW_FORM_strx1:
+      StrIndex = InfoData.getU8(&InfoOffset);
+      break;
+    case dwarf::DW_FORM_strx2:
+      StrIndex = InfoData.getU16(&InfoOffset);
+      break;
+    case dwarf::DW_FORM_strx3:
+      StrIndex = InfoData.getU24(&InfoOffset);
+      break;
+    case dwarf::DW_FORM_strx4:
+      StrIndex = InfoData.getU32(&InfoOffset);
+      break;
+    case dwarf::DW_FORM_strx:
+    case dwarf::DW_FORM_GNU_str_index:
+      StrIndex = InfoData.getULEB128(&InfoOffset);
+      break;
+    default:
     return make_error<DWPError>(
-        "string field encoded without DW_FORM_string or DW_FORM_GNU_str_index");
-  auto StrIndex = InfoData.getULEB128(&InfoOffset);
+        "string field must be encoded with one of the following: "
+        "DW_FORM_string, DW_FORM_strx, DW_FORM_strx1, DW_FORM_strx2, "
+        "DW_FORM_strx3, DW_FORM_strx4, or DW_FORM_GNU_str_index.");
+  }
   DataExtractor StrOffsetsData(StrOffsets, true, 0);
   uint64_t StrOffsetsOffset = 4 * StrIndex;
   uint64_t StrOffset = StrOffsetsData.getU32(&StrOffsetsOffset);
Index: llvm/test/tools/llvm-dwp/X86/invalid_string_form.test
===================================================================
--- llvm/test/tools/llvm-dwp/X86/invalid_string_form.test
+++ llvm/test/tools/llvm-dwp/X86/invalid_string_form.test
@@ -1,3 +1,5 @@
+RUN: not llvm-dwp %p/../Inputs/invalid_string_form.dwo -o %t 2>&1 | xargs echo
 RUN: not llvm-dwp %p/../Inputs/invalid_string_form.dwo -o %t 2>&1 | FileCheck %s
 
-CHECK: error: {{.*}}invalid_string_form.dwo': string field encoded without DW_FORM_string or DW_FORM_GNU_str_index
+CHECK: error: {{.*}}: string field must be encoded with one of the following:
+CHECK: DW_FORM_string, DW_FORM_strx, DW_FORM_strx1, DW_FORM_strx2, DW_FORM_strx3, DW_FORM_strx4, or DW_FORM_GNU_str_index.
Index: llvm/test/tools/llvm-dwp/X86/handle_strx.test
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-dwp/X86/handle_strx.test
@@ -0,0 +1,29 @@
+RUN: llvm-dwp %p/../Inputs/handle_strx/a.dwo %p/../Inputs/handle_strx/main.dwo -o %t 2>/dev/null
+RUN: llvm-dwarfdump --verbose %t 2>/dev/null | FileCheck %s
+
+To build a.dwo and main.dwo from source:
+main.cc:
+#include "a.h"
+
+int main() {
+  f1();
+  return 0;
+}
+
+a.h:
+void f1();
+
+a.cc:
+#include "a.h"
+
+void f1() {
+}
+
+$  clang++ -gdwarf-5 -gsplit-dwarf -c a.cc
+$  clang++ -gdwarf-5 -gsplit-dwarf -c main.cc
+
+Neither llvm-dwp nor llvm-dwarfdump support for dwarf 5 is complete at this point,
+so we will just check that .dwp file exists and has a DW_FORM_strx1 should suffice.
+
+CHECK: DW_AT_producer [DW_FORM_strx1]
+


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D75485.247734.patch
Type: text/x-patch
Size: 3110 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200302/01d0a659/attachment.bin>


More information about the llvm-commits mailing list