[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.

Differential Revision: https://reviews.llvm.org/D44054

llvm-svn: 326758
diff --git a/llvm/test/MC/ARM/dwarf-asm-multiple-sections.s b/llvm/test/MC/ARM/dwarf-asm-multiple-sections.s
index 4c099ac..cff8f00 100644
--- a/llvm/test/MC/ARM/dwarf-asm-multiple-sections.s
+++ b/llvm/test/MC/ARM/dwarf-asm-multiple-sections.s
@@ -54,9 +54,9 @@
 // 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
diff --git a/llvm/test/MC/ELF/debug-file-options.s b/llvm/test/MC/ELF/debug-file-options.s
index 3bcd131..5029d12 100644
--- a/llvm/test/MC/ELF/debug-file-options.s
+++ b/llvm/test/MC/ELF/debug-file-options.s
@@ -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 -filetype=obj %s -o -| llvm-dwarfdump --debug-line --debug-line-str -v - | FileCheck %s -DFILE0NAME=%s
 
 // Test combinations of options to the .file directive.
 
@@ -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]+]]] = "[[FILE0NAME]]"
+# 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]]: "[[FILE0NAME]]"
+# CHECK-NEXT: 0x[[FILE0SRC]]: ""
 # CHECK-NEXT: 0x[[FILE1]]: "foo"
 # CHECK-NEXT: 0x[[FILE1SRC]]: "void foo() {}"
 # CHECK-NEXT: 0x[[FILE2]]: "bar"
diff --git a/llvm/test/MC/ELF/debug-md5.s b/llvm/test/MC/ELF/debug-md5.s
index f8f3bc1..0e5ac1ed 100644
--- a/llvm/test/MC/ELF/debug-md5.s
+++ b/llvm/test/MC/ELF/debug-md5.s
@@ -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 -DROOTFILE=%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]+]]] = "[[ROOTFILE]]"
+# 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]]: "[[ROOTFILE]]"
 # CHECK-NEXT: 0x[[FILE1]]: "foo"
 # CHECK-NEXT: 0x[[FILE2]]: "bar"
diff --git a/llvm/test/MC/ELF/debug-source.s b/llvm/test/MC/ELF/debug-source.s
index 0b919e1..b3a4247 100644
--- a/llvm/test/MC/ELF/debug-source.s
+++ b/llvm/test/MC/ELF/debug-source.s
@@ -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 -filetype=obj %s -o -| llvm-dwarfdump --debug-line --debug-line-str -v - | FileCheck %s -DFILE0NAME=%s
 
         .file 1 "dir1/foo"   source "void foo() {}"
         .file 2 "dir2" "bar" source "void bar()\n{\n}"
@@ -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]+]]] = "[[FILE0NAME]]"
+# 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]]: "[[FILE0NAME]]"
+# CHECK-NEXT: 0x[[FILE0SRC]]: ""
 # CHECK-NEXT: 0x[[FILE1]]: "foo"
 # CHECK-NEXT: 0x[[FILE1SRC]]: "void foo() {}"
 # CHECK-NEXT: 0x[[FILE2]]: "bar"
diff --git a/llvm/test/MC/ELF/dwarf-file0.s b/llvm/test/MC/ELF/dwarf-file0.s
new file mode 100644
index 0000000..1c87284
--- /dev/null
+++ b/llvm/test/MC/ELF/dwarf-file0.s
@@ -0,0 +1,17 @@
+# 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
+        .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