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

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 17 12:07:29 PDT 2018


This looks like it still breaks clang -g for assembly files with .file
directives in it:

$ cat test.s
label:
        .file   "bar.c"
        .file   1 "/foo" "bar.c"

$ clang-tot test.s -c
$ clang-tot test.s -c -gmlt
test.s:3:2: error: file number already allocated
        .file   1 "/foo" "bar.c"
        ^

On Thu, Mar 29, 2018 at 10:19 AM Paul Robinson via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: probinson
> Date: Thu Mar 29 10:16:41 2018
> New Revision: 328805
>
> URL: http://llvm.org/viewvc/llvm-project?rev=328805&view=rev
> Log:
> Reapply "[DWARFv5] Emit file 0 to the line table."
>
> 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.
> We emit the new syntax only for DWARF v5 and later.
>
> 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCContext.h (original)
> +++ llvm/trunk/include/llvm/MC/MCContext.h Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCDwarf.h (original)
> +++ llvm/trunk/include/llvm/MC/MCDwarf.h Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Thu Mar 29 10:16:41
> 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Thu Mar 29 10:16:41
> 2018
> @@ -282,8 +282,10 @@ 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);
> +  if (DD->getDwarfVersion() < 5)
> +    return nullptr;
>    Optional<DIFile::ChecksumInfo<StringRef>> Checksum =
> File->getChecksum();
>    if (!Checksum || Checksum->Kind != DIFile::CSK_MD5)
>      return nullptr;
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h?rev=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Thu Mar 29 10:16:41 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,12 @@ 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;
> -
> +static 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 +1100,71 @@ 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);
> +  // .file 0 is new for DWARF v5.
> +  if (getContext().getDwarfVersion() < 5)
> +    return;
> +
> +  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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCDwarf.cpp (original)
> +++ llvm/trunk/lib/MC/MCDwarf.cpp Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCStreamer.cpp Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll (original)
> +++ llvm/trunk/test/CodeGen/Generic/dwarf-md5.ll Thu Mar 29 10:16:41 2018
> @@ -5,31 +5,33 @@
>  ; XFAIL: darwin
>
>  ; REQUIRES: object-emission
> -; 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=asm -o - %s | FileCheck %s
> --check-prefixes=ASM,ASM-4
> +; RUN: %llc_dwarf -dwarf-version 5 -filetype=asm -o - %s | FileCheck %s
> --check-prefixes=ASM,ASM-5
>  ; 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-4-NOT: .file 0
> +; ASM-5: .file 0 "/scratch{{[/\\]}}t.c" md5
> "00000000000000000000000000000000"
> +; ASM: .file 1 "/scratch{{[/\\]}}t1.h"
> +; ASM-4-NOT:  md5
> +; ASM-5-SAME: md5 "11111111111111111111111111111111"
> +; ASM: .file 2 "/scratch{{[/\\]}}t2.h"
> +; ASM-4-NOT:  md5
> +; ASM-5-SAME: 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'
> @@ -45,14 +47,14 @@ source_filename = "t.c"
>  !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
>  !1 = distinct !DIGlobalVariable(name: "t1", scope: !2, file: !10, line:
> 1, type: !9, isLocal: false, isDefinition: true)
>  !2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer:
> "clang version 7.0.0 (trunk 322159)", isOptimized: false, runtimeVersion:
> 0, emissionKind: FullDebug, enums: !4, globals: !5)
> -!3 = !DIFile(filename: "t.c", directory:
> "/home/probinson/projects/scratch", checksumkind: CSK_MD5, checksum:
> "00000000000000000000000000000000")
> +!3 = !DIFile(filename: "t.c", directory: "/scratch", checksumkind:
> CSK_MD5, checksum: "00000000000000000000000000000000")
>  !4 = !{}
>  !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: "/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: "/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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Generic/dwarf-source.ll (original)
> +++ llvm/trunk/test/CodeGen/Generic/dwarf-source.ll Thu Mar 29 10:16:41
> 2018
> @@ -6,32 +6,29 @@
>
>  ; REQUIRES: object-emission
>  ; 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 5 -filetype=asm -o - %s | FileCheck %s
> --check-prefixes=ASM,ASM-5
>  ; 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-5: .file 0 "/test{{[/\\]}}t.c" source
> "00000000000000000000000000000000"
> +; ASM: .file 1 "/test{{[/\\]}}t1.h" source
> "11111111111111111111111111111111"
> +; ASM: .file 2 "/test{{[/\\]}}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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll (original)
> +++ llvm/trunk/test/DebugInfo/X86/dbg-file-name.ll Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll (original)
> +++ llvm/trunk/test/DebugInfo/X86/inline-asm-locs.ll Thu Mar 29 10:16:41
> 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s (original)
> +++ llvm/trunk/test/MC/ARM/dwarf-asm-multiple-sections.s Thu Mar 29
> 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/ELF/debug-file-options.s (original)
> +++ llvm/trunk/test/MC/ELF/debug-file-options.s Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/ELF/debug-md5.s (original)
> +++ llvm/trunk/test/MC/ELF/debug-md5.s Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/ELF/debug-source.s (original)
> +++ llvm/trunk/test/MC/ELF/debug-source.s Thu Mar 29 10:16:41 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=328805&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/MC/ELF/dwarf-file0.s (added)
> +++ llvm/trunk/test/MC/ELF/dwarf-file0.s Thu Mar 29 10:16:41 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=328805&r1=328804&r2=328805&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
> +++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Thu Mar 29 10:16:41 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180417/410b5673/attachment.html>


More information about the llvm-commits mailing list