[PATCH] D27676: [ELF] - Use full object name if source file name exist when reporting errors.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 12 09:08:57 PST 2016


grimar created this revision.
grimar added reviewers: ruiu, rafael.
grimar added subscribers: llvm-commits, grimar, evgeny777.

Previously if we were able to take source name, we used it exclusively for reporting.
PR31354 case shows how confusing it can be:

Error is:
/usr/bin/ld: error: byte_copy.c:(.text+0x0): duplicate symbol 'byte_copy'
/usr/bin/ld: error: byte_copy.c:(function byte_copy): previous definition was here

After this patch output includes archive name if any. What makes clear what the error is about:
lld.exe: error: usr/ports/sysutils/safecat/work/safecat-1.13/byte_copy.o(byte_copy.c):(.text+0x0): duplicate symbol 'byte_copy'
lld.exe: error: usr/ports/sysutils/safecat/work/safecat-1.13/str.a(byte_copy.o)(byte_copy.c):(function byte_copy): previous definition was here


https://reviews.llvm.org/D27676

Files:
  ELF/InputSection.cpp
  test/ELF/Inputs/conflict-debug2.s
  test/ELF/conflict.s
  test/ELF/lto/combined-lto-object-name.ll
  test/ELF/undef.s


Index: test/ELF/undef.s
===================================================================
--- test/ELF/undef.s
+++ test/ELF/undef.s
@@ -5,17 +5,17 @@
 # RUN: llvm-ar rc %t2.a %t2.o
 # RUN: not ld.lld %t.o %t2.a %t3.o -o %t.exe 2>&1 | FileCheck %s
 # RUN: not ld.lld -pie %t.o %t2.a %t3.o -o %t.exe 2>&1 | FileCheck %s
-# CHECK: error: undef.s:(.text+0x1): undefined symbol 'foo'
-# CHECK: error: undef.s:(.text+0x6): undefined symbol 'bar'
-# CHECK: error: undef.s:(.text+0x10): undefined symbol 'foo(int)'
+# CHECK: error: {{.*}}.o(undef.s):(.text+0x1): undefined symbol 'foo'
+# CHECK: error: {{.*}}.o(undef.s):(.text+0x6): undefined symbol 'bar'
+# CHECK: error: {{.*}}.o(undef.s):(.text+0x10): undefined symbol 'foo(int)'
 # CHECK: error: {{.*}}2.a({{.*}}.o):(.text+0x0): undefined symbol 'zed2'
 # CHECK: error: dir/undef-debug.s:3: undefined symbol 'zed3'
 # CHECK: error: dir/undef-debug.s:7: undefined symbol 'zed4'
 # CHECK: error: dir/undef-debug.s:11: undefined symbol 'zed5'
 
 # RUN: not ld.lld %t.o %t2.a -o %t.exe -no-demangle 2>&1 | \
 # RUN:   FileCheck -check-prefix=NO-DEMANGLE %s
-# NO-DEMANGLE: error: undef.s:(.text+0x10): undefined symbol '_Z3fooi'
+# NO-DEMANGLE: error: {{.*}}.o(undef.s):(.text+0x10): undefined symbol '_Z3fooi'
 
 .file "undef.s"
 
Index: test/ELF/lto/combined-lto-object-name.ll
===================================================================
--- test/ELF/lto/combined-lto-object-name.ll
+++ test/ELF/lto/combined-lto-object-name.ll
@@ -11,4 +11,4 @@
   ret void
 }
 
-; CHECK: error: ld-temp.o:(function _start): undefined symbol 'foo'
+; CHECK: error: lto.tmp(ld-temp.o):(function _start): undefined symbol 'foo'
Index: test/ELF/conflict.s
===================================================================
--- test/ELF/conflict.s
+++ test/ELF/conflict.s
@@ -34,6 +34,14 @@
 # DBGINFO:      conflict-debug.s:4: duplicate symbol 'zed'
 # DBGINFO-NEXT: conflict-debug.s:4: previous definition was here
 
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/conflict-debug2.s -o %t-dbg2.o
+# RUN: echo "call zed" > %t-dbg1.s
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t-dbg1.s -o %t-dbg1.o
+# RUN: llvm-ar rcs %t-dbg2.a %t-dbg2.o
+# RUN: not ld.lld %t-dbg2.a %t-dbg1.o %t-dbg2.o -o %t2 2>&1 | FileCheck -check-prefix=ARCHIVE2 %s
+# ARCHIVE2:      {{.*}}-dbg2.o(conflict-debug.s):(.text+0x0): duplicate symbol 'zed'
+# ARCHIVE2-NEXT: {{.*}}-dbg2.a({{.*}}-dbg2.o)(conflict-debug.s):(.text+0x0): previous definition was here
+
 .globl _Z3muldd, foo
 _Z3muldd:
 foo:
Index: test/ELF/Inputs/conflict-debug2.s
===================================================================
--- test/ELF/Inputs/conflict-debug2.s
+++ test/ELF/Inputs/conflict-debug2.s
@@ -0,0 +1,4 @@
+.file "conflict-debug.s"
+.globl zed
+zed:
+  nop
Index: ELF/InputSection.cpp
===================================================================
--- ELF/InputSection.cpp
+++ ELF/InputSection.cpp
@@ -221,10 +221,10 @@
     return LineInfo;
 
   // File->SourceFile contains STT_FILE symbol that contains a
-  // source file name. If it's missing, we use an object file name.
-  std::string SrcFile = File->SourceFile;
-  if (SrcFile.empty())
-    SrcFile = toString(File);
+  // source file name. We add it if exist.
+  std::string SrcFile = toString(File);
+  if (!File->SourceFile.empty())
+    SrcFile += ("(" + File->SourceFile + ")").str();
 
   // Find a function symbol that encloses a given location.
   for (SymbolBody *B : File->getSymbols())


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27676.81091.patch
Type: text/x-patch
Size: 3501 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161212/a552c9f1/attachment-0001.bin>


More information about the llvm-commits mailing list