Revert "Reapply "[DWARFv5] Emit file 0 to the line table.""

This reverts commit r326839.

r326839 breaks assembly file parsing:

$ cat q.c
void g() {}
$ clang -S q.c -g
$ clang -g -c q.s
q.s:9:2: error: file number already allocated
     .file   1 "/tmp/test" "q.c"
     ^

llvm-svn: 326902
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index 0a006ec..f254cb5 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -218,10 +218,6 @@
                                                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,
@@ -1080,10 +1076,21 @@
   EmitEOL();
 }
 
-void printDwarfFileDirective(unsigned FileNo, StringRef Directory,
-                             StringRef Filename, MD5::MD5Result *Checksum,
-                             Optional<StringRef> Source, bool UseDwarfDirectory,
-                             raw_svector_ostream &OS) {
+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;
+
   SmallString<128> FullPathName;
 
   if (!UseDwarfDirectory && !Directory.empty()) {
@@ -1097,68 +1104,31 @@
     }
   }
 
-  OS << "\t.file\t" << FileNo << ' ';
+  SmallString<128> Str;
+  raw_svector_ostream OS1(Str);
+  OS1 << "\t.file\t" << FileNo << ' ';
   if (!Directory.empty()) {
-    PrintQuotedString(Directory, OS);
-    OS << ' ';
+    PrintQuotedString(Directory, OS1);
+    OS1 << ' ';
   }
-  PrintQuotedString(Filename, OS);
+  PrintQuotedString(Filename, OS1);
   if (Checksum) {
-    OS << " md5 ";
-    PrintQuotedString(Checksum->digest(), OS);
+    OS1 << " md5 ";
+    PrintQuotedString(Checksum->digest(), OS1);
   }
   if (Source) {
-    OS << " source ";
-    PrintQuotedString(*Source, OS);
+    OS1 << " source ";
+    PrintQuotedString(*Source, OS1);
   }
-}
-
-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())
+  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,
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index ee675ac..685b46a 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -346,34 +346,6 @@
   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
@@ -422,12 +394,33 @@
     MCOS->EmitULEB128IntValue(LineStr ? dwarf::DW_FORM_line_strp
                                       : dwarf::DW_FORM_string);
   }
-  // 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);
+  // 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.
+      }
+    }
+  }
 }
 
 std::pair<MCSymbol *, MCSymbol *>
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index 2df5251..54a7673 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -3258,8 +3258,8 @@
     FileNumber = getTok().getIntVal();
     Lex();
 
-    if (FileNumber < 0)
-      return TokError("negative file number");
+    if (FileNumber < 1)
+      return TokError("file number less than one");
   }
 
   std::string Path = getTok().getString();
@@ -3338,8 +3338,6 @@
     // we turn off -g option, directly use the existing debug info instead.
     if (getContext().getGenDwarfForAssembly())
       getContext().setGenDwarfForAssembly(false);
-    else if (FileNumber == 0)
-      getStreamer().emitDwarfFile0Directive(Directory, Filename, CKMem, Source);
     else {
       Expected<unsigned> FileNumOrErr = getStreamer().tryEmitDwarfFileDirective(
           FileNumber, Directory, Filename, CKMem, Source);
diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp
index eed061d..bf27a0a 100644
--- a/llvm/lib/MC/MCStreamer.cpp
+++ b/llvm/lib/MC/MCStreamer.cpp
@@ -199,15 +199,6 @@
                                    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,