forked from OSchip/llvm-project
[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
This commit is contained in:
parent
28fc173819
commit
1e70ec10eb
|
@ -239,6 +239,9 @@ void ErrorHandler::error(const Twine &msg, ErrorTag tag,
|
||||||
case ErrorTag::LibNotFound:
|
case ErrorTag::LibNotFound:
|
||||||
scriptArgs.push_back("missing-lib");
|
scriptArgs.push_back("missing-lib");
|
||||||
break;
|
break;
|
||||||
|
case ErrorTag::SymbolNotFound:
|
||||||
|
scriptArgs.push_back("undefined-symbol");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
scriptArgs.insert(scriptArgs.end(), args.begin(), args.end());
|
scriptArgs.insert(scriptArgs.end(), args.begin(), args.end());
|
||||||
int res = llvm::sys::ExecuteAndWait(errorHandlingScript, scriptArgs);
|
int res = llvm::sys::ExecuteAndWait(errorHandlingScript, scriptArgs);
|
||||||
|
|
|
@ -919,7 +919,7 @@ static void reportUndefinedSymbol(const UndefinedDiag &undef,
|
||||||
if (undef.isWarning)
|
if (undef.isWarning)
|
||||||
warn(msg);
|
warn(msg);
|
||||||
else
|
else
|
||||||
error(msg);
|
error(msg, ErrorTag::SymbolNotFound, {sym.getName()});
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class ELFT> void elf::reportUndefinedSymbols() {
|
template <class ELFT> void elf::reportUndefinedSymbols() {
|
||||||
|
|
|
@ -27,6 +27,10 @@ The following tags are supported:
|
||||||
is specified as the second argument, e.g. ``error-handling-script missing-lib
|
is specified as the second argument, e.g. ``error-handling-script missing-lib
|
||||||
mylib``
|
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
|
Return Value
|
||||||
============
|
============
|
||||||
|
|
||||||
|
|
|
@ -192,6 +192,8 @@ expected to return 0 on success. Any other value is considered a generic error.
|
||||||
may be
|
may be
|
||||||
.Cm missing-lib
|
.Cm missing-lib
|
||||||
followed by the name of the missing library.
|
followed by the name of the missing library.
|
||||||
|
.Cm undefined-symbol
|
||||||
|
followed by the name of the undefined symbol.
|
||||||
.It Fl -execute-only
|
.It Fl -execute-only
|
||||||
Mark executable sections unreadable.
|
Mark executable sections unreadable.
|
||||||
This option is currently only supported on AArch64.
|
This option is currently only supported on AArch64.
|
||||||
|
|
|
@ -89,7 +89,7 @@ extern llvm::raw_ostream *stderrOS;
|
||||||
llvm::raw_ostream &outs();
|
llvm::raw_ostream &outs();
|
||||||
llvm::raw_ostream &errs();
|
llvm::raw_ostream &errs();
|
||||||
|
|
||||||
enum class ErrorTag { LibNotFound };
|
enum class ErrorTag { LibNotFound, SymbolNotFound };
|
||||||
|
|
||||||
class ErrorHandler {
|
class ErrorHandler {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -2,16 +2,45 @@
|
||||||
# REQUIRES: x86
|
# REQUIRES: x86
|
||||||
# UNSUPPORTED: system-windows
|
# 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: not ld.lld -o /dev/null -lidontexist --error-handling-script=%s %t0.o 2>&1 |\
|
||||||
# RUN: FileCheck --check-prefix=CHECK-LIB %s
|
# 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: 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: 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: script: info: called with missing-lib idontexist
|
||||||
# CHECK-LIB-NEXT: ld.lld: error: unable to find library -lidontexist
|
# 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: 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-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 $*"
|
echo "script: info: called with $*"
|
||||||
|
|
Loading…
Reference in New Issue