[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