From c906847356f68b626aaa91b44b2729eef67f8a26 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 7 Sep 2017 01:33:52 +0000 Subject: [PATCH] Object: Downgrade invalid weak externals from an assert fail to an llvm::Error when creating an irsymtab. This fixes bitcode emission for modules containing invalid weak externals. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312686 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/IRSymtab.cpp | 9 ++++++--- test/Bitcode/invalid-weak-external.ll | 11 +++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 test/Bitcode/invalid-weak-external.ll diff --git a/lib/Object/IRSymtab.cpp b/lib/Object/IRSymtab.cpp index 668cf62d1e8..7fc84e2046c 100644 --- a/lib/Object/IRSymtab.cpp +++ b/lib/Object/IRSymtab.cpp @@ -231,11 +231,14 @@ Error Builder::addSymbol(const ModuleSymbolTable &Msymtab, if ((Flags & object::BasicSymbolRef::SF_Weak) && (Flags & object::BasicSymbolRef::SF_Indirect)) { + auto *Fallback = dyn_cast( + cast(GV)->getAliasee()->stripPointerCasts()); + if (!Fallback) + return make_error("Invalid weak external", + inconvertibleErrorCode()); std::string FallbackName; raw_string_ostream OS(FallbackName); - Msymtab.printSymbolName( - OS, cast( - cast(GV)->getAliasee()->stripPointerCasts())); + Msymtab.printSymbolName(OS, Fallback); OS.flush(); setStr(Uncommon().COFFWeakExternFallbackName, Saver.save(FallbackName)); } diff --git a/test/Bitcode/invalid-weak-external.ll b/test/Bitcode/invalid-weak-external.ll new file mode 100644 index 00000000000..def93ec51da --- /dev/null +++ b/test/Bitcode/invalid-weak-external.ll @@ -0,0 +1,11 @@ +; REQUIRES: x86-registered-target +; RUN: opt -o %t %s +; RUN: not llvm-lto2 dump-symtab %t 2>&1 | FileCheck %s + +target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" +target triple = "x86_64-pc-windows-msvc" + +@bar = global i32 0 + +; CHECK: Invalid weak external +@foo = weak alias i32, i32* getelementptr (i32, i32* @bar, i32 1) -- 2.11.0