<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>