<div dir="ltr">It's been 2 weeks, so I've decided to move forward and committed a very similar patch in r219125 mentioning you as the author of the original patch.  Please tell me if you're OK with that.<div><br></div><div>Thanks for the patch!</div><div><br></div><div>--</div><div>Tim</div></div><div class="gmail_extra"><br><div class="gmail_quote">2014-10-03 17:32 GMT+04:00 Timur Iskhodzhanov <span dir="ltr"><<a href="mailto:timurrrr@google.com" target="_blank">timurrrr@google.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Ping?<br>
<div class="HOEnZb"><div class="h5"><br>
2014-09-24 21:25 GMT+04:00 Timur Iskhodzhanov <<a href="mailto:timurrrr@google.com">timurrrr@google.com</a>>:<br>
> Or I can just generate my own file and commit on your behalf?<br>
><br>
> 2014-09-23 18:01 GMT+04:00 Timur Iskhodzhanov <<a href="mailto:timurrrr@google.com">timurrrr@google.com</a>>:<br>
>> Hi Jeff,<br>
>><br>
>> Can you please take a look at r218303 and add similar instructions for<br>
>> reproducing the object file?<br>
>><br>
>> --<br>
>> Thanks,<br>
>> Tim<br>
>><br>
>> 2014-09-22 20:37 GMT+04:00 Eric Christopher <<a href="mailto:echristo@gmail.com">echristo@gmail.com</a>>:<br>
>>> No objections here. Thanks!<br>
>>><br>
>>> -eric<br>
>>><br>
>>> On Mon, Sep 22, 2014 at 3:29 AM, Timur Iskhodzhanov <<a href="mailto:timurrrr@google.com">timurrrr@google.com</a>> wrote:<br>
>>>> [Side note: are there any reasons not to use <a href="http://reviews.llvm.org" target="_blank">reviews.llvm.org</a> for<br>
>>>> these patches?]<br>
>>>><br>
>>>><br>
>>>><br>
>>>> 2014-09-20 0:03 GMT+04:00 Jeff Muizelaar <<a href="mailto:jmuizelaar@mozilla.com">jmuizelaar@mozilla.com</a>>:<br>
>>>>> Codeview line tables for functions in different sections refer to a common<br>
>>>>> STRING_TABLE_SUBSECTION for filenames. This happens<br>
>>>>> when building with -Gy or with inline functions with MSVC.<br>
>>>>><br>
>>>>> diff --git a/test/tools/llvm-readobj/Inputs/comdat-function-linetables.obj.coff-2008-i386 b/test/tools/llvm-readobj/Inputs/comdat-function-linetables.obj.coff-2008-i386<br>
>>>>> new file mode 100644<br>
>>>>> index 0000000000000000000000000000000000000000..45416d52c3644aeb8395820268d36693e78d7431<br>
>>>>> GIT binary patch<br>
>>>>> literal 1635<br>
>>>>> zcmcIkF>ljQ5I)zWX$mTC#lX<vQAL6Z>}Du}7OJLAn}SGa)TC7@29elKFiPquc1p_B<br>
>>>>> zfeoaxvcbf{!Uhrx>IxeYKLQpg2qA>Zou8j^3T$xF`Q3f*-uK@5-n*O>ht~^Fi}4u1<br>
>>>>> z5OC4VmSuPwR^Y-I8mA=T1!KPgnrT(qwPaDuJi?f(`{L4|%xa$1@k9`g{ixr2A^@69<br>
>>>>> zDcso4_Y(1#4Dbq-1dj-5<<ES(L5v@WpTF__z_=F&cvQ&8^C*e6!)Uw@VgyEcFviB_<br>
>>>>> z=Cd=)xl-=p?Boc3GWpU-H@KLayF8PhFOD!`_=viTIt0=nQDr7|&vHG@soa7|I6o*c<br>
>>>>> zfH)k+nM6kl$GmN{9M`FO?8MS2TWorE!@gs$*I34BH0`?8g2ym52*z!b2*Ie+P-r=|<br>
>>>>> zR=L5l7~tx^C{}E@U9PjD*EVg3O=u~7C8JmDb=|0IR>uOPVS<`<A}3>N)<k#1m`G_&<br>
>>>>> zv%*w^sSBG-T|2|nRi@@kOf41A1h-{?pN?Sw2GS|SBFyMB>QPj>5sGx=&G6Ul@$H*$<br>
>>>>> zPe1HQ=%eTOe`(_!7{O0LmSic#l2)b3rf{&EjQnwSl3n)!#0lVz%bl}0i@`a6Ml&kK<br>
>>>>> z@`hzDSv8lbgcp3Af^e=-#vkO;0@`-@-iPOO1+MK-rM{phQH9VYjmjZ(=#Gi1UPAjg<br>
>>>>> zD1KE%9Ic_4K2%8&s8oev7z$kh2P3|N9_R)5gnlYAC-x^kaW0JAA|G{&_Q11j(YYu#<br>
>>>>> z4y%E65cI(6hx;M+AjBwd-0=VBUHeyg$Ai2vXFu;mkT<;>o;O)MZ?bsa9HYEBMwROY<br>
>>>>> z$?tLl(5Hkg2}_eU@MUSXndsbwy*>KF>8e%sv{Z_2FGr$nkx*G0!*91lTNrgXS)!)c<br>
>>>>> zEzx%9S5p$Tez(&&#@|bnht4faelrY+WWN=XLvtiDFuX=lX1dvO$h`UN+mqj!=@xV|<br>
>>>>> m$3o@-qD6^u=17agYTznrlHEdYeY%=XUzxeEx(3rVVf_REpWBT9<br>
>>>>><br>
>>>>> literal 0<br>
>>>>> HcmV?d00001<br>
>>>>><br>
>>>>> diff --git a/test/tools/llvm-readobj/codeview-linetables.test b/test/tools/llvm-readobj/codeview-linetables.test<br>
>>>>> index 4854d7a..b908a59 100644<br>
>>>>> --- a/test/tools/llvm-readobj/codeview-linetables.test<br>
>>>>> +++ b/test/tools/llvm-readobj/codeview-linetables.test<br>
>>>>> @@ -6,6 +6,8 @@ RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifile-linetables.obj.cof<br>
>>>>>  RUN:   | FileCheck %s -check-prefix MFILE32<br>
>>>>>  RUN: llvm-readobj -s -codeview-linetables %p/Inputs/multifile-linetables.obj.coff-2012-x86_64 \<br>
>>>>>  RUN:   | FileCheck %s -check-prefix MFILE64<br>
>>>>> +RUN: llvm-readobj -s -codeview-linetables %p/Inputs/comdat-function-linetables.obj.coff-2008-i386 \<br>
>>>>> +RUN:   | FileCheck %s -check-prefix MCOMDAT<br>
>>>>><br>
>>>>>  MFUN32:      CodeViewLineTables [<br>
>>>>>  MFUN32-NEXT:   Magic: 0x4<br>
>>>>> @@ -280,3 +282,24 @@ MFILE64-NEXT:       +0x13: 8<br>
>>>>>  MFILE64-NEXT:     ]<br>
>>>>>  MFILE64-NEXT:   ]<br>
>>>>>  MFILE64-NEXT: ]<br>
>>>>> +<br>
>>>>> +MCOMDAT:      FunctionLineTable [<br>
>>>>> +MCOMDAT-NEXT:        FunctionName: ?f@@YAHXZ<br>
>>>>> +MCOMDAT-NEXT:        CodeSize: 0xA<br>
>>>>> +MCOMDAT-NEXT:        FilenameSegment [<br>
>>>>> +MCOMDAT-NEXT:          Filename: c:\test.cc<br>
>>>>> +MCOMDAT-NEXT:          +0x0: 2<br>
>>>>> +MCOMDAT-NEXT:          +0x3: 3<br>
>>>>> +MCOMDAT-NEXT:          +0x8: 4<br>
>>>>> +MCOMDAT-NEXT:        ]<br>
>>>>> +MCOMDAT-NEXT:      ]<br>
>>>>> +MCOMDAT:      FunctionLineTable [<br>
>>>>> +MCOMDAT-NEXT:        FunctionName: ?g@@YAHXZ<br>
>>>>> +MCOMDAT-NEXT:        CodeSize: 0xA<br>
>>>>> +MCOMDAT-NEXT:        FilenameSegment [<br>
>>>>> +MCOMDAT-NEXT:          Filename: c:\test.cc<br>
>>>>> +MCOMDAT-NEXT:          +0x0: 7<br>
>>>>> +MCOMDAT-NEXT:          +0x3: 8<br>
>>>>> +MCOMDAT-NEXT:          +0x8: 9<br>
>>>>> +MCOMDAT-NEXT:        ]<br>
>>>>> +MCOMDAT-NEXT:      ]<br>
>>>>> diff --git a/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp<br>
>>>>> index 68a403c..4940481 100644<br>
>>>>> --- a/tools/llvm-readobj/COFFDumper.cpp<br>
>>>>> +++ b/tools/llvm-readobj/COFFDumper.cpp<br>
>>>>> @@ -78,6 +78,8 @@ private:<br>
>>>>><br>
>>>>>    const llvm::object::COFFObjectFile *Obj;<br>
>>>>>    RelocMapTy RelocMap;<br>
>>>>> +  StringRef CVFileIndexToStringOffsetTable;<br>
>>>>> +  StringRef CVStringTable;<br>
>>>>>  };<br>
>>>>><br>
>>>>>  } // namespace<br>
>>>><br>
>>>> Eric,<br>
>>>> Are you fine with adding these fields to the COFFDumper class?<br>
>>>><br>
>>>>> @@ -440,8 +442,6 @@ void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {<br>
>>>>><br>
>>>>>    SmallVector<StringRef, 10> FunctionNames;<br>
>>>>>    StringMap<StringRef> FunctionLineTables;<br>
>>>>> -  StringRef FileIndexToStringOffsetTable;<br>
>>>>> -  StringRef StringTable;<br>
>>>>><br>
>>>>>    ListScope D(W, "CodeViewLineTables");<br>
>>>>>    {<br>
>>>>> @@ -502,25 +502,25 @@ void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {<br>
>>>>>          break;<br>
>>>>>        }<br>
>>>>>        case COFF::DEBUG_STRING_TABLE_SUBSECTION:<br>
>>>>> -        if (PayloadSize == 0 || StringTable.data() != nullptr ||<br>
>>>>> +        if (PayloadSize == 0 || CVStringTable.data() != nullptr ||<br>
>>>>>              Contents.back() != '\0') {<br>
>>>>>            // Empty or duplicate or non-null-terminated subsection.<br>
>>>>>            error(object_error::parse_failed);<br>
>>>>>            return;<br>
>>>>>          }<br>
>>>>> -        StringTable = Contents;<br>
>>>>> +        CVStringTable = Contents;<br>
>>>>>          break;<br>
>>>>>        case COFF::DEBUG_INDEX_SUBSECTION:<br>
>>>>>          // Holds the translation table from file indices<br>
>>>>>          // to offsets in the string table.<br>
>>>>><br>
>>>>>          if (PayloadSize == 0 ||<br>
>>>>> -            FileIndexToStringOffsetTable.data() != nullptr) {<br>
>>>>> +            CVFileIndexToStringOffsetTable.data() != nullptr) {<br>
>>>>>            // Empty or duplicate subsection.<br>
>>>>>            error(object_error::parse_failed);<br>
>>>>>            return;<br>
>>>>>          }<br>
>>>>> -        FileIndexToStringOffsetTable = Contents;<br>
>>>>> +        CVFileIndexToStringOffsetTable = Contents;<br>
>>>>>          break;<br>
>>>>>        }<br>
>>>>>        Offset += PayloadSize;<br>
>>>>> @@ -555,7 +555,7 @@ void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {<br>
>>>>><br>
>>>>>        uint32_t FilenameOffset;<br>
>>>>>        {<br>
>>>>> -        DataExtractor SDE(FileIndexToStringOffsetTable, true, 4);<br>
>>>>> +        DataExtractor SDE(CVFileIndexToStringOffsetTable, true, 4);<br>
>>>>>          uint32_t OffsetInSDE = OffsetInIndex;<br>
>>>>>          if (!SDE.isValidOffset(OffsetInSDE)) {<br>
>>>>>            error(object_error::parse_failed);<br>
>>>>> @@ -564,15 +564,15 @@ void COFFDumper::printCodeViewLineTables(const SectionRef &Section) {<br>
>>>>>          FilenameOffset = SDE.getU32(&OffsetInSDE);<br>
>>>>>        }<br>
>>>>><br>
>>>>> -      if (FilenameOffset == 0 || FilenameOffset + 1 >= StringTable.size() ||<br>
>>>>> -          StringTable.data()[FilenameOffset - 1] != '\0') {<br>
>>>>> +      if (FilenameOffset == 0 || FilenameOffset + 1 >= CVStringTable.size() ||<br>
>>>>> +          CVStringTable.data()[FilenameOffset - 1] != '\0') {<br>
>>>>>          // Each string in an F3 subsection should be preceded by a null<br>
>>>>>          // character.<br>
>>>>>          error(object_error::parse_failed);<br>
>>>>>          return;<br>
>>>>>        }<br>
>>>>><br>
>>>>> -      StringRef Filename(StringTable.data() + FilenameOffset);<br>
>>>>> +      StringRef Filename(CVStringTable.data() + FilenameOffset);<br>
>>>>>        ListScope S(W, "FilenameSegment");<br>
>>>>>        W.printString("Filename", Filename);<br>
>>>>>        for (unsigned J = 0; J != SegmentLength && DE.isValidOffset(Offset);<br>
>>>>><br>
>>>>>        W.printString("Filename", Filename);<br>
>>>>>        for (unsigned J = 0; J != SegmentLength && DE.isValidOffset(Offset);<br>
>>>>><br>
>>>><br>
>>>> Otherwise LGTM<br>
</div></div></blockquote></div><br></div>