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

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


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/bb07efc0/attachment.html>


More information about the llvm-commits mailing list