[PATCH] D27676: [ELF] - Use full object name if source file name exist when reporting errors.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 12 09:47:39 PST 2016
I am OK with verbose errors, so LGTM, but please wait a day or so to see if
anyone thinks this is too verbose and has a suggestion for an heuristic.
Cheers,
Rafael
George Rimar via Phabricator <reviews at reviews.llvm.org> writes:
> 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())
>
>
> 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())
More information about the llvm-commits
mailing list