[LLD][COFF] Fix file/line retrieval when a undefined symbol is to be printed
authorAlexandre Ganea <alexandre.ganea@ubisoft.com>
Fri, 4 Jan 2019 21:49:22 +0000 (21:49 +0000)
committerAlexandre Ganea <alexandre.ganea@ubisoft.com>
Fri, 4 Jan 2019 21:49:22 +0000 (21:49 +0000)
Differential Revision: https://reviews.llvm.org/D55951

llvm-svn: 350438

lld/COFF/PDB.cpp
lld/test/COFF/line-error.yaml [new file with mode: 0644]

index 3c99d1f..ad4f39b 100644 (file)
@@ -1735,20 +1735,26 @@ std::pair<StringRef, uint32_t> coff::getFileLine(const SectionChunk *C,
   if (!findLineTable(C, Addr, CVStrTab, Checksums, Lines, OffsetInLinetable))
     return {"", 0};
 
-  uint32_t NameIndex;
-  uint32_t LineNumber;
+  Optional<uint32_t> NameIndex;
+  Optional<uint32_t> LineNumber;
   for (LineColumnEntry &Entry : Lines) {
     for (const LineNumberEntry &LN : Entry.LineNumbers) {
+      LineInfo LI(LN.Flags);
       if (LN.Offset > OffsetInLinetable) {
+        if (!NameIndex) {
+          NameIndex = Entry.NameIndex;
+          LineNumber = LI.getStartLine();
+        }
         StringRef Filename =
-            ExitOnErr(getFileName(CVStrTab, Checksums, NameIndex));
-        return {Filename, LineNumber};
+            ExitOnErr(getFileName(CVStrTab, Checksums, *NameIndex));
+        return {Filename, *LineNumber};
       }
-      LineInfo LI(LN.Flags);
       NameIndex = Entry.NameIndex;
       LineNumber = LI.getStartLine();
     }
   }
-  StringRef Filename = ExitOnErr(getFileName(CVStrTab, Checksums, NameIndex));
-  return {Filename, LineNumber};
+  if (!NameIndex)
+    return {"", 0};
+  StringRef Filename = ExitOnErr(getFileName(CVStrTab, Checksums, *NameIndex));
+  return {Filename, *LineNumber};
 }
diff --git a/lld/test/COFF/line-error.yaml b/lld/test/COFF/line-error.yaml
new file mode 100644 (file)
index 0000000..55fb723
--- /dev/null
@@ -0,0 +1,160 @@
+# RUN: yaml2obj %s -o %t.obj\r
+# RUN: not lld-link %t.obj /subsystem:console 2>&1 | FileCheck %s\r
+\r
+# CHECK: lld-link: error: undefined symbol: function\r
+# CHECK-NEXT: >>> referenced by {{.*}}line-error.yaml.tmp.obj:(caller1)\r
+# CHECK-NEXT: >>> referenced by E:\file.cpp:1935\r
+# CHECK-NEXT: >>>               {{.*}}line-error.yaml.tmp.obj:(caller22)\r
+\r
+--- !COFF\r
+header:          \r
+  Machine:         IMAGE_FILE_MACHINE_AMD64\r
+  Characteristics: [  ]\r
+sections:        \r
+  - Name:            .text\r
+    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]\r
+    Alignment:       16\r
+    SectionData:     488B0500000000488B51284881C2D80000004889C148FF2500000000\r
+    Relocations:     \r
+      - VirtualAddress:  3\r
+        SymbolName:      function\r
+        Type:            IMAGE_REL_AMD64_REL32\r
+  - Name:            .text\r
+    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]\r
+    Alignment:       16\r
+    SectionData:     488B0500000000488B51084881C2D80000004889C148FF2500000000\r
+    Relocations:     \r
+      - VirtualAddress:  3\r
+        SymbolName:      function\r
+        Type:            IMAGE_REL_AMD64_REL32\r
+  - Name:            '.debug$S'\r
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]\r
+    Alignment:       4\r
+    Subsections:     \r
+      - !FileChecksums\r
+        Checksums:       \r
+          - FileName:        'E:\file.cpp'\r
+            Kind:            MD5\r
+            Checksum:        D72EDEF8B8E50C364A330F9CB3CD904B\r
+      - !StringTable\r
+        Strings:         \r
+          - 'E:\file.cpp'\r
+  - Name:            '.debug$S'\r
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]\r
+    Alignment:       4\r
+    Subsections:     \r
+      - !Lines\r
+        CodeSize:        28\r
+        Flags:           [  ]\r
+        RelocOffset:     0\r
+        RelocSegment:    0\r
+        Blocks:          []\r
+    Relocations:     \r
+      - VirtualAddress:  12\r
+        SymbolName:      caller1\r
+        Type:            IMAGE_REL_AMD64_SECREL\r
+  - Name:            '.debug$S'\r
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]\r
+    Alignment:       4\r
+    Subsections:     \r
+      - !Lines\r
+        CodeSize:        28\r
+        Flags:           [  ]\r
+        RelocOffset:     0\r
+        RelocSegment:    0\r
+        Blocks:          \r
+          - FileName:        'E:\file.cpp'\r
+            Lines:           \r
+              - Offset:          11\r
+                LineStart:       1935\r
+                IsStatement:     false\r
+                EndDelta:        0\r
+            Columns:         []\r
+    Relocations:     \r
+      - VirtualAddress:  12\r
+        SymbolName:      caller22\r
+        Type:            IMAGE_REL_AMD64_SECREL\r
+symbols:\r
+  - Name:            .text\r
+    Value:           0\r
+    SectionNumber:   1\r
+    SimpleType:      IMAGE_SYM_TYPE_NULL\r
+    ComplexType:     IMAGE_SYM_DTYPE_NULL\r
+    StorageClass:    IMAGE_SYM_CLASS_STATIC\r
+    SectionDefinition: \r
+      Length:          28\r
+      NumberOfRelocations: 2\r
+      NumberOfLinenumbers: 0\r
+      CheckSum:        2430089736\r
+      Number:          1\r
+      Selection:       IMAGE_COMDAT_SELECT_NODUPLICATES\r
+  - Name:            caller1\r
+    Value:           0\r
+    SectionNumber:   1\r
+    SimpleType:      IMAGE_SYM_TYPE_NULL\r
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION\r
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL    \r
+  - Name:            .text\r
+    Value:           0\r
+    SectionNumber:   2\r
+    SimpleType:      IMAGE_SYM_TYPE_NULL\r
+    ComplexType:     IMAGE_SYM_DTYPE_NULL\r
+    StorageClass:    IMAGE_SYM_CLASS_STATIC\r
+    SectionDefinition: \r
+      Length:          28\r
+      NumberOfRelocations: 2\r
+      NumberOfLinenumbers: 0\r
+      CheckSum:        3449717304\r
+      Number:          2\r
+      Selection:       IMAGE_COMDAT_SELECT_NODUPLICATES\r
+  - Name:            caller22\r
+    Value:           0\r
+    SectionNumber:   2\r
+    SimpleType:      IMAGE_SYM_TYPE_NULL\r
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION\r
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL    \r
+  - Name:            '.debug$S'\r
+    Value:           0\r
+    SectionNumber:   3\r
+    SimpleType:      IMAGE_SYM_TYPE_NULL\r
+    ComplexType:     IMAGE_SYM_DTYPE_NULL\r
+    StorageClass:    IMAGE_SYM_CLASS_STATIC\r
+    SectionDefinition: \r
+      Length:          767204\r
+      NumberOfRelocations: 0\r
+      NumberOfLinenumbers: 0\r
+      CheckSum:        4280093374\r
+      Number:          3\r
+  - Name:            '.debug$S'\r
+    Value:           0\r
+    SectionNumber:   4\r
+    SimpleType:      IMAGE_SYM_TYPE_NULL\r
+    ComplexType:     IMAGE_SYM_DTYPE_NULL\r
+    StorageClass:    IMAGE_SYM_CLASS_STATIC\r
+    SectionDefinition: \r
+      Length:          296\r
+      NumberOfRelocations: 1\r
+      NumberOfLinenumbers: 0\r
+      CheckSum:        1957793731\r
+      Number:          1\r
+      Selection:       IMAGE_COMDAT_SELECT_ASSOCIATIVE\r
+  - Name:            '.debug$S'\r
+    Value:           0\r
+    SectionNumber:   5\r
+    SimpleType:      IMAGE_SYM_TYPE_NULL\r
+    ComplexType:     IMAGE_SYM_DTYPE_NULL\r
+    StorageClass:    IMAGE_SYM_CLASS_STATIC\r
+    SectionDefinition: \r
+      Length:          276\r
+      NumberOfRelocations: 1\r
+      NumberOfLinenumbers: 0\r
+      CheckSum:        1957793731\r
+      Number:          2\r
+      Selection:       IMAGE_COMDAT_SELECT_ASSOCIATIVE\r
+  - Name:            function\r
+    Value:           0\r
+    SectionNumber:   0\r
+    SimpleType:      IMAGE_SYM_TYPE_NULL\r
+    ComplexType:     IMAGE_SYM_DTYPE_NULL\r
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL\r
+...\r