[PATCH] Fix dumping codeview line tables when there are multiple debug sections

Timur Iskhodzhanov timurrrr at google.com
Mon Oct 6 10:10:40 PDT 2014


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.

Thanks for the patch!

--
Tim

2014-10-03 17:32 GMT+04:00 Timur Iskhodzhanov <timurrrr at google.com>:

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


More information about the llvm-commits mailing list