diff options
author | Reid Kleckner <rnk@google.com> | 2019-02-13 01:39:32 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2019-02-13 01:39:32 +0000 |
commit | c987e861dd1299b88d66c656f5f7d136362c1466 (patch) | |
tree | d797771c1159a9ca267f1620253b041e24e835e6 | |
parent | a1881f222dd5d43a992a21b3d7fa463fc190a4e7 (diff) | |
download | llvm-c987e861dd1299b88d66c656f5f7d136362c1466.tar.gz |
[MC] Make symbol version errors non-fatal
We stil don't have a source location, which is pretty lame, but at least
we won't tell the user to file a clang bug report anymore.
Fixes PR40712
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353907 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 18 | ||||
-rw-r--r-- | test/MC/ELF/invalid-symver.s | 2 | ||||
-rw-r--r-- | test/MC/ELF/multiple-different-symver.s | 2 |
3 files changed, 14 insertions, 8 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index b118fe69d95..9cae28128c9 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -1274,14 +1274,20 @@ void ELFObjectWriter::executePostLayoutBinding(MCAssembler &Asm, if (!Symbol.isUndefined() && !Rest.startswith("@@@")) continue; - // FIXME: produce a better error message. + // FIXME: Get source locations for these errors or diagnose them earlier. if (Symbol.isUndefined() && Rest.startswith("@@") && - !Rest.startswith("@@@")) - report_fatal_error("A @@ version cannot be undefined"); + !Rest.startswith("@@@")) { + Asm.getContext().reportError(SMLoc(), "versioned symbol " + AliasName + + " must be defined"); + continue; + } - if (Renames.count(&Symbol) && Renames[&Symbol] != Alias) - report_fatal_error(llvm::Twine("Multiple symbol versions defined for ") + - Symbol.getName()); + if (Renames.count(&Symbol) && Renames[&Symbol] != Alias) { + Asm.getContext().reportError( + SMLoc(), llvm::Twine("multiple symbol versions defined for ") + + Symbol.getName()); + continue; + } Renames.insert(std::make_pair(&Symbol, Alias)); } diff --git a/test/MC/ELF/invalid-symver.s b/test/MC/ELF/invalid-symver.s index 3c4f8c084b9..d9f97b102b5 100644 --- a/test/MC/ELF/invalid-symver.s +++ b/test/MC/ELF/invalid-symver.s @@ -1,7 +1,7 @@ // RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t 2> %t.out // RUN: FileCheck --input-file=%t.out %s -// CHECK: A @@ version cannot be undefined +// CHECK: error: versioned symbol foo@@bar must be defined .symver undefined, foo@@bar .long undefined diff --git a/test/MC/ELF/multiple-different-symver.s b/test/MC/ELF/multiple-different-symver.s index d7706f89f41..c34626c0817 100644 --- a/test/MC/ELF/multiple-different-symver.s +++ b/test/MC/ELF/multiple-different-symver.s @@ -1,6 +1,6 @@ // RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t 2>&1 | FileCheck %s -// CHECK: Multiple symbol versions defined for foo +// CHECK: error: multiple symbol versions defined for foo .symver foo, foo@1 .symver foo, foo@2 |