[lld] 1e70ec1 - [lld] Provide a hook to customize undefined symbols error handling

via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 9 04:29:07 PST 2020


Author: serge-sans-paille
Date: 2020-11-09T13:28:48+01:00
New Revision: 1e70ec10ebb07856ff270358cbd59e79bdc455cf

URL: https://github.com/llvm/llvm-project/commit/1e70ec10ebb07856ff270358cbd59e79bdc455cf
DIFF: https://github.com/llvm/llvm-project/commit/1e70ec10ebb07856ff270358cbd59e79bdc455cf.diff

LOG: [lld] Provide a hook to customize undefined symbols error handling

This is a follow up to https://reviews.llvm.org/D87758, implementing the missing
symbol part, as done by binutils.

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

Added: 
    

Modified: 
    lld/Common/ErrorHandler.cpp
    lld/ELF/Relocations.cpp
    lld/docs/error_handling_script.rst
    lld/docs/ld.lld.1
    lld/include/lld/Common/ErrorHandler.h
    lld/test/ELF/error-handling-script-linux.test

Removed: 
    


################################################################################
diff  --git a/lld/Common/ErrorHandler.cpp b/lld/Common/ErrorHandler.cpp
index 0e32fc57f6bd..41122e8fb9fd 100644
--- a/lld/Common/ErrorHandler.cpp
+++ b/lld/Common/ErrorHandler.cpp
@@ -239,6 +239,9 @@ void ErrorHandler::error(const Twine &msg, ErrorTag tag,
   case ErrorTag::LibNotFound:
     scriptArgs.push_back("missing-lib");
     break;
+  case ErrorTag::SymbolNotFound:
+    scriptArgs.push_back("undefined-symbol");
+    break;
   }
   scriptArgs.insert(scriptArgs.end(), args.begin(), args.end());
   int res = llvm::sys::ExecuteAndWait(errorHandlingScript, scriptArgs);

diff  --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp
index 3a9771523713..abb21f1d7274 100644
--- a/lld/ELF/Relocations.cpp
+++ b/lld/ELF/Relocations.cpp
@@ -919,7 +919,7 @@ static void reportUndefinedSymbol(const UndefinedDiag &undef,
   if (undef.isWarning)
     warn(msg);
   else
-    error(msg);
+    error(msg, ErrorTag::SymbolNotFound, {sym.getName()});
 }
 
 template <class ELFT> void elf::reportUndefinedSymbols() {

diff  --git a/lld/docs/error_handling_script.rst b/lld/docs/error_handling_script.rst
index 30905cd00d58..53efa8b7a3fb 100644
--- a/lld/docs/error_handling_script.rst
+++ b/lld/docs/error_handling_script.rst
@@ -27,6 +27,10 @@ The following tags are supported:
   is specified as the second argument, e.g. ``error-handling-script missing-lib
   mylib``
 
+- ``undefined-symbol``: indicates that given symbol is marked as undefined. The
+  unmangled symbol name is specified as the second argument, e.g.
+  ``error-handling-script undefined-symbol mysymbol``
+
 Return Value
 ============
 

diff  --git a/lld/docs/ld.lld.1 b/lld/docs/ld.lld.1
index 0de278ac3b2d..538d09d6a5f0 100644
--- a/lld/docs/ld.lld.1
+++ b/lld/docs/ld.lld.1
@@ -192,6 +192,8 @@ expected to return 0 on success. Any other value is considered a generic error.
 may be
 .Cm missing-lib
 followed by the name of the missing library.
+.Cm undefined-symbol
+followed by the name of the undefined symbol.
 .It Fl -execute-only
 Mark executable sections unreadable.
 This option is currently only supported on AArch64.

diff  --git a/lld/include/lld/Common/ErrorHandler.h b/lld/include/lld/Common/ErrorHandler.h
index 64f363014400..44604524027d 100644
--- a/lld/include/lld/Common/ErrorHandler.h
+++ b/lld/include/lld/Common/ErrorHandler.h
@@ -89,7 +89,7 @@ extern llvm::raw_ostream *stderrOS;
 llvm::raw_ostream &outs();
 llvm::raw_ostream &errs();
 
-enum class ErrorTag { LibNotFound };
+enum class ErrorTag { LibNotFound, SymbolNotFound };
 
 class ErrorHandler {
 public:

diff  --git a/lld/test/ELF/error-handling-script-linux.test b/lld/test/ELF/error-handling-script-linux.test
index c499680ee6df..54e1b29ab236 100755
--- a/lld/test/ELF/error-handling-script-linux.test
+++ b/lld/test/ELF/error-handling-script-linux.test
@@ -2,16 +2,45 @@
 # REQUIRES: x86
 # UNSUPPORTED: system-windows
 
-# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux /dev/null -o %t0.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o %t0.o
 # RUN: not ld.lld -o /dev/null -lidontexist --error-handling-script=%s %t0.o 2>&1 |\
 # RUN:   FileCheck --check-prefix=CHECK-LIB %s
 # RUN: not ld.lld -o /dev/null -lidontexist --error-handling-script=%s.nope %t0.o 2>&1 |\
 # RUN:   FileCheck --check-prefix=CHECK-SCRIPT-DOES-NOT-EXIST -DFILE=%s.nope %s
 
+# RUN: echo 'bar: movl a(%rip), %eax' | llvm-mc -filetype=obj -triple=x86_64 - -o %t1.o
+# RUN: not ld.lld -o /dev/null --error-handling-script=%s %t1.o 2>&1 |\
+# RUN:   FileCheck --check-prefix=CHECK-SYM-C %s
+
+# RUN: echo 'bar: movl _Z1av(%rip), %eax' | llvm-mc -filetype=obj -triple=x86_64 - -o %t2.o
+# RUN: not ld.lld -o /dev/null --demangle --error-handling-script=%s %t2.o 2>&1 |\
+# RUN:   FileCheck --check-prefix=CHECK-SYM-CXX-DEMANGLE %s
+# RUN: not ld.lld -o /dev/null --no-demangle --error-handling-script=%s %t2.o 2>&1 |\
+# RUN:   FileCheck --check-prefix=CHECK-SYM-CXX-NO-DEMANGLE %s
+
+# RUN: { echo 'a_: ret'; echo 'bar: movl a(%rip), %eax' ; } | llvm-mc -filetype=obj -triple=x86_64 - -o %t3.o
+# RUN: not ld.lld -o /dev/null --error-handling-script=%s %t3.o 2>&1 |\
+# RUN:   FileCheck --check-prefix=CHECK-SYM-C-CORRECTION -DOBJ=%t3.o %s
+
 # CHECK-LIB:      script: info: called with missing-lib idontexist
 # CHECK-LIB-NEXT: ld.lld: error: unable to find library -lidontexist
 
 # CHECK-SCRIPT-DOES-NOT-EXIST:      ld.lld: error: unable to find library -lidontexist
 # CHECK-SCRIPT-DOES-NOT-EXIST-NEXT: ld.lld: error: error handling script '[[FILE]]' failed to execute
 
+# CHECK-SYM-C:      script: info: called with undefined-symbol a
+# CHECK-SYM-C-NEXT: ld.lld: error: undefined symbol: a
+
+# CHECK-SYM-CXX-DEMANGLE:      script: info: called with undefined-symbol _Z1av
+# CHECK-SYM-CXX-DEMANGLE-NEXT: ld.lld: error: undefined symbol: a()
+
+# CHECK-SYM-CXX-NO-DEMANGLE:      script: info: called with undefined-symbol _Z1av
+# CHECK-SYM-CXX-NO-DEMANGLE-NEXT: ld.lld: error: undefined symbol: _Z1av
+
+# CHECK-SYM-C-CORRECTION:      script: info: called with undefined-symbol a
+# CHECK-SYM-C-CORRECTION-NEXT: ld.lld: error: undefined symbol: a
+# CHECK-SYM-C-CORRECTION-NEXT: >>> referenced by [[OBJ]]:
+# CHECK-SYM-C-CORRECTION-NEXT: >>> did you mean: a_
+
+
 echo "script: info: called with $*"


        


More information about the llvm-commits mailing list