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 @@ -663,7 +663,13 @@ if (GV.isDeclarationForLinker()) Check(!GV.hasComdat(), "Declaration may not be in a Comdat!", &GV); + if (GV.hasDLLExportStorageClass()) { + Check(GV.hasDefaultVisibility(), + "dllexport GlobalValue must have default visibility", &GV); + } if (GV.hasDLLImportStorageClass()) { + Check(GV.hasDefaultVisibility(), + "dllimport GlobalValue must have default visibility", &GV); Check(!GV.isDSOLocal(), "GlobalValue with DLLImport Storage is dso_local!", &GV); diff --git a/llvm/test/CodeGen/PowerPC/aix-xcoff-exported-nondefault.ll b/llvm/test/CodeGen/PowerPC/aix-xcoff-exported-nondefault.ll --- a/llvm/test/CodeGen/PowerPC/aix-xcoff-exported-nondefault.ll +++ b/llvm/test/CodeGen/PowerPC/aix-xcoff-exported-nondefault.ll @@ -1,15 +1,5 @@ -; RUN: not --crash llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff 2>&1 < %s | \ -; RUN: FileCheck %s -; RUN: not --crash llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff 2>&1 < %s |\ -; RUN: FileCheck %s +; RUN: not llc -filetype=null -mtriple powerpc-ibm-aix-xcoff 2>&1 %s | FileCheck %s +; RUN: not llc -filetype=null -mtriple powerpc64-ibm-aix-xcoff 2>&1 %s | FileCheck %s -; RUN: not --crash llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff \ -; RUN: -filetype=obj -o %t.o < %s 2>&1 | \ -; RUN: FileCheck %s - -; RUN: not --crash llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff \ -; RUN: -filetype=obj -o %t.o 2>&1 < %s 2>&1 | \ -; RUN: FileCheck %s - -; CHECK: LLVM ERROR: Cannot not be both dllexport and non-default visibility +; CHECK: dllexport GlobalValue must have default visibility @b_e = hidden dllexport global i32 0, align 4 diff --git a/llvm/test/Feature/globalvars.ll b/llvm/test/Feature/globalvars.ll --- a/llvm/test/Feature/globalvars.ll +++ b/llvm/test/Feature/globalvars.ll @@ -16,5 +16,5 @@ ret i32 %blah } -@1 = hidden dllexport global i32 42 +@1 = default dllexport global i32 42 @2 = dllexport global i32 42 diff --git a/llvm/test/Verifier/dllstorage.ll b/llvm/test/Verifier/dllstorage.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Verifier/dllstorage.ll @@ -0,0 +1,18 @@ +; RUN: not opt -verify %s 2>&1 | FileCheck %s + +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-gnu" + +; CHECK: dllexport GlobalValue must have default visibility +; CHECK-NEXT: ptr @dllexport_hidden +declare hidden dllexport i32 @dllexport_hidden() +; CHECK: dllexport GlobalValue must have default visibility +; CHECK-NEXT: ptr @dllexport_protected +declare protected dllexport i32 @dllexport_protected() + +; CHECK: dllimport GlobalValue must have default visibility +; CHECK-NEXT: ptr @dllimport_hidden +declare hidden dllimport i32 @dllimport_hidden() +; CHECK: dllimport GlobalValue must have default visibility +; CHECK-NEXT: ptr @dllimport_protected +declare protected dllimport i32 @dllimport_protected()