[llvm] r321883 - [PDB] Correctly link S_FILESTATIC records.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 8 11:50:13 PST 2018


In the meantime I'm trying to reproduce this on my linux box.  I have an
idea how to track it down if I can get a repro.

On Mon, Jan 8, 2018 at 11:32 AM Zachary Turner <zturner at google.com> wrote:

> We were just discussing this in another thread.  And I mentioned that this
> is the exact same bug that happened several months ago.  At the time, you
> sent me this mail:
>
> ---
> This is the write to the byte before the first uninitialized.
>
> #0  __memmove_ssse3_back () at
> ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:2720
> #1  0x000000000044bb4c in __msan_memcpy () at
> /code/llvm/projects/compiler-rt/lib/msan/msan_interceptors.cc:1455
> #2  0x00000000007a3999 in writeBytes () at
> /code/llvm/include/llvm/Support/BinaryByteStream.h:121
> #3  writeBytes () at /code/llvm/lib/Support/BinaryStreamRef.cpp:59
> #4  0x00000000007a2f91 in writeBytes () at
> /code/llvm/lib/Support/BinaryStreamRef.cpp:129
> #5  0x00000000007a46fe in writeBytes () at
> /code/llvm/lib/Support/BinaryStreamWriter.cpp:29
> #6  0x00000000008de26e in commit () at
> /code/llvm/lib/DebugInfo/CodeView/DebugSymbolsSubsection.cpp:25
> #7  0x000000000051bb9e in commit () at
> /code/llvm/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp:77
> #8  0x00000000004a50e1 in toDebugS () at
> /code/llvm/tools/yaml2obj/yaml2coff.cpp:193
> #9  layoutCOFF () at /code/llvm/tools/yaml2obj/yaml2coff.cpp:232
> #10 yaml2coff () at /code/llvm/tools/yaml2obj/yaml2coff.cpp:602
> #11 0x000000000049b3e7 in convertYAML () at
> /code/llvm/tools/yaml2obj/yaml2obj.cpp:59
> #12 main () at /code/llvm/tools/yaml2obj/yaml2obj.cpp:94
>
> There are no writes to the uninitialized byte, accoring to gdb.
> ---
>
> I don't know how you came up with this stack trace, but if it's not too
> much work, would you be able to generate a similar stack trace for this one?
>
> On Mon, Jan 8, 2018 at 11:24 AM Evgenii Stepanov <
> eugeni.stepanov at gmail.com> wrote:
>
>> Hi,
>>
>> MSan is not happy with this change:
>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/12211
>>
>> Uninitialized bytes in __interceptor_write at offset 316 inside
>> [0x720000085000, 1998)
>> ==5173==WARNING: MemorySanitizer: use-of-uninitialized-value
>>     #0 0x6cf04d in llvm::raw_fd_ostream::write_impl(char const*,
>> unsigned long)
>> /b/sanitizer-x86_64-linux-fast/build/llvm/lib/Support/raw_ostream.cpp:600:19
>>     #1 0x4aaa8b in flush
>>
>> /b/sanitizer-x86_64-linux-fast/build/llvm/include/llvm/Support/raw_ostream.h:142:7
>>     #2 0x4aaa8b in main
>> /b/sanitizer-x86_64-linux-fast/build/llvm/tools/yaml2obj/yaml2obj.cpp:98
>>     #3 0x7f5d8f8b92b0 in __libc_start_main
>> (/lib/x86_64-linux-gnu/libc.so.6+0x202b0)
>>     #4 0x43cd19 in _start
>>
>> (/b/sanitizer-x86_64-linux-fast/build/llvm_build_msan/bin/yaml2obj+0x43cd19)
>>
>>
>> On Fri, Jan 5, 2018 at 11:12 AM, Zachary Turner via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>> > Author: zturner
>> > Date: Fri Jan  5 11:12:40 2018
>> > New Revision: 321883
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=321883&view=rev
>> > Log:
>> > [PDB] Correctly link S_FILESTATIC records.
>> >
>> > This is not a record type that clang currently generates,
>> > but it is a record that is encountered in object files generated
>> > by cl.  This record is unusual in that it refers directly to
>> > the string table instead of indirectly to the string table via
>> > the FileChecksums table.  Because of this, it was previously
>> > overlooked and we weren't remapping the string indices at all.
>> > This would lead to crashes in MSVC when trying to display a
>> > variable whose debug info involved an S_FILESTATIC.
>> >
>> > Original bug report by Alexander Ganea
>> >
>> > Differential Revision: https://reviews.llvm.org/D41718
>> >
>> > Modified:
>> >     llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp
>> >     llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.h
>> >     llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.cpp
>> >     llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.h
>> >
>> > Modified: llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp?rev=321883&r1=321882&r2=321883&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp (original)
>> > +++ llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp Fri Jan  5
>> 11:12:40 2018
>> > @@ -848,14 +848,7 @@ Error DumpOutputStyle::dumpXme() {
>> >    return Error::success();
>> >  }
>> >
>> > -Error DumpOutputStyle::dumpStringTable() {
>> > -  printHeader(P, "String Table");
>> > -
>> > -  if (File.isObj()) {
>> > -    P.formatLine("Dumping string table is not supported for object
>> files");
>> > -    return Error::success();
>> > -  }
>> > -
>> > +Error DumpOutputStyle::dumpStringTableFromPdb() {
>> >    AutoIndent Indent(P);
>> >    auto IS = getPdb().getStringTable();
>> >    if (!IS) {
>> > @@ -895,6 +888,36 @@ Error DumpOutputStyle::dumpStringTable()
>> >    return Error::success();
>> >  }
>> >
>> > +Error DumpOutputStyle::dumpStringTableFromObj() {
>> > +  iterateModuleSubsections<DebugStringTableSubsectionRef>(
>> > +      File, PrintScope{P, 4},
>> > +      [&](uint32_t Modi, const SymbolGroup &Strings,
>> > +          DebugStringTableSubsectionRef &Strings2) {
>> > +        BinaryStreamRef StringTableBuffer = Strings2.getBuffer();
>> > +        BinaryStreamReader Reader(StringTableBuffer);
>> > +        while (Reader.bytesRemaining() > 0) {
>> > +          StringRef Str;
>> > +          uint32_t Offset = Reader.getOffset();
>> > +          cantFail(Reader.readCString(Str));
>> > +          if (Str.empty())
>> > +            continue;
>> > +
>> > +          P.formatLine("{0} | {1}", fmt_align(Offset,
>> AlignStyle::Right, 4),
>> > +                       Str);
>> > +        }
>> > +      });
>> > +  return Error::success();
>> > +}
>> > +
>> > +Error DumpOutputStyle::dumpStringTable() {
>> > +  printHeader(P, "String Table");
>> > +
>> > +  if (File.isPdb())
>> > +    return dumpStringTableFromPdb();
>> > +
>> > +  return dumpStringTableFromObj();
>> > +}
>> > +
>> >  static void buildDepSet(LazyRandomTypeCollection &Types,
>> >                          ArrayRef<TypeIndex> Indices,
>> >                          std::map<TypeIndex, CVType> &DepSet) {
>> > @@ -1124,6 +1147,7 @@ Error DumpOutputStyle::dumpModuleSymsFor
>> >        File, PrintScope{P, 2},
>> >        [&](uint32_t Modi, const SymbolGroup &Strings,
>> >            DebugSymbolsSubsectionRef &Symbols) {
>> > +        Dumper.setSymbolGroup(&Strings);
>> >          for (auto Symbol : Symbols) {
>> >            if (auto EC = Visitor.visitSymbolRecord(Symbol)) {
>> >              SymbolError = llvm::make_unique<Error>(std::move(EC));
>> > @@ -1165,8 +1189,8 @@ Error DumpOutputStyle::dumpModuleSymsFor
>> >
>> >          SymbolVisitorCallbackPipeline Pipeline;
>> >          SymbolDeserializer Deserializer(nullptr,
>> CodeViewContainer::Pdb);
>> > -        MinimalSymbolDumper Dumper(P, opts::dump::DumpSymRecordBytes,
>> Ids,
>> > -                                   Types);
>> > +        MinimalSymbolDumper Dumper(P, opts::dump::DumpSymRecordBytes,
>> Strings,
>> > +                                   Ids, Types);
>> >
>> >          Pipeline.addCallbackToPipeline(Deserializer);
>> >          Pipeline.addCallbackToPipeline(Dumper);
>> >
>> > Modified: llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.h
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.h?rev=321883&r1=321882&r2=321883&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.h (original)
>> > +++ llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.h Fri Jan  5 11:12:40
>> 2018
>> > @@ -75,6 +75,8 @@ private:
>> >    Error dumpSymbolStats();
>> >    Error dumpUdtStats();
>> >    Error dumpStringTable();
>> > +  Error dumpStringTableFromPdb();
>> > +  Error dumpStringTableFromObj();
>> >    Error dumpLines();
>> >    Error dumpInlineeLines();
>> >    Error dumpXmi();
>> >
>> > Modified: llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.cpp?rev=321883&r1=321882&r2=321883&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.cpp (original)
>> > +++ llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.cpp Fri Jan  5
>> 11:12:40 2018
>> > @@ -10,6 +10,7 @@
>> >  #include "MinimalSymbolDumper.h"
>> >
>> >  #include "FormatUtil.h"
>> > +#include "InputFile.h"
>> >  #include "LinePrinter.h"
>> >
>> >  #include "llvm/DebugInfo/CodeView/CVRecord.h"
>> > @@ -18,6 +19,7 @@
>> >  #include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
>> >  #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
>> >  #include "llvm/DebugInfo/CodeView/TypeRecord.h"
>> > +#include "llvm/DebugInfo/PDB/Native/PDBStringTable.h"
>> >  #include "llvm/Support/FormatVariadic.h"
>> >
>> >  using namespace llvm;
>> > @@ -450,6 +452,17 @@ Error MinimalSymbolDumper::visitKnownRec
>> >  Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
>> FileStaticSym &FS) {
>> >    P.format(" `{0}`", FS.Name);
>> >    AutoIndent Indent(P, 7);
>> > +  if (SymGroup) {
>> > +    Expected<StringRef> FileName =
>> > +        SymGroup->getNameFromStringTable(FS.ModFilenameOffset);
>> > +    if (FileName) {
>> > +      P.formatLine("type = {0}, file name = {1} ({2}), flags = {3}",
>> > +                   typeIndex(FS.Index), FS.ModFilenameOffset,
>> *FileName,
>> > +                   formatLocalSymFlags(P.getIndentLevel() + 9,
>> FS.Flags));
>> > +    }
>> > +    return Error::success();
>> > +  }
>> > +
>> >    P.formatLine("type = {0}, file name offset = {1}, flags = {2}",
>> >                 typeIndex(FS.Index), FS.ModFilenameOffset,
>> >                 formatLocalSymFlags(P.getIndentLevel() + 9, FS.Flags));
>> >
>> > Modified: llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.h
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.h?rev=321883&r1=321882&r2=321883&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.h (original)
>> > +++ llvm/trunk/tools/llvm-pdbutil/MinimalSymbolDumper.h Fri Jan  5
>> 11:12:40 2018
>> > @@ -19,6 +19,7 @@ class LazyRandomTypeCollection;
>> >
>> >  namespace pdb {
>> >  class LinePrinter;
>> > +class SymbolGroup;
>> >
>> >  class MinimalSymbolDumper : public codeview::SymbolVisitorCallbacks {
>> >  public:
>> > @@ -26,11 +27,19 @@ public:
>> >                        codeview::LazyRandomTypeCollection &Ids,
>> >                        codeview::LazyRandomTypeCollection &Types)
>> >        : P(P), RecordBytes(RecordBytes), Ids(Ids), Types(Types) {}
>> > +  MinimalSymbolDumper(LinePrinter &P, bool RecordBytes,
>> > +                      const SymbolGroup &SymGroup,
>> > +                      codeview::LazyRandomTypeCollection &Ids,
>> > +                      codeview::LazyRandomTypeCollection &Types)
>> > +      : P(P), RecordBytes(RecordBytes), SymGroup(&SymGroup), Ids(Ids),
>> > +        Types(Types) {}
>> >
>> >    Error visitSymbolBegin(codeview::CVSymbol &Record) override;
>> >    Error visitSymbolBegin(codeview::CVSymbol &Record, uint32_t Offset)
>> override;
>> >    Error visitSymbolEnd(codeview::CVSymbol &Record) override;
>> >
>> > +  void setSymbolGroup(const SymbolGroup *Group) { SymGroup = Group; }
>> > +
>> >  #define SYMBOL_RECORD(EnumName, EnumVal, Name)
>>          \
>> >    virtual Error visitKnownRecord(codeview::CVSymbol &CVR,
>>         \
>> >                                   codeview::Name &Record) override;
>> > @@ -45,6 +54,7 @@ private:
>> >
>> >    LinePrinter &P;
>> >    bool RecordBytes;
>> > +  const SymbolGroup *SymGroup = nullptr;
>> >    codeview::LazyRandomTypeCollection &Ids;
>> >    codeview::LazyRandomTypeCollection &Types;
>> >  };
>> >
>> >
>> > _______________________________________________
>> > llvm-commits mailing list
>> > llvm-commits at lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180108/4f9d798a/attachment-0001.html>


More information about the llvm-commits mailing list