<div dir="ltr">Hi Pavel,<div><br></div><div>This commit has caused two test failures in our darwin CI:</div><div><br></div><div><a href="http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental/51228/consoleFull">http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental/51228/consoleFull</a><br></div><div><br></div><div>Here are the failures:</div><div><br></div><div><div>FAIL: LLVM-Unit :: DebugInfo/DWARF/./DebugInfoDWARFTests/DWARFDebugInfo.TestDWARF32Version5Addr4AllForms (1294 of 39800)</div><div>******************** TEST 'LLVM-Unit :: DebugInfo/DWARF/./DebugInfoDWARFTests/DWARFDebugInfo.TestDWARF32Version5Addr4AllForms' FAILED ********************</div><div>Note: Google Test filter = DWARFDebugInfo.TestDWARF32Version5Addr4AllForms</div><div>[==========] Running 1 test from 1 test case.</div><div>[----------] Global test environment set-up.</div><div>[----------] 1 test from DWARFDebugInfo</div><div>[ RUN      ] DWARFDebugInfo.TestDWARF32Version5Addr4AllForms</div><div>/Users/buildslave/jenkins/workspace/clang-stage1-cmake-RA-incremental/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp:312: Failure</div><div>Value of: (bool)ExtractedStrxValue</div><div>  Actual: false</div><div>Expected: true</div><div>warning: DWARF compile unit extends beyond its bounds cu 0x00000000 at 0x000000c0</div><div>error: parsing a range list table: section is not large enough to contain a .debug_rnglists table length at offset 0x0</div><div>Assertion failed: (Storage.hasVal), function getPointer, file /Users/buildslave/jenkins/workspace/clang-stage1-cmake-RA-incremental/llvm/include/llvm/ADT/Optional.h, line 176.</div><div>0  DebugInfoDWARFTests      0x0000000110101698 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 40</div><div>1  DebugInfoDWARFTests      0x0000000110100627 llvm::sys::RunSignalHandlers() + 39</div><div>2  DebugInfoDWARFTests      0x0000000110101c92 SignalHandler(int) + 258</div><div>3  libsystem_platform.dylib 0x00007fff615b7f5a _sigtramp + 26</div><div>4  libsystem_platform.dylib 0x76616c73646c6975 _sigtramp + 51440181</div><div>5  libsystem_c.dylib        0x00007fff613551ae abort + 127</div><div>6  libsystem_c.dylib        0x00007fff6131d1ac basename_r + 0</div><div>7  DebugInfoDWARFTests      0x000000010f149edc void (anonymous namespace)::TestAllForms<(unsigned short)5, unsigned int, unsigned int>() + 19916</div><div>8  DebugInfoDWARFTests      0x0000000110108f90 testing::Test::Run() + 528</div><div>9  DebugInfoDWARFTests      0x0000000110109fe0 testing::TestInfo::Run() + 576</div><div>10 DebugInfoDWARFTests      0x000000011010a7f7 testing::TestCase::Run() + 471</div><div>11 DebugInfoDWARFTests      0x00000001101121b7 testing::internal::UnitTestImpl::RunAllTests() + 1143</div><div>12 DebugInfoDWARFTests      0x0000000110111d15 testing::UnitTest::Run() + 229</div><div>13 DebugInfoDWARFTests      0x000000011010269f main + 111</div><div>14 libdyld.dylib            0x00007fff612a9015 start + 1</div><div>15 libdyld.dylib            0x0000000000000002 start + 2664787950</div><div><br></div><div>********************</div><div>FAIL: LLVM-Unit :: DebugInfo/DWARF/./DebugInfoDWARFTests/DWARFDebugInfo.TestDWARF32Version5Addr8AllForms (1295 of 39800)</div><div>******************** TEST 'LLVM-Unit :: DebugInfo/DWARF/./DebugInfoDWARFTests/DWARFDebugInfo.TestDWARF32Version5Addr8AllForms' FAILED ********************</div><div>Note: Google Test filter = DWARFDebugInfo.TestDWARF32Version5Addr8AllForms</div><div>[==========] Running 1 test from 1 test case.</div><div>[----------] Global test environment set-up.</div><div>[----------] 1 test from DWARFDebugInfo</div><div>[ RUN      ] DWARFDebugInfo.TestDWARF32Version5Addr8AllForms</div><div>/Users/buildslave/jenkins/workspace/clang-stage1-cmake-RA-incremental/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp:312: Failure</div><div>Value of: (bool)ExtractedStrxValue</div><div>  Actual: false</div><div>Expected: true</div><div>warning: DWARF compile unit extends beyond its bounds cu 0x00000000 at 0x000000c8</div><div>error: parsing a range list table: section is not large enough to contain a .debug_rnglists table length at offset 0x0</div><div>Assertion failed: (Storage.hasVal), function getPointer, file /Users/buildslave/jenkins/workspace/clang-stage1-cmake-RA-incremental/llvm/include/llvm/ADT/Optional.h, line 176.</div><div>0  DebugInfoDWARFTests      0x000000010412e698 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 40</div><div>1  DebugInfoDWARFTests      0x000000010412d627 llvm::sys::RunSignalHandlers() + 39</div><div>2  DebugInfoDWARFTests      0x000000010412ec92 SignalHandler(int) + 258</div><div>3  libsystem_platform.dylib 0x00007fff615b7f5a _sigtramp + 26</div><div>4  libsystem_platform.dylib 0x76616c73646c6975 _sigtramp + 51440181</div><div>5  libsystem_c.dylib        0x00007fff613551ae abort + 127</div><div>6  libsystem_c.dylib        0x00007fff6131d1ac basename_r + 0</div><div>7  DebugInfoDWARFTests      0x000000010317bd3d void (anonymous namespace)::TestAllForms<(unsigned short)5, unsigned long long, unsigned int>() + 19917</div><div>8  DebugInfoDWARFTests      0x0000000104135f90 testing::Test::Run() + 528</div><div>9  DebugInfoDWARFTests      0x0000000104136fe0 testing::TestInfo::Run() + 576</div><div>10 DebugInfoDWARFTests      0x00000001041377f7 testing::TestCase::Run() + 471</div><div>11 DebugInfoDWARFTests      0x000000010413f1b7 testing::internal::UnitTestImpl::RunAllTests() + 1143</div><div>12 DebugInfoDWARFTests      0x000000010413ed15 testing::UnitTest::Run() + 229</div><div>13 DebugInfoDWARFTests      0x000000010412f69f main + 111</div><div>14 libdyld.dylib            0x00007fff612a9015 start + 1</div><div>15 libdyld.dylib            0x0000000000000002 start + 2664787950</div><div><br></div><div>********************</div></div><div><br></div><div><br></div><div>Do you mind taking a look?</div><div>Let me know if you need assistance for testing/verifying fixes on Darwin.</div><div><br></div><div>Cheers,</div><div>Alex</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 25 July 2018 at 08:33, Pavel Labath via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: labath<br>
Date: Wed Jul 25 08:33:32 2018<br>
New Revision: 337933<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=337933&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=337933&view=rev</a><br>
Log:<br>
dwarfgen: Add support for generating the debug_str_offsets section, take 2<br>
<br>
This recommits r337910 after fixing an "ambiguous call to addAttribute"<br>
error with some compilers (gcc circa 4.9 and MSVC). It seems that these<br>
compilers will consider a "false -> pointer" conversion during overload<br>
resolution. This creates ambiguity because one I added an overload which<br>
takes a MCExpr * as an argument.<br>
<br>
I fix this by making the new overload take MCExpr&, which avoids the<br>
conversion. It also documents the fact that we expect a valid MCExpr<br>
object.<br>
<br>
Original commit message follows:<br>
<br>
The motivation for this is D49493, where we'd like to test details of<br>
debug_str_offsets behavior which is difficult to trigger from a<br>
traditional test.<br>
<br>
This adds the plubming necessary for dwarfgen to generate this section.<br>
The more interesting changes are:<br>
- I've moved emitStringOffsetsTableHeader function from DwarfFile to<br>
  DwarfStringPool, so I can generate the section header more easily from<br>
  the unit test.<br>
- added a new addAttribute overload taking an MCExpr*. This is used to<br>
  generate the DW_AT_str_offsets_base, which links a compile unit to the<br>
  offset table.<br>
<br>
I've also added a basic test for reading and writing DW_form_strx forms.<br>
<br>
Reviewers: dblaikie, JDevlieghere, probinson<br>
<br>
Subscribers: llvm-commits, aprantl<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D49670" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D49670</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfDebug.cpp<br>
    llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfFile.cpp<br>
    llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfFile.h<br>
    llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfStringPool.cpp<br>
    llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfStringPool.h<br>
    llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DWARFDebugInfoTest.cpp<br>
    llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.cpp<br>
    llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.h<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfDebug.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=337933&r1=337932&r2=337933&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/AsmPrinter/DwarfDebug.<wbr>cpp?rev=337933&r1=337932&r2=<wbr>337933&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfDebug.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfDebug.cpp Wed Jul 25 08:33:32 2018<br>
@@ -1506,8 +1506,9 @@ void DwarfDebug::emitAbbreviations(<wbr>) {<br>
<br>
 void DwarfDebug::<wbr>emitStringOffsetsTableHeader() {<br>
   DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;<br>
-  Holder.<wbr>emitStringOffsetsTableHeader(<br>
-      Asm->getObjFileLowering().<wbr>getDwarfStrOffSection());<br>
+  Holder.getStringPool().<wbr>emitStringOffsetsTableHeader(<br>
+      *Asm, Asm->getObjFileLowering().<wbr>getDwarfStrOffSection(),<br>
+      Holder.<wbr>getStringOffsetsStartSym());<br>
 }<br>
<br>
 template <typename AccelTableT><br>
@@ -2292,8 +2293,9 @@ void DwarfDebug::emitDebugLineDWO() {<br>
<br>
 void DwarfDebug::<wbr>emitStringOffsetsTableHeaderDW<wbr>O() {<br>
   assert(useSplitDwarf() && "No split dwarf?");<br>
-  InfoHolder.<wbr>emitStringOffsetsTableHeader(<br>
-      Asm->getObjFileLowering().<wbr>getDwarfStrOffDWOSection());<br>
+  InfoHolder.getStringPool().<wbr>emitStringOffsetsTableHeader(<br>
+      *Asm, Asm->getObjFileLowering().<wbr>getDwarfStrOffDWOSection(),<br>
+      InfoHolder.<wbr>getStringOffsetsStartSym());<br>
 }<br>
<br>
 // Emit the .debug_str.dwo section for separated dwarf. This contains the<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfFile.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp?rev=337933&r1=337932&r2=337933&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/AsmPrinter/DwarfFile.<wbr>cpp?rev=337933&r1=337932&r2=<wbr>337933&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfFile.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfFile.cpp Wed Jul 25 08:33:32 2018<br>
@@ -28,26 +28,6 @@ void DwarfFile::addUnit(std::<wbr>unique_ptr<<br>
   CUs.push_back(std::move(U));<br>
 }<br>
<br>
-void DwarfFile::<wbr>emitStringOffsetsTableHeader(<wbr>MCSection *Section) {<br>
-  if (StrPool.empty())<br>
-    return;<br>
-  Asm->OutStreamer-><wbr>SwitchSection(Section);<br>
-  unsigned EntrySize = 4;<br>
-  // FIXME: DWARF64<br>
-  // We are emitting the header for a contribution to the string offsets<br>
-  // table. The header consists of an entry with the contribution's<br>
-  // size (not including the size of the length field), the DWARF version and<br>
-  // 2 bytes of padding.<br>
-  Asm->emitInt32(StrPool.size() * EntrySize + 4);<br>
-  Asm->emitInt16(Asm-><wbr>getDwarfVersion());<br>
-  Asm->emitInt16(0);<br>
-  // Define the symbol that marks the start of the contribution. It is<br>
-  // referenced by most unit headers via DW_AT_str_offsets_base.<br>
-  // Split units do not use the attribute.<br>
-  if (StringOffsetsStartSym)<br>
-    Asm->OutStreamer->EmitLabel(<wbr>StringOffsetsStartSym);<br>
-}<br>
-<br>
 // Emit the various dwarf units to the unit section USection with<br>
 // the abbreviations going into ASection.<br>
 void DwarfFile::emitUnits(bool UseOffsets) {<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfFile.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h?rev=337933&r1=337932&r2=337933&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/AsmPrinter/DwarfFile.<wbr>h?rev=337933&r1=337932&r2=<wbr>337933&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfFile.h (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfFile.h Wed Jul 25 08:33:32 2018<br>
@@ -91,9 +91,6 @@ public:<br>
   /// Add a unit to the list of CUs.<br>
   void addUnit(std::unique_ptr<<wbr>DwarfCompileUnit> U);<br>
<br>
-  /// Emit the string table offsets header.<br>
-  void emitStringOffsetsTableHeader(<wbr>MCSection *Section);<br>
-<br>
   /// Emit all of the units to the section listed with the given<br>
   /// abbreviation section.<br>
   void emitUnits(bool UseOffsets);<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfStringPool.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp?rev=337933&r1=337932&r2=337933&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/AsmPrinter/<wbr>DwarfStringPool.cpp?rev=<wbr>337933&r1=337932&r2=337933&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfStringPool.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfStringPool.cpp Wed Jul 25 08:33:32 2018<br>
@@ -39,6 +39,28 @@ DwarfStringPool::EntryRef DwarfStringPoo<br>
   return EntryRef(*I.first);<br>
 }<br>
<br>
+void DwarfStringPool::<wbr>emitStringOffsetsTableHeader(<wbr>AsmPrinter &Asm,<br>
+                                                   MCSection *Section,<br>
+                                                   MCSymbol *StartSym) {<br>
+  if (empty())<br>
+    return;<br>
+  Asm.OutStreamer-><wbr>SwitchSection(Section);<br>
+  unsigned EntrySize = 4;<br>
+  // FIXME: DWARF64<br>
+  // We are emitting the header for a contribution to the string offsets<br>
+  // table. The header consists of an entry with the contribution's<br>
+  // size (not including the size of the length field), the DWARF version and<br>
+  // 2 bytes of padding.<br>
+  Asm.emitInt32(size() * EntrySize + 4);<br>
+  Asm.emitInt16(Asm.<wbr>getDwarfVersion());<br>
+  Asm.emitInt16(0);<br>
+  // Define the symbol that marks the start of the contribution. It is<br>
+  // referenced by most unit headers via DW_AT_str_offsets_base.<br>
+  // Split units do not use the attribute.<br>
+  if (StartSym)<br>
+    Asm.OutStreamer->EmitLabel(<wbr>StartSym);<br>
+}<br>
+<br>
 void DwarfStringPool::emit(<wbr>AsmPrinter &Asm, MCSection *StrSection,<br>
                            MCSection *OffsetSection, bool UseRelativeOffsets) {<br>
   if (Pool.empty())<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfStringPool.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfStringPool.h?rev=337933&r1=337932&r2=337933&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/AsmPrinter/<wbr>DwarfStringPool.h?rev=337933&<wbr>r1=337932&r2=337933&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfStringPool.h (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>AsmPrinter/DwarfStringPool.h Wed Jul 25 08:33:32 2018<br>
@@ -19,6 +19,7 @@ namespace llvm {<br>
<br>
 class AsmPrinter;<br>
 class MCSection;<br>
+class MCSymbol;<br>
<br>
 // Collection of strings for this unit and assorted symbols.<br>
 // A String->Symbol mapping of strings used by indirect<br>
@@ -36,6 +37,9 @@ public:<br>
<br>
   DwarfStringPool(<wbr>BumpPtrAllocator &A, AsmPrinter &Asm, StringRef Prefix);<br>
<br>
+  void emitStringOffsetsTableHeader(<wbr>AsmPrinter &Asm, MCSection *OffsetSection,<br>
+                                    MCSymbol *StartSym);<br>
+<br>
   void emit(AsmPrinter &Asm, MCSection *StrSection,<br>
             MCSection *OffsetSection = nullptr,<br>
             bool UseRelativeOffsets = false);<br>
<br>
Modified: llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DWARFDebugInfoTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp?rev=337933&r1=337932&r2=337933&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DWARFDebugInfoTest.cpp?rev=<wbr>337933&r1=337932&r2=337933&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DWARFDebugInfoTest.cpp (original)<br>
+++ llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DWARFDebugInfoTest.cpp Wed Jul 25 08:33:32 2018<br>
@@ -67,12 +67,23 @@ void TestAllForms() {<br>
   const uint32_t Dwarf32Values[] = {1, 2, 3, 4, 5, 6, 7, 8};<br>
   const char *StringValue = "Hello";<br>
   const char *StrpValue = "World";<br>
+  const char *StrxValue = "Indexed";<br>
+  const char *Strx1Value = "Indexed1";<br>
+  const char *Strx2Value = "Indexed2";<br>
+  const char *Strx3Value = "Indexed3";<br>
+  const char *Strx4Value = "Indexed4";<br>
<br>
   auto ExpectedDG = dwarfgen::Generator::create(<wbr>Triple, Version);<br>
   ASSERT_THAT_EXPECTED(<wbr>ExpectedDG, Succeeded());<br>
   dwarfgen::Generator *DG = ExpectedDG.get().get();<br>
   dwarfgen::CompileUnit &CU = DG->addCompileUnit();<br>
   dwarfgen::DIE CUDie = CU.getUnitDIE();<br>
+<br>
+  if (Version >= 5)<br>
+    CUDie.addAttribute(dwarf::DW_<wbr>AT_str_offsets_base, dwarf::DW_FORM_sec_offset,<br>
+                       *MCSymbolRefExpr::create(DG-><wbr>getStringOffsetsStartSym(),<br>
+                                                *DG->getMCContext()));<br>
+<br>
   uint16_t Attr = DW_AT_lo_user;<br>
<br>
   //----------------------------<wbr>------------------------------<wbr>------------<br>
@@ -122,6 +133,19 @@ void TestAllForms() {<br>
   const auto Attr_DW_FORM_string = static_cast<dwarf::Attribute>(<wbr>Attr++);<br>
   CUDie.addAttribute(Attr_DW_<wbr>FORM_string, DW_FORM_string, StringValue);<br>
<br>
+  const auto Attr_DW_FORM_strx = static_cast<dwarf::Attribute>(<wbr>Attr++);<br>
+  const auto Attr_DW_FORM_strx1 = static_cast<dwarf::Attribute>(<wbr>Attr++);<br>
+  const auto Attr_DW_FORM_strx2 = static_cast<dwarf::Attribute>(<wbr>Attr++);<br>
+  const auto Attr_DW_FORM_strx3 = static_cast<dwarf::Attribute>(<wbr>Attr++);<br>
+  const auto Attr_DW_FORM_strx4 = static_cast<dwarf::Attribute>(<wbr>Attr++);<br>
+  if (Version >= 5) {<br>
+    CUDie.addAttribute(Attr_DW_<wbr>FORM_strx, DW_FORM_strx, StrxValue);<br>
+    CUDie.addAttribute(Attr_DW_<wbr>FORM_strx1, DW_FORM_strx1, Strx1Value);<br>
+    CUDie.addAttribute(Attr_DW_<wbr>FORM_strx2, DW_FORM_strx2, Strx2Value);<br>
+    CUDie.addAttribute(Attr_DW_<wbr>FORM_strx3, DW_FORM_strx3, Strx3Value);<br>
+    CUDie.addAttribute(Attr_DW_<wbr>FORM_strx4, DW_FORM_strx4, Strx4Value);<br>
+  }<br>
+<br>
   const auto Attr_DW_FORM_strp = static_cast<dwarf::Attribute>(<wbr>Attr++);<br>
   CUDie.addAttribute(Attr_DW_<wbr>FORM_strp, DW_FORM_strp, StrpValue);<br>
<br>
@@ -281,11 +305,33 @@ void TestAllForms() {<br>
   //----------------------------<wbr>------------------------------<wbr>------------<br>
   auto ExtractedStringValue = toString(DieDG.find(Attr_DW_<wbr>FORM_string));<br>
   EXPECT_TRUE((bool)<wbr>ExtractedStringValue);<br>
-  EXPECT_TRUE(strcmp(<wbr>StringValue, *ExtractedStringValue) == 0);<br>
+  EXPECT_STREQ(StringValue, *ExtractedStringValue);<br>
+<br>
+  if (Version >= 5) {<br>
+    auto ExtractedStrxValue = toString(DieDG.find(Attr_DW_<wbr>FORM_strx));<br>
+    EXPECT_TRUE((bool)<wbr>ExtractedStrxValue);<br>
+    EXPECT_STREQ(StrxValue, *ExtractedStrxValue);<br>
+<br>
+    auto ExtractedStrx1Value = toString(DieDG.find(Attr_DW_<wbr>FORM_strx1));<br>
+    EXPECT_TRUE((bool)<wbr>ExtractedStrx1Value);<br>
+    EXPECT_STREQ(Strx1Value, *ExtractedStrx1Value);<br>
+<br>
+    auto ExtractedStrx2Value = toString(DieDG.find(Attr_DW_<wbr>FORM_strx2));<br>
+    EXPECT_TRUE((bool)<wbr>ExtractedStrx2Value);<br>
+    EXPECT_STREQ(Strx2Value, *ExtractedStrx2Value);<br>
+<br>
+    auto ExtractedStrx3Value = toString(DieDG.find(Attr_DW_<wbr>FORM_strx3));<br>
+    EXPECT_TRUE((bool)<wbr>ExtractedStrx3Value);<br>
+    EXPECT_STREQ(Strx3Value, *ExtractedStrx3Value);<br>
+<br>
+    auto ExtractedStrx4Value = toString(DieDG.find(Attr_DW_<wbr>FORM_strx4));<br>
+    EXPECT_TRUE((bool)<wbr>ExtractedStrx4Value);<br>
+    EXPECT_STREQ(Strx4Value, *ExtractedStrx4Value);<br>
+  }<br>
<br>
   auto ExtractedStrpValue = toString(DieDG.find(Attr_DW_<wbr>FORM_strp));<br>
   EXPECT_TRUE((bool)<wbr>ExtractedStrpValue);<br>
-  EXPECT_TRUE(strcmp(StrpValue, *ExtractedStrpValue) == 0);<br>
+  EXPECT_STREQ(StrpValue, *ExtractedStrpValue);<br>
<br>
   //----------------------------<wbr>------------------------------<wbr>------------<br>
   // Test reference forms<br>
<br>
Modified: llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/DebugInfo/DWARF/DwarfGenerator.cpp?rev=337933&r1=337932&r2=337933&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.cpp?rev=337933&<wbr>r1=337932&r2=337933&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.cpp (original)<br>
+++ llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.cpp Wed Jul 25 08:33:32 2018<br>
@@ -54,16 +54,36 @@ void dwarfgen::DIE::addAttribute(<wbr>uint16_<br>
 }<br>
<br>
 void dwarfgen::DIE::addAttribute(<wbr>uint16_t A, dwarf::Form Form,<br>
+                                 const MCExpr &Expr) {<br>
+  auto &DG = CU->getGenerator();<br>
+  Die->addValue(DG.getAllocator(<wbr>), static_cast<dwarf::Attribute>(<wbr>A), Form,<br>
+                DIEExpr(&Expr));<br>
+}<br>
+<br>
+void dwarfgen::DIE::addAttribute(<wbr>uint16_t A, dwarf::Form Form,<br>
                                  StringRef String) {<br>
   auto &DG = CU->getGenerator();<br>
-  if (Form == DW_FORM_string) {<br>
+  switch (Form) {<br>
+  case DW_FORM_string:<br>
     Die->addValue(DG.getAllocator(<wbr>), static_cast<dwarf::Attribute>(<wbr>A), Form,<br>
                   new (DG.getAllocator())<br>
                       DIEInlineString(String, DG.getAllocator()));<br>
-  } else {<br>
+    break;<br>
+<br>
+  case DW_FORM_strp:<br>
+  case DW_FORM_GNU_str_index:<br>
+  case DW_FORM_strx:<br>
+  case DW_FORM_strx1:<br>
+  case DW_FORM_strx2:<br>
+  case DW_FORM_strx3:<br>
+  case DW_FORM_strx4:<br>
     Die->addValue(<br>
         DG.getAllocator(), static_cast<dwarf::Attribute>(<wbr>A), Form,<br>
         DIEString(DG.getStringPool().<wbr>getEntry(*DG.getAsmPrinter(), String)));<br>
+    break;<br>
+<br>
+  default:<br>
+    llvm_unreachable("Unhandled form!");<br>
   }<br>
 }<br>
<br>
@@ -427,6 +447,7 @@ llvm::Error dwarfgen::Generator::init(Tr<br>
   Asm->setDwarfVersion(Version);<br>
<br>
   StringPool = llvm::make_unique<<wbr>DwarfStringPool>(Allocator, *Asm, StringRef());<br>
+  StringOffsetsStartSym = Asm->createTempSymbol("str_<wbr>offsets_base");<br>
<br>
   return Error::success();<br>
 }<br>
@@ -448,7 +469,12 @@ StringRef dwarfgen::Generator::generate(<br>
     CU->setLength(CUOffset - 4);<br>
   }<br>
   Abbreviations.Emit(Asm.get(), MOFI->getDwarfAbbrevSection())<wbr>;<br>
-  StringPool->emit(*Asm, MOFI->getDwarfStrSection());<br>
+<br>
+  StringPool-><wbr>emitStringOffsetsTableHeader(*<wbr>Asm, MOFI->getDwarfStrOffSection(),<br>
+                                           StringOffsetsStartSym);<br>
+  StringPool->emit(*Asm, MOFI->getDwarfStrSection(),<br>
+                   MOFI->getDwarfStrOffSection())<wbr>;<br>
+<br>
   MS->SwitchSection(MOFI-><wbr>getDwarfInfoSection());<br>
   for (auto &CU : CompileUnits) {<br>
     uint16_t Version = CU->getVersion();<br>
<br>
Modified: llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/DebugInfo/DWARF/DwarfGenerator.h?rev=337933&r1=337932&r2=337933&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.h?rev=337933&<wbr>r1=337932&r2=337933&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.h (original)<br>
+++ llvm/trunk/unittests/<wbr>DebugInfo/DWARF/<wbr>DwarfGenerator.h Wed Jul 25 08:33:32 2018<br>
@@ -89,6 +89,14 @@ public:<br>
   /// \param U the unsigned integer to encode.<br>
   void addAttribute(uint16_t Attr, dwarf::Form Form, uint64_t U);<br>
<br>
+  /// Add an attribute value to be encoded as a DIEExpr<br>
+  ///<br>
+  /// \param Attr a dwarf::Attribute enumeration value or any uint16_t that<br>
+  /// represents a user defined DWARF attribute.<br>
+  /// \param Form the dwarf::Form to use when encoding the attribute.<br>
+  /// \param Expr the MC expression used to compute the value<br>
+  void addAttribute(uint16_t Attr, dwarf::Form Form, const MCExpr &Expr);<br>
+<br>
   /// Add an attribute value to be encoded as a DIEString or DIEInlinedString.<br>
   ///<br>
   /// \param Attr a dwarf::Attribute enumeration value or any uint16_t that<br>
@@ -242,6 +250,8 @@ class Generator {<br>
   std::vector<std::unique_ptr<<wbr>LineTable>> LineTables;<br>
   DIEAbbrevSet Abbreviations;<br>
<br>
+  MCSymbol *StringOffsetsStartSym;<br>
+<br>
   SmallString<4096> FileBytes;<br>
   /// The stream we use to generate the DWARF into as an ELF file.<br>
   std::unique_ptr<raw_svector_<wbr>ostream> Stream;<br>
@@ -293,6 +303,7 @@ public:<br>
   MCContext *getMCContext() const { return MC.get(); }<br>
   DIEAbbrevSet &getAbbrevSet() { return Abbreviations; }<br>
   DwarfStringPool &getStringPool() { return *StringPool; }<br>
+  MCSymbol *getStringOffsetsStartSym() const { return StringOffsetsStartSym; }<br>
<br>
   /// Save the generated DWARF file to disk.<br>
   ///<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>