diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -589,7 +589,8 @@ 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 --- /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@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; +;}