[llvm] 198a13e - Fix for PR46384. Failure on weak dllimport.

Sunil Srivastava via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 2 19:12:38 PDT 2020


Author: Sunil Srivastava
Date: 2020-09-02T19:12:24-07:00
New Revision: 198a13e970db2e88d0eaa62f69778388065edf70

URL: https://github.com/llvm/llvm-project/commit/198a13e970db2e88d0eaa62f69778388065edf70
DIFF: https://github.com/llvm/llvm-project/commit/198a13e970db2e88d0eaa62f69778388065edf70.diff

LOG: Fix for PR46384. Failure on weak dllimport.

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

Added: 
    llvm/test/Verifier/weak-dllimport.ll

Modified: 
    llvm/lib/IR/Verifier.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 89fc0d073749..6cae21e3cfe1 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -589,7 +589,8 @@ void Verifier::visitGlobalValue(const GlobalValue &GV) {
     Assert(!GV.isDSOLocal(),
            "GlobalValue with DLLImport Storage is dso_local!", &GV);
 
-    Assert((GV.isDeclaration() && GV.hasExternalLinkage()) ||
+    Assert((GV.isDeclaration() &&
+            (GV.hasExternalLinkage() || GV.hasExternalWeakLinkage())) ||
                GV.hasAvailableExternallyLinkage(),
            "Global is marked as dllimport, but not external", &GV);
   }

diff  --git a/llvm/test/Verifier/weak-dllimport.ll b/llvm/test/Verifier/weak-dllimport.ll
new file mode 100644
index 000000000000..c7b6ed977b10
--- /dev/null
+++ b/llvm/test/Verifier/weak-dllimport.ll
@@ -0,0 +1,28 @@
+; RUN: opt -verify < %s 2>&1 | FileCheck %s
+; CHECK-NOT: Global is marked as dllimport, but not external
+
+target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc19.11.0"
+
+@"?var_hook@@3HA" = extern_weak dllimport global i32, align 4
+
+; Function Attrs: noinline optnone uwtable
+define dso_local zeroext i1 @"?foo@@YA_NPEAHH at Z"(i32* %0, i32 %1) #0 {
+   ret i1 0
+}
+
+declare extern_weak dllimport void @func_hook(i32) #1
+
+attributes #0 = { noinline optnone uwtable }
+attributes #1 = { uwtable }
+
+; Compiled from the following C++ example with --target=x86_64-pc-win32,
+; using the non-checking configuration
+;__declspec(dllimport) __attribute__((weak)) extern "C" void func_hook(int);
+;extern __declspec(dllimport) __attribute__((weak)) int var_hook;
+;bool foo(int *q, int p)
+;{
+;  if (func_hook)
+;    func_hook(p);
+;  return &var_hook == q;
+;}


        


More information about the llvm-commits mailing list