[llvm] r328676 - Reapply "[DWARFv5] Emit file 0 to the line table."

Alexander Potapenko via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 28 05:40:00 PDT 2018


On Wed, Mar 28, 2018 at 2:21 PM Alexander Potapenko <glider at google.com>
wrote:

>
>
> On Wed, Mar 28, 2018 at 2:12 PM Alexander Potapenko <glider at google.com>
> wrote:
>
>>
>>
>> On Wed, Mar 28, 2018 at 12:43 AM Paul Robinson via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: probinson
>>> Date: Tue Mar 27 15:40:34 2018
>>> New Revision: 328676
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=328676&view=rev
>>> Log:
>>> Reapply "[DWARFv5] Emit file 0 to the line table."
>>>
>>> Hi Paul,
>>
>> I believe this patch broke the Linux kernel compilation with Clang.
>> I'm seeing the following error while trying to compile init/main.c:
>>
>> /tmp/main-088f96.s: Assembler messages:
>> /tmp/main-088f96.s:3: Error: file number less than one
>>
>> Here's the `as` invocation command that chokes on the ".file 0" directive:
>>
>> "/usr/bin/as" --64 -I ./arch/x86/include -I ./arch/x86/include/generated
>> -I ./include -I ./arch/x86/include/uapi -I
>> ./arch/x86/include/generated/uapi -I ./include/uapi -I
>> ./include/generated/uapi -o init/main.o main.s
>>
>> Basically, this change is incompatible with -no-integrated-as:
>
> $ cat t.c
> void foo() {}
> $ clang -no-integrated-as   -c  t.c -g
> /tmp/t-dcdec5.s: Assembler messages:
> /tmp/t-dcdec5.s:8: Error: file number less than one
> clang-7.0: error: assembler command failed with exit code 1 (use -v to see
> invocation)
>
> Sorry, I've reverted the DWARF patch again.

>
>
>> DWARF v5 specifies that the root file (also given in the DW_AT_name
>>> attribute of the compilation unit DIE) should be emitted explicitly to
>>> the line table's list of files.  This makes the line table more
>>> independent of the .debug_info section.
>>>
>>> Fixes the bug found by asan. Also XFAIL the new test for Darwin, which
>>> is stuck on DWARF v2, and fix up other tests so they stop failing on
>>> Windows.  Last but not least, don't break "clang -g" of an assembler
>>> file that has .file directives in it.
>>>
>>> Differential Revision: https://reviews.llvm.org/D44054
>>>
>>> Added:
>>>     llvm/trunk/test/MC/ELF/dwarf-file0.s
>>> Modified:
>>>     llvm/trunk/include/llvm/MC/MCContext.h
>>>     llvm/trunk/include/llvm/MC/MCDwarf.h
>>>     llvm/trunk/include/llvm/MC/MCStreamer.h
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
>>>     llvm/trunk/lib/MC/MCAsmStreamer.cpp
>>>     llvm/trunk/lib/MC/MCDwarf.cpp
>>>     llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>>>     llvm/trunk/lib/MC/MCStreamer.cpp
>>>     llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll
>>>     llvm/trunk/test/CodeGen/Generic/dwarf-source.ll
>>>     llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll
>>>     llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll
>>>     llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s
>>>     llvm/trunk/test/MC/ELF/debug-file-options.s
>>>     llvm/trunk/test/MC/ELF/debug-md5.s
>>>     llvm/trunk/test/MC/ELF/debug-source.s
>>>     llvm/trunk/tools/llvm-mc/llvm-mc.cpp
>>>
>>> Modified: llvm/trunk/include/llvm/MC/MCContext.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCContext.h?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/MC/MCContext.h (original)
>>> +++ llvm/trunk/include/llvm/MC/MCContext.h Tue Mar 27 15:40:34 2018
>>> @@ -537,8 +537,13 @@ namespace llvm {
>>>        DwarfCompileUnitID = CUIndex;
>>>      }
>>>
>>> -    void setMCLineTableCompilationDir(unsigned CUID, StringRef
>>> CompilationDir) {
>>> -      getMCDwarfLineTable(CUID).setCompilationDir(CompilationDir);
>>> +    /// Specifies the "root" file and directory of the compilation unit.
>>> +    /// These are "file 0" and "directory 0" in DWARF v5.
>>> +    void setMCLineTableRootFile(unsigned CUID, StringRef CompilationDir,
>>> +                                StringRef Filename, MD5::MD5Result
>>> *Checksum,
>>> +                                Optional<StringRef> Source) {
>>> +      getMCDwarfLineTable(CUID).setRootFile(CompilationDir, Filename,
>>> Checksum,
>>> +                                            Source);
>>>      }
>>>
>>>      /// Saves the information from the currently parsed dwarf .loc
>>> directive
>>>
>>> Modified: llvm/trunk/include/llvm/MC/MCDwarf.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCDwarf.h?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/MC/MCDwarf.h (original)
>>> +++ llvm/trunk/include/llvm/MC/MCDwarf.h Tue Mar 27 15:40:34 2018
>>> @@ -214,6 +214,7 @@ struct MCDwarfLineTableHeader {
>>>    SmallVector<MCDwarfFile, 3> MCDwarfFiles;
>>>    StringMap<unsigned> SourceIdMap;
>>>    StringRef CompilationDir;
>>> +  MCDwarfFile RootFile;
>>>    bool HasMD5 = false;
>>>    bool HasSource = false;
>>>
>>> @@ -241,8 +242,17 @@ class MCDwarfDwoLineTable {
>>>    MCDwarfLineTableHeader Header;
>>>
>>>  public:
>>> -  void setCompilationDir(StringRef CompilationDir) {
>>> -    Header.CompilationDir = CompilationDir;
>>> +  void maybeSetRootFile(StringRef Directory, StringRef FileName,
>>> +                        MD5::MD5Result *Checksum, Optional<StringRef>
>>> Source) {
>>> +    if (!Header.RootFile.Name.empty())
>>> +      return;
>>> +    Header.CompilationDir = Directory;
>>> +    Header.RootFile.Name = FileName;
>>> +    Header.RootFile.DirIndex = 0;
>>> +    Header.RootFile.Checksum = Checksum;
>>> +    Header.RootFile.Source = Source;
>>> +    Header.HasMD5 = (Checksum != nullptr);
>>> +    Header.HasSource = Source.hasValue();
>>>    }
>>>
>>>    unsigned getFile(StringRef Directory, StringRef FileName,
>>> @@ -277,6 +287,17 @@ public:
>>>                                 FileNumber));
>>>    }
>>>
>>> +  void setRootFile(StringRef Directory, StringRef FileName,
>>> +                   MD5::MD5Result *Checksum, Optional<StringRef>
>>> Source) {
>>> +    Header.CompilationDir = Directory;
>>> +    Header.RootFile.Name = FileName;
>>> +    Header.RootFile.DirIndex = 0;
>>> +    Header.RootFile.Checksum = Checksum;
>>> +    Header.RootFile.Source = Source;
>>> +    Header.HasMD5 = (Checksum != nullptr);
>>> +    Header.HasSource = Source.hasValue();
>>> +  }
>>> +
>>>    MCSymbol *getLabel() const {
>>>      return Header.Label;
>>>    }
>>> @@ -285,10 +306,6 @@ public:
>>>      Header.Label = Label;
>>>    }
>>>
>>> -  void setCompilationDir(StringRef CompilationDir) {
>>> -    Header.CompilationDir = CompilationDir;
>>> -  }
>>> -
>>>    const SmallVectorImpl<std::string> &getMCDwarfDirs() const {
>>>      return Header.MCDwarfDirs;
>>>    }
>>>
>>> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
>>> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Tue Mar 27 15:40:34 2018
>>> @@ -775,6 +775,12 @@ public:
>>>        MD5::MD5Result *Checksum = nullptr, Optional<StringRef> Source =
>>> None,
>>>        unsigned CUID = 0);
>>>
>>> +  /// Specify the "root" file of the compilation, using the ".file 0"
>>> extension.
>>> +  virtual void emitDwarfFile0Directive(StringRef Directory, StringRef
>>> Filename,
>>> +                                       MD5::MD5Result *Checksum,
>>> +                                       Optional<StringRef> Source,
>>> +                                       unsigned CUID = 0);
>>> +
>>>    /// \brief This implements the DWARF2 '.loc fileno lineno ...'
>>> assembler
>>>    /// directive.
>>>    virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Mar 27 15:40:34
>>> 2018
>>> @@ -499,8 +499,9 @@ DwarfDebug::getOrCreateDwarfCompileUnit(
>>>    // explicitly describe the directory of all files, never relying on
>>> the
>>>    // compilation directory.
>>>    if (!Asm->OutStreamer->hasRawTextSupport() || SingleCU)
>>> -    Asm->OutStreamer->getContext().setMCLineTableCompilationDir(
>>> -        NewCU.getUniqueID(), CompilationDir);
>>> +    Asm->OutStreamer->emitDwarfFile0Directive(
>>> +        CompilationDir, FN, NewCU.getMD5AsBytes(DIUnit->getFile()),
>>> +        DIUnit->getSource(), NewCU.getUniqueID());
>>>
>>>    StringRef Producer = DIUnit->getProducer();
>>>    StringRef Flags = DIUnit->getFlags();
>>> @@ -2148,8 +2149,10 @@ void DwarfDebug::emitDebugStrDWO() {
>>>  MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit
>>> &CU) {
>>>    if (!useSplitDwarf())
>>>      return nullptr;
>>> -  if (SingleCU)
>>> -
>>> SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode()->getDirectory());
>>> +  const DICompileUnit *DIUnit = CU.getCUNode();
>>> +  SplitTypeUnitFileTable.maybeSetRootFile(
>>> +      DIUnit->getDirectory(), DIUnit->getFilename(),
>>> +      CU.getMD5AsBytes(DIUnit->getFile()), DIUnit->getSource());
>>>    return &SplitTypeUnitFileTable;
>>>  }
>>>
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Tue Mar 27 15:40:34
>>> 2018
>>> @@ -282,7 +282,7 @@ void DwarfUnit::addSectionOffset(DIE &Di
>>>      addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
>>>  }
>>>
>>> -MD5::MD5Result *DwarfUnit::getMD5AsBytes(const DIFile *File) {
>>> +MD5::MD5Result *DwarfUnit::getMD5AsBytes(const DIFile *File) const {
>>>    assert(File);
>>>    Optional<DIFile::ChecksumInfo<StringRef>> Checksum =
>>> File->getChecksum();
>>>    if (!Checksum || Checksum->Kind != DIFile::CSK_MD5)
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h Tue Mar 27 15:40:34
>>> 2018
>>> @@ -306,6 +306,10 @@ public:
>>>                                        const MCSymbol *Label,
>>>                                        const MCSymbol *Sec);
>>>
>>> +  /// If the \p File has an MD5 checksum, return it as an MD5Result
>>> +  /// allocated in the MCContext.
>>> +  MD5::MD5Result *getMD5AsBytes(const DIFile *File) const;
>>> +
>>>  protected:
>>>    ~DwarfUnit();
>>>
>>> @@ -316,10 +320,6 @@ protected:
>>>    /// create a new ID and insert it in the line table.
>>>    virtual unsigned getOrCreateSourceID(const DIFile *File) = 0;
>>>
>>> -  /// If the \p File has an MD5 checksum, return it as an MD5Result
>>> -  /// allocated in the MCContext.
>>> -  MD5::MD5Result *getMD5AsBytes(const DIFile *File);
>>> -
>>>    /// Look in the DwarfDebug map for the MDNode that corresponds to the
>>>    /// reference.
>>>    template <typename T> T *resolve(TypedDINodeRef<T> Ref) const {
>>>
>>> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
>>> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Tue Mar 27 15:40:34 2018
>>> @@ -219,6 +219,10 @@ public:
>>>                                                 MD5::MD5Result *Checksum
>>> = 0,
>>>                                                 Optional<StringRef>
>>> Source = None,
>>>                                                 unsigned CUID = 0)
>>> override;
>>> +  void emitDwarfFile0Directive(StringRef Directory, StringRef Filename,
>>> +                               MD5::MD5Result *Checksum,
>>> +                               Optional<StringRef> Source,
>>> +                               unsigned CUID = 0) override;
>>>    void EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
>>>                               unsigned Column, unsigned Flags,
>>>                               unsigned Isa, unsigned Discriminator,
>>> @@ -1077,21 +1081,10 @@ void MCAsmStreamer::EmitFileDirective(St
>>>    EmitEOL();
>>>  }
>>>
>>> -Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective(
>>> -    unsigned FileNo, StringRef Directory, StringRef Filename,
>>> -    MD5::MD5Result *Checksum, Optional<StringRef> Source, unsigned
>>> CUID) {
>>> -  assert(CUID == 0);
>>> -
>>> -  MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID);
>>> -  unsigned NumFiles = Table.getMCDwarfFiles().size();
>>> -  Expected<unsigned> FileNoOrErr =
>>> -      Table.tryGetFile(Directory, Filename, Checksum, Source, FileNo);
>>> -  if (!FileNoOrErr)
>>> -    return FileNoOrErr.takeError();
>>> -  FileNo = FileNoOrErr.get();
>>> -  if (NumFiles == Table.getMCDwarfFiles().size())
>>> -    return FileNo;
>>> -
>>> +void printDwarfFileDirective(unsigned FileNo, StringRef Directory,
>>> +                             StringRef Filename, MD5::MD5Result
>>> *Checksum,
>>> +                             Optional<StringRef> Source, bool
>>> UseDwarfDirectory,
>>> +                             raw_svector_ostream &OS) {
>>>    SmallString<128> FullPathName;
>>>
>>>    if (!UseDwarfDirectory && !Directory.empty()) {
>>> @@ -1105,31 +1098,68 @@ Expected<unsigned> MCAsmStreamer::tryEmi
>>>      }
>>>    }
>>>
>>> -  SmallString<128> Str;
>>> -  raw_svector_ostream OS1(Str);
>>> -  OS1 << "\t.file\t" << FileNo << ' ';
>>> +  OS << "\t.file\t" << FileNo << ' ';
>>>    if (!Directory.empty()) {
>>> -    PrintQuotedString(Directory, OS1);
>>> -    OS1 << ' ';
>>> +    PrintQuotedString(Directory, OS);
>>> +    OS << ' ';
>>>    }
>>> -  PrintQuotedString(Filename, OS1);
>>> +  PrintQuotedString(Filename, OS);
>>>    if (Checksum) {
>>> -    OS1 << " md5 ";
>>> -    PrintQuotedString(Checksum->digest(), OS1);
>>> +    OS << " md5 ";
>>> +    PrintQuotedString(Checksum->digest(), OS);
>>>    }
>>>    if (Source) {
>>> -    OS1 << " source ";
>>> -    PrintQuotedString(*Source, OS1);
>>> +    OS << " source ";
>>> +    PrintQuotedString(*Source, OS);
>>>    }
>>> -  if (MCTargetStreamer *TS = getTargetStreamer()) {
>>> +}
>>> +
>>> +Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective(
>>> +    unsigned FileNo, StringRef Directory, StringRef Filename,
>>> +    MD5::MD5Result *Checksum, Optional<StringRef> Source, unsigned
>>> CUID) {
>>> +  assert(CUID == 0 && "multiple CUs not supported by MCAsmStreamer");
>>> +
>>> +  MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID);
>>> +  unsigned NumFiles = Table.getMCDwarfFiles().size();
>>> +  Expected<unsigned> FileNoOrErr =
>>> +      Table.tryGetFile(Directory, Filename, Checksum, Source, FileNo);
>>> +  if (!FileNoOrErr)
>>> +    return FileNoOrErr.takeError();
>>> +  FileNo = FileNoOrErr.get();
>>> +  if (NumFiles == Table.getMCDwarfFiles().size())
>>> +    return FileNo;
>>> +
>>> +  SmallString<128> Str;
>>> +  raw_svector_ostream OS1(Str);
>>> +  printDwarfFileDirective(FileNo, Directory, Filename, Checksum, Source,
>>> +                          UseDwarfDirectory, OS1);
>>> +
>>> +  if (MCTargetStreamer *TS = getTargetStreamer())
>>>      TS->emitDwarfFileDirective(OS1.str());
>>> -  } else {
>>> +  else
>>>      EmitRawText(OS1.str());
>>> -  }
>>>
>>>    return FileNo;
>>>  }
>>>
>>> +void MCAsmStreamer::emitDwarfFile0Directive(StringRef Directory,
>>> +                                            StringRef Filename,
>>> +                                            MD5::MD5Result *Checksum,
>>> +                                            Optional<StringRef> Source,
>>> +                                            unsigned CUID) {
>>> +  assert(CUID == 0);
>>> +
>>> +  SmallString<128> Str;
>>> +  raw_svector_ostream OS1(Str);
>>> +  printDwarfFileDirective(0, Directory, Filename, Checksum, Source,
>>> +                          UseDwarfDirectory, OS1);
>>> +
>>> +  if (MCTargetStreamer *TS = getTargetStreamer())
>>> +    TS->emitDwarfFileDirective(OS1.str());
>>> +  else
>>> +    EmitRawText(OS1.str());
>>> +}
>>> +
>>>  void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned
>>> Line,
>>>                                            unsigned Column, unsigned
>>> Flags,
>>>                                            unsigned Isa,
>>>
>>> Modified: llvm/trunk/lib/MC/MCDwarf.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDwarf.cpp?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/MC/MCDwarf.cpp (original)
>>> +++ llvm/trunk/lib/MC/MCDwarf.cpp Tue Mar 27 15:40:34 2018
>>> @@ -349,6 +349,34 @@ void MCDwarfLineTableHeader::emitV2FileD
>>>    MCOS->EmitIntValue(0, 1); // Terminate the file list.
>>>  }
>>>
>>> +static void emitOneV5FileEntry(MCStreamer *MCOS, const MCDwarfFile
>>> &DwarfFile,
>>> +                               bool HasMD5, bool HasSource,
>>> +                               Optional<MCDwarfLineStr> &LineStr) {
>>> +  assert(!DwarfFile.Name.empty());
>>> +  if (LineStr)
>>> +    LineStr->emitRef(MCOS, DwarfFile.Name);
>>> +  else {
>>> +    MCOS->EmitBytes(DwarfFile.Name);     // FileName and...
>>> +    MCOS->EmitBytes(StringRef("\0", 1)); // its null terminator.
>>> +  }
>>> +  MCOS->EmitULEB128IntValue(DwarfFile.DirIndex); // Directory number.
>>> +  if (HasMD5) {
>>> +    MD5::MD5Result *Cksum = DwarfFile.Checksum;
>>> +    MCOS->EmitBinaryData(
>>> +        StringRef(reinterpret_cast<const char *>(Cksum->Bytes.data()),
>>> +                  Cksum->Bytes.size()));
>>> +  }
>>> +  if (HasSource) {
>>> +    if (LineStr)
>>> +      LineStr->emitRef(MCOS, DwarfFile.Source.getValueOr(StringRef()));
>>> +    else {
>>> +      MCOS->EmitBytes(
>>> +          DwarfFile.Source.getValueOr(StringRef())); // Source and...
>>> +      MCOS->EmitBytes(StringRef("\0", 1));           // its null
>>> terminator.
>>> +    }
>>> +  }
>>> +}
>>> +
>>>  void MCDwarfLineTableHeader::emitV5FileDirTables(
>>>      MCStreamer *MCOS, Optional<MCDwarfLineStr> &LineStr) const {
>>>    // The directory format, which is just a list of the directory
>>> paths.  In a
>>> @@ -397,33 +425,12 @@ void MCDwarfLineTableHeader::emitV5FileD
>>>      MCOS->EmitULEB128IntValue(LineStr ? dwarf::DW_FORM_line_strp
>>>                                        : dwarf::DW_FORM_string);
>>>    }
>>> -  // Then the list of file names. These start at 1.
>>> -  MCOS->EmitULEB128IntValue(MCDwarfFiles.size() - 1);
>>> -  for (unsigned i = 1; i < MCDwarfFiles.size(); ++i) {
>>> -    assert(!MCDwarfFiles[i].Name.empty());
>>> -    if (LineStr)
>>> -      LineStr->emitRef(MCOS, MCDwarfFiles[i].Name);
>>> -    else {
>>> -      MCOS->EmitBytes(MCDwarfFiles[i].Name); // FileName and...
>>> -      MCOS->EmitBytes(StringRef("\0", 1));   // its null terminator.
>>> -    }
>>> -    MCOS->EmitULEB128IntValue(MCDwarfFiles[i].DirIndex); // Directory
>>> number.
>>> -    if (HasMD5) {
>>> -      MD5::MD5Result *Cksum = MCDwarfFiles[i].Checksum;
>>> -      MCOS->EmitBinaryData(
>>> -          StringRef(reinterpret_cast<const char *>(Cksum->Bytes.data()),
>>> -                    Cksum->Bytes.size()));
>>> -    }
>>> -    if (HasSource) {
>>> -      if (LineStr)
>>> -        LineStr->emitRef(MCOS,
>>> MCDwarfFiles[i].Source.getValueOr(StringRef()));
>>> -      else {
>>> -        MCOS->EmitBytes(
>>> -            MCDwarfFiles[i].Source.getValueOr(StringRef())); // Source
>>> and...
>>> -        MCOS->EmitBytes(StringRef("\0", 1)); // its null terminator.
>>> -      }
>>> -    }
>>> -  }
>>> +  // Then the counted list of files. The root file is file #0, then
>>> emit the
>>> +  // files as provide by .file directives.
>>> +  MCOS->EmitULEB128IntValue(MCDwarfFiles.size());
>>> +  emitOneV5FileEntry(MCOS, RootFile, HasMD5, HasSource, LineStr);
>>> +  for (unsigned i = 1; i < MCDwarfFiles.size(); ++i)
>>> +    emitOneV5FileEntry(MCOS, MCDwarfFiles[i], HasMD5, HasSource,
>>> LineStr);
>>>  }
>>>
>>>  std::pair<MCSymbol *, MCSymbol *>
>>>
>>> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
>>> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Tue Mar 27 15:40:34 2018
>>> @@ -3276,8 +3276,8 @@ bool AsmParser::parseDirectiveFile(SMLoc
>>>      FileNumber = getTok().getIntVal();
>>>      Lex();
>>>
>>> -    if (FileNumber < 1)
>>> -      return TokError("file number less than one");
>>> +    if (FileNumber < 0)
>>> +      return TokError("negative file number");
>>>    }
>>>
>>>    std::string Path = getTok().getString();
>>> @@ -3356,11 +3356,15 @@ bool AsmParser::parseDirectiveFile(SMLoc
>>>        memcpy(SourceBuf, SourceString.data(), SourceString.size());
>>>        Source = StringRef(SourceBuf, SourceString.size());
>>>      }
>>> -    Expected<unsigned> FileNumOrErr =
>>> getStreamer().tryEmitDwarfFileDirective(
>>> -        FileNumber, Directory, Filename, CKMem, Source);
>>> -    if (!FileNumOrErr)
>>> -      return Error(DirectiveLoc, toString(FileNumOrErr.takeError()));
>>> -    FileNumber = FileNumOrErr.get();
>>> +    if (FileNumber == 0)
>>> +      getStreamer().emitDwarfFile0Directive(Directory, Filename, CKMem,
>>> Source);
>>> +    else {
>>> +      Expected<unsigned> FileNumOrErr =
>>> getStreamer().tryEmitDwarfFileDirective(
>>> +          FileNumber, Directory, Filename, CKMem, Source);
>>> +      if (!FileNumOrErr)
>>> +        return Error(DirectiveLoc, toString(FileNumOrErr.takeError()));
>>> +      FileNumber = FileNumOrErr.get();
>>> +    }
>>>    }
>>>
>>>    return false;
>>>
>>> Modified: llvm/trunk/lib/MC/MCStreamer.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
>>> +++ llvm/trunk/lib/MC/MCStreamer.cpp Tue Mar 27 15:40:34 2018
>>> @@ -199,6 +199,15 @@ MCStreamer::tryEmitDwarfFileDirective(un
>>>                                     Source, CUID);
>>>  }
>>>
>>> +void MCStreamer::emitDwarfFile0Directive(StringRef Directory,
>>> +                                         StringRef Filename,
>>> +                                         MD5::MD5Result *Checksum,
>>> +                                         Optional<StringRef> Source,
>>> +                                         unsigned CUID) {
>>> +  getContext().setMCLineTableRootFile(CUID, Directory, Filename,
>>> Checksum,
>>> +                                      Source);
>>> +}
>>> +
>>>  void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
>>>                                         unsigned Column, unsigned Flags,
>>>                                         unsigned Isa,
>>>
>>> Modified: llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll (original)
>>> +++ llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll Tue Mar 27 15:40:34 2018
>>> @@ -8,28 +8,25 @@
>>>  ; RUN: %llc_dwarf -dwarf-version 4 -filetype=asm -o - %s | FileCheck %s
>>> --check-prefix=ASM
>>>  ; RUN: %llc_dwarf -dwarf-version 5 -filetype=asm -o - %s | FileCheck %s
>>> --check-prefix=ASM
>>>  ; RUN: %llc_dwarf -dwarf-version 4 -filetype=obj -o %t4.o %s
>>> -; RUN: llvm-dwarfdump -debug-line %t4.o | FileCheck %s
>>> --check-prefix=OBJ-4
>>> +; RUN: llvm-dwarfdump -debug-line %t4.o | FileCheck %s
>>> --check-prefix=OBJ
>>>  ; RUN: %llc_dwarf -dwarf-version 5 -filetype=obj -o %t5.o %s
>>> -; RUN: llvm-dwarfdump -debug-line %t5.o | FileCheck %s
>>> --check-prefix=OBJ-5
>>> +; RUN: llvm-dwarfdump -debug-line %t5.o | FileCheck %s
>>> --check-prefixes=OBJ,OBJ-5
>>>
>>> -; FIXME: Need to convey the MD5 for the primary source file.
>>> -; ASM: .file 1 ".{{/|\\\\}}t1.h" md5 "11111111111111111111111111111111"
>>> -; ASM: .file 2 ".{{/|\\\\}}t2.h" md5 "22222222222222222222222222222222"
>>> -
>>> -; OBJ-4: file_names[ 1]:
>>> -; OBJ-4-NEXT: name: "t1.h"
>>> -; OBJ-4-NEXT: dir_index: 1
>>> -; OBJ-4: file_names[ 2]:
>>> -; OBJ-4-NEXT: name: "t2.h"
>>> -; OBJ-4-NEXT: dir_index: 1
>>> +; ASM: .file 0 "[[COMPDIR:.*]]{{[/\\]}}t.c" md5
>>> "00000000000000000000000000000000"
>>> +; ASM: .file 1 "[[COMPDIR]]{{[/\\]}}t1.h" md5
>>> "11111111111111111111111111111111"
>>> +; ASM: .file 2 "[[COMPDIR]]{{[/\\]}}t2.h" md5
>>> "22222222222222222222222222222222"
>>>
>>>  ; OBJ-5: file_names[ 0]:
>>> -; OBJ-5-NEXT: name: "t1.h"
>>> -; OBJ-5-NEXT: dir_index: 1
>>> +; OBJ-5-NEXT: name: "t.c"
>>> +; OBJ-5-NEXT: dir_index: 0
>>> +; OBJ-5-NEXT: md5_checksum: 00000000000000000000000000000000
>>> +; OBJ: file_names[ 1]:
>>> +; OBJ-NEXT: name: "t1.h"
>>> +; OBJ-NEXT: dir_index: 0
>>>  ; OBJ-5-NEXT: md5_checksum: 11111111111111111111111111111111
>>> -; OBJ-5: file_names[ 1]:
>>> -; OBJ-5-NEXT: name: "t2.h"
>>> -; OBJ-5-NEXT: dir_index: 1
>>> +; OBJ: file_names[ 2]:
>>> +; OBJ-NEXT: name: "t2.h"
>>> +; OBJ-NEXT: dir_index: 0
>>>  ; OBJ-5-NEXT: md5_checksum: 22222222222222222222222222222222
>>>
>>>  ; ModuleID = 't.c'
>>> @@ -50,9 +47,9 @@ source_filename = "t.c"
>>>  !5 = !{!0, !6}
>>>  !6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())
>>>  !7 = distinct !DIGlobalVariable(name: "t2", scope: !2, file: !8, line:
>>> 1, type: !9, isLocal: false, isDefinition: true)
>>> -!8 = !DIFile(filename: "./t2.h", directory:
>>> "/home/probinson/projects/scratch", checksumkind: CSK_MD5, checksum:
>>> "22222222222222222222222222222222")
>>> +!8 = !DIFile(filename: "t2.h", directory:
>>> "/home/probinson/projects/scratch", checksumkind: CSK_MD5, checksum:
>>> "22222222222222222222222222222222")
>>>  !9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
>>> -!10 = !DIFile(filename: "./t1.h", directory:
>>> "/home/probinson/projects/scratch", checksumkind: CSK_MD5, checksum:
>>> "11111111111111111111111111111111")
>>> +!10 = !DIFile(filename: "t1.h", directory:
>>> "/home/probinson/projects/scratch", checksumkind: CSK_MD5, checksum:
>>> "11111111111111111111111111111111")
>>>  !11 = !{i32 2, !"Dwarf Version", i32 4}
>>>  !12 = !{i32 2, !"Debug Info Version", i32 3}
>>>  !13 = !{i32 1, !"wchar_size", i32 4}
>>>
>>> Modified: llvm/trunk/test/CodeGen/Generic/dwarf-source.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/dwarf-source.ll?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/Generic/dwarf-source.ll (original)
>>> +++ llvm/trunk/test/CodeGen/Generic/dwarf-source.ll Tue Mar 27 15:40:34
>>> 2018
>>> @@ -8,30 +8,27 @@
>>>  ; RUN: %llc_dwarf -dwarf-version 4 -filetype=asm -o - %s | FileCheck %s
>>> --check-prefix=ASM
>>>  ; RUN: %llc_dwarf -dwarf-version 5 -filetype=asm -o - %s | FileCheck %s
>>> --check-prefix=ASM
>>>  ; RUN: %llc_dwarf -dwarf-version 4 -filetype=obj -o %t4.o %s
>>> -; RUN: llvm-dwarfdump -debug-line %t4.o | FileCheck %s
>>> --check-prefix=OBJ-4
>>> +; RUN: llvm-dwarfdump -debug-line %t4.o | FileCheck %s
>>> --check-prefixes=OBJ,OBJ-4
>>>  ; RUN: %llc_dwarf -dwarf-version 5 -filetype=obj -o %t5.o %s
>>> -; RUN: llvm-dwarfdump -debug-line %t5.o | FileCheck %s
>>> --check-prefix=OBJ-5
>>> +; RUN: llvm-dwarfdump -debug-line %t5.o | FileCheck %s
>>> --check-prefixes=OBJ,OBJ-5
>>>
>>> -; FIXME: Need to convey the source for the primary source file.
>>> -; ASM: .file 1 ".{{/|\\\\}}t1.h" source
>>> "11111111111111111111111111111111"
>>> -; ASM: .file 2 ".{{/|\\\\}}t2.h" source
>>> "22222222222222222222222222222222"
>>> -
>>> -; OBJ-4: file_names[ 1]:
>>> -; OBJ-4-NEXT: name: "t1.h"
>>> -; OBJ-4-NEXT: dir_index: 1
>>> -; OBJ-4-NOT: 11111111111111111111111111111111
>>> -; OBJ-4: file_names[ 2]:
>>> -; OBJ-4-NEXT: name: "t2.h"
>>> -; OBJ-4-NEXT: dir_index: 1
>>> -; OBJ-4-NOT: 22222222222222222222222222222222
>>> +; ASM: .file 0 "[[COMPDIR:.*]]{{[/\\]}}t.c" source
>>> "00000000000000000000000000000000"
>>> +; ASM: .file 1 "[[COMPDIR]]{{[/\\]}}t1.h" source
>>> "11111111111111111111111111111111"
>>> +; ASM: .file 2 "[[COMPDIR]]{{[/\\]}}t2.h" source
>>> "22222222222222222222222222222222"
>>>
>>>  ; OBJ-5: file_names[ 0]:
>>> -; OBJ-5-NEXT: name: "t1.h"
>>> -; OBJ-5-NEXT: dir_index: 1
>>> +; OBJ-5-NEXT: name: "t.c"
>>> +; OBJ-5-NEXT: dir_index: 0
>>> +; OBJ-5-NEXT: source: "00000000000000000000000000000000"
>>> +; OBJ: file_names[ 1]:
>>> +; OBJ-NEXT: name: "t1.h"
>>> +; OBJ-NEXT: dir_index: 0
>>> +; OBJ-4-NOT: 11111111111111111111111111111111
>>>  ; OBJ-5-NEXT: source: "11111111111111111111111111111111"
>>> -; OBJ-5: file_names[ 1]:
>>> -; OBJ-5-NEXT: name: "t2.h"
>>> -; OBJ-5-NEXT: dir_index: 1
>>> +; OBJ: file_names[ 2]:
>>> +; OBJ-NEXT: name: "t2.h"
>>> +; OBJ-NEXT: dir_index: 0
>>> +; OBJ-4-NOT: 22222222222222222222222222222222
>>>  ; OBJ-5-NEXT: source: "22222222222222222222222222222222"
>>>
>>>  ; ModuleID = 't.c'
>>> @@ -52,9 +49,9 @@ source_filename = "t.c"
>>>  !5 = !{!0, !6}
>>>  !6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())
>>>  !7 = distinct !DIGlobalVariable(name: "t2", scope: !2, file: !8, line:
>>> 1, type: !9, isLocal: false, isDefinition: true)
>>> -!8 = !DIFile(filename: "./t2.h", directory: "/test", source:
>>> "22222222222222222222222222222222")
>>> +!8 = !DIFile(filename: "t2.h", directory: "/test", source:
>>> "22222222222222222222222222222222")
>>>  !9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
>>> -!10 = !DIFile(filename: "./t1.h", directory: "/test", source:
>>> "11111111111111111111111111111111")
>>> +!10 = !DIFile(filename: "t1.h", directory: "/test", source:
>>> "11111111111111111111111111111111")
>>>  !11 = !{i32 2, !"Dwarf Version", i32 4}
>>>  !12 = !{i32 2, !"Debug Info Version", i32 3}
>>>  !13 = !{i32 1, !"wchar_size", i32 4}
>>>
>>> Modified: llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll (original)
>>> +++ llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll Tue Mar 27 15:40:34
>>> 2018
>>> @@ -2,7 +2,7 @@
>>>
>>>  ; Verify that the file name is relative to the directory.
>>>  ; rdar://problem/8884898
>>> -; CHECK: file  1 "simple.c"
>>> +; CHECK: file  1 "/Users/manav/one/two" "simple.c"
>>>
>>>  declare i32 @printf(i8*, ...) nounwind
>>>
>>>
>>> Modified: llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll (original)
>>> +++ llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll Tue Mar 27 15:40:34
>>> 2018
>>> @@ -22,7 +22,7 @@
>>>  ; CHECK: .file 2 "B.asm"
>>>  ; CHECK: .loc  1 111
>>>  ; CHECK: .loc  2 222
>>> -; CHECK: .file 3 "test.c"
>>> +; CHECK: .file 3 "{{.*[/\\]}}test.c"
>>>  ; CHECK: .loc  3 14 0
>>>
>>>  target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
>>>
>>> Modified: llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s (original)
>>> +++ llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s Tue Mar 27
>>> 15:40:34 2018
>>> @@ -54,9 +54,9 @@ b:
>>>  // DWARF-DL: .debug_line contents:
>>>  // DWARF-DL: version: [[DWVER]]
>>>  // DWARF-DL-5:    address_size: 4
>>> -// DWARF-DL-5:    include_directories[  0] = ""
>>> +// DWARF-DL-5:    include_directories[  0] = "/tmp"
>>>  // DWARF-DL:      file_names[  [[DWFILE]]]:
>>> -// DWARF-DL:      name: "<stdin>"
>>> +// DWARF-DL:      name: "{{(<stdin>|-)}}"
>>>  // DWARF-DL:      0x0000000000000000     17      0      1   0   0
>>> is_stmt
>>>  // DWARF-DL-NEXT: 0x0000000000000004     17      0      1   0   0
>>> is_stmt end_sequence
>>>  // DWARF-DL-NEXT: 0x0000000000000000     21      0      1   0   0
>>> is_stmt
>>>
>>> Modified: llvm/trunk/test/MC/ELF/debug-file-options.s
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/debug-file-options.s?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/MC/ELF/debug-file-options.s (original)
>>> +++ llvm/trunk/test/MC/ELF/debug-file-options.s Tue Mar 27 15:40:34 2018
>>> @@ -11,25 +11,32 @@
>>>
>>>  # CHECK: debug_line[0x00000000]
>>>  # CHECK: version: 5
>>> -# CHECK: include_directories[ 0] =
>>> .debug_line_str[0x[[DIR0:[0-9a-f]+]]] = ""
>>> +# CHECK: include_directories[ 0] =
>>> .debug_line_str[0x[[DIR0:[0-9a-f]+]]] = "{{.+}}"
>>>  # CHECK: include_directories[ 1] =
>>> .debug_line_str[0x[[DIR1:[0-9a-f]+]]] = "dir1"
>>>  # CHECK: include_directories[ 2] =
>>> .debug_line_str[0x[[DIR2:[0-9a-f]+]]] = "dir2"
>>>  # CHECK-NOT: include_directories
>>>  # CHECK: file_names[ 0]:
>>> +# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "{{.+}}"
>>> +# CHECK-NEXT: dir_index: 0
>>> +# CHECK-NEXT: md5_checksum:
>>> +# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC:[0-9a-f]+]]] = ""
>>> +# CHECK: file_names[ 1]:
>>>  # CHECK-NEXT: name: .debug_line_str[0x[[FILE1:[0-9a-f]+]]] = "foo"
>>>  # CHECK-NEXT: dir_index: 1
>>>  # CHECK-NEXT: md5_checksum: ee87e05688663173cd6043a3a15bba6e
>>>  # CHECK-NEXT: source: .debug_line_str[0x[[FILE1SRC:[0-9a-f]+]]] = "void
>>> foo() {}"
>>> -# CHECK: file_names[ 1]:
>>> +# CHECK: file_names[ 2]:
>>>  # CHECK-NEXT: name: .debug_line_str[0x[[FILE2:[0-9a-f]+]]] = "bar"
>>>  # CHECK-NEXT: dir_index: 2
>>>  # CHECK-NEXT: md5_checksum: 816225a0c90ca8948b70eb58be4d522f
>>>  # CHECK-NEXT: source: .debug_line_str[0x[[FILE2SRC:[0-9a-f]+]]] = "void
>>> bar() {}"
>>>
>>>  # CHECK: .debug_line_str contents:
>>> -# CHECK-NEXT: 0x[[DIR0]]: ""
>>> +# CHECK-NEXT: 0x[[DIR0]]: "{{.+}}"
>>>  # CHECK-NEXT: 0x[[DIR1]]: "dir1"
>>>  # CHECK-NEXT: 0x[[DIR2]]: "dir2"
>>> +# CHECK-NEXT: 0x[[FILE0]]: "{{.+}}"
>>> +# CHECK-NEXT: 0x[[FILE0SRC]]: ""
>>>  # CHECK-NEXT: 0x[[FILE1]]: "foo"
>>>  # CHECK-NEXT: 0x[[FILE1SRC]]: "void foo() {}"
>>>  # CHECK-NEXT: 0x[[FILE2]]: "bar"
>>>
>>> Modified: llvm/trunk/test/MC/ELF/debug-md5.s
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/debug-md5.s?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/MC/ELF/debug-md5.s (original)
>>> +++ llvm/trunk/test/MC/ELF/debug-md5.s Tue Mar 27 15:40:34 2018
>>> @@ -1,4 +1,4 @@
>>> -// RUN: llvm-mc -triple x86_64-unknown-unknown -dwarf-version 5
>>> -filetype=obj %s -o - | llvm-dwarfdump --debug-line --debug-line-str -v - |
>>> FileCheck %s
>>> +// RUN: llvm-mc -triple x86_64-unknown-unknown -dwarf-version 5
>>> -fdebug-compilation-dir=/tmp -filetype=obj %s -o - | llvm-dwarfdump
>>> --debug-line --debug-line-str -v - | FileCheck %s
>>>
>>>          .file 1 "dir1/foo"   md5 "00112233445566778899aabbccddeeff"
>>>          .file 2 "dir2" "bar" md5 "ffeeddccbbaa99887766554433221100"
>>> @@ -9,22 +9,26 @@
>>>
>>>  # CHECK: debug_line[0x00000000]
>>>  # CHECK: version: 5
>>> -# CHECK: include_directories[ 0] =
>>> .debug_line_str[0x[[DIR0:[0-9a-f]+]]] = ""
>>> +# CHECK: include_directories[ 0] =
>>> .debug_line_str[0x[[DIR0:[0-9a-f]+]]] = "/tmp"
>>>  # CHECK: include_directories[ 1] =
>>> .debug_line_str[0x[[DIR1:[0-9a-f]+]]] = "dir1"
>>>  # CHECK: include_directories[ 2] =
>>> .debug_line_str[0x[[DIR2:[0-9a-f]+]]] = "dir2"
>>>  # CHECK-NOT: include_directories
>>>  # CHECK: file_names[ 0]:
>>> +# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "{{.+}}"
>>> +# CHECK-NEXT: dir_index: 0
>>> +# CHECK: file_names[ 1]:
>>>  # CHECK-NEXT: name: .debug_line_str[0x[[FILE1:[0-9a-f]+]]] = "foo"
>>>  # CHECK-NEXT: dir_index: 1
>>>  # CHECK-NEXT: md5_checksum: 00112233445566778899aabbccddeeff
>>> -# CHECK: file_names[ 1]:
>>> +# CHECK: file_names[ 2]:
>>>  # CHECK-NEXT: name: .debug_line_str[0x[[FILE2:[0-9a-f]+]]] = "bar"
>>>  # CHECK-NEXT: dir_index: 2
>>>  # CHECK-NEXT: md5_checksum: ffeeddccbbaa99887766554433221100
>>>
>>>  # CHECK: .debug_line_str contents:
>>> -# CHECK-NEXT: 0x[[DIR0]]: ""
>>> +# CHECK-NEXT: 0x[[DIR0]]: "/tmp"
>>>  # CHECK-NEXT: 0x[[DIR1]]: "dir1"
>>>  # CHECK-NEXT: 0x[[DIR2]]: "dir2"
>>> +# CHECK-NEXT: 0x[[FILE0]]: "{{.+}}"
>>>  # CHECK-NEXT: 0x[[FILE1]]: "foo"
>>>  # CHECK-NEXT: 0x[[FILE2]]: "bar"
>>>
>>> Modified: llvm/trunk/test/MC/ELF/debug-source.s
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/debug-source.s?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/MC/ELF/debug-source.s (original)
>>> +++ llvm/trunk/test/MC/ELF/debug-source.s Tue Mar 27 15:40:34 2018
>>> @@ -9,23 +9,29 @@
>>>
>>>  # CHECK: debug_line[0x00000000]
>>>  # CHECK: version: 5
>>> -# CHECK: include_directories[ 0] =
>>> .debug_line_str[0x[[DIR0:[0-9a-f]+]]] = ""
>>> +# CHECK: include_directories[ 0] =
>>> .debug_line_str[0x[[DIR0:[0-9a-f]+]]] = "{{.+}}"
>>>  # CHECK: include_directories[ 1] =
>>> .debug_line_str[0x[[DIR1:[0-9a-f]+]]] = "dir1"
>>>  # CHECK: include_directories[ 2] =
>>> .debug_line_str[0x[[DIR2:[0-9a-f]+]]] = "dir2"
>>>  # CHECK-NOT: include_directories
>>>  # CHECK: file_names[ 0]:
>>> +# CHECK-NEXT: name: .debug_line_str[0x[[FILE0:[0-9a-f]+]]] = "{{.+}}"
>>> +# CHECK-NEXT: dir_index: 0
>>> +# CHECK-NEXT: source: .debug_line_str[0x[[FILE0SRC:[0-9a-f]+]]] = ""
>>> +# CHECK: file_names[ 1]:
>>>  # CHECK-NEXT: name: .debug_line_str[0x[[FILE1:[0-9a-f]+]]] = "foo"
>>>  # CHECK-NEXT: dir_index: 1
>>>  # CHECK-NEXT: source: .debug_line_str[0x[[FILE1SRC:[0-9a-f]+]]] = "void
>>> foo() {}"
>>> -# CHECK: file_names[ 1]:
>>> +# CHECK: file_names[ 2]:
>>>  # CHECK-NEXT: name: .debug_line_str[0x[[FILE2:[0-9a-f]+]]] = "bar"
>>>  # CHECK-NEXT: dir_index: 2
>>>  # CHECK-NEXT: source: .debug_line_str[0x[[FILE2SRC:[0-9a-f]+]]] = "void
>>> bar()\n{\n}"
>>>
>>>  # CHECK: .debug_line_str contents:
>>> -# CHECK-NEXT: 0x[[DIR0]]: ""
>>> +# CHECK-NEXT: 0x[[DIR0]]: "{{.+}}"
>>>  # CHECK-NEXT: 0x[[DIR1]]: "dir1"
>>>  # CHECK-NEXT: 0x[[DIR2]]: "dir2"
>>> +# CHECK-NEXT: 0x[[FILE0]]: "{{.+}}"
>>> +# CHECK-NEXT: 0x[[FILE0SRC]]: ""
>>>  # CHECK-NEXT: 0x[[FILE1]]: "foo"
>>>  # CHECK-NEXT: 0x[[FILE1SRC]]: "void foo() {}"
>>>  # CHECK-NEXT: 0x[[FILE2]]: "bar"
>>>
>>> Added: llvm/trunk/test/MC/ELF/dwarf-file0.s
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/dwarf-file0.s?rev=328676&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/MC/ELF/dwarf-file0.s (added)
>>> +++ llvm/trunk/test/MC/ELF/dwarf-file0.s Tue Mar 27 15:40:34 2018
>>> @@ -0,0 +1,19 @@
>>> +# RUN: llvm-mc -dwarf-version 4 %s -filetype=obj -o - | llvm-dwarfdump
>>> -debug-line - | FileCheck %s --check-prefixes=CHECK,CHECK-4
>>> +# RUN: llvm-mc -dwarf-version 5 %s -filetype=obj -o - | llvm-dwarfdump
>>> -debug-line - | FileCheck %s --check-prefixes=CHECK,CHECK-5
>>> +# Darwin is stuck on DWARF v2.
>>> +# XFAIL: darwin
>>> +        .file 0 "root.cpp"
>>> +        .file 1 "header.h"
>>> +        .file 2 "root.cpp"
>>> +# CHECK-5:     include_directories[ 0] = ""
>>> +# CHECK-4-NOT: include_directories
>>> +# CHECK-4-NOT: file_names[ 0]
>>> +# CHECK-5:     file_names[ 0]:
>>> +# CHECK-5-NEXT: name: "root.cpp"
>>> +# CHECK-5-NEXT: dir_index: 0
>>> +# CHECK:       file_names[ 1]:
>>> +# CHECK-NEXT:  name: "header.h"
>>> +# CHECK-NEXT:  dir_index: 0
>>> +# CHECK:       file_names[ 2]:
>>> +# CHECK-NEXT:  name: "root.cpp"
>>> +# CHECK-NEXT:  dir_index: 0
>>>
>>> Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=328676&r1=328675&r2=328676&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
>>> +++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Tue Mar 27 15:40:34 2018
>>> @@ -390,6 +390,18 @@ int main(int argc, char **argv) {
>>>    }
>>>    if (!MainFileName.empty())
>>>      Ctx.setMainFileName(MainFileName);
>>> +  if (DwarfVersion >= 5) {
>>> +    // DWARF v5 needs the root file as well as the compilation
>>> directory.
>>> +    // If we find a '.file 0' directive that will supersede these
>>> values.
>>> +    MD5 Hash;
>>> +    MD5::MD5Result *Cksum =
>>> +        (MD5::MD5Result *)Ctx.allocate(sizeof(MD5::MD5Result), 1);
>>> +    Hash.update(Buffer->getBuffer());
>>> +    Hash.final(*Cksum);
>>> +    Ctx.setMCLineTableRootFile(
>>> +        /*CUID=*/0, Ctx.getCompilationDir(),
>>> +        !MainFileName.empty() ? MainFileName : InputFilename, Cksum,
>>> None);
>>> +  }
>>>
>>>    // Package up features to be passed to target/subtarget
>>>    std::string FeaturesStr;
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
>>
>> --
>> Alexander Potapenko
>> Software Engineer
>>
>> Google Germany GmbH
>> Erika-Mann-Straße, 33
>> 80636 München
>>
>> Geschäftsführer: Paul Manicle, Halimah DeLaine Prado
>> Registergericht und -nummer: Hamburg, HRB 86891
>> Sitz der Gesellschaft: Hamburg
>>
>
>
> --
> Alexander Potapenko
> Software Engineer
>
> Google Germany GmbH
> Erika-Mann-Straße, 33
> 80636 München
>
> Geschäftsführer: Paul Manicle, Halimah DeLaine Prado
> Registergericht und -nummer: Hamburg, HRB 86891
> Sitz der Gesellschaft: Hamburg
>


-- 
Alexander Potapenko
Software Engineer

Google Germany GmbH
Erika-Mann-Straße, 33
80636 München

Geschäftsführer: Paul Manicle, Halimah DeLaine Prado
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180328/ba1ee233/attachment-0001.html>


More information about the llvm-commits mailing list