diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index 4aa81ad971729..377891a14ba93 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -700,7 +700,7 @@ Global Variables Global variables define regions of memory allocated at compilation time instead of run-time. -Global variable definitions must be initialized. +Global variable definitions must be initialized with a sized value. Global variables in other translation units can also be declared, in which case they don't have an initializer. diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 28ba944d8ede3..a8d3003c83c34 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -835,6 +835,8 @@ void Verifier::visitGlobalVariable(const GlobalVariable &GV) { "Global variable initializer type does not match global " "variable type!", &GV); + Check(GV.getInitializer()->getType()->isSized(), + "Global variable initializer must be sized", &GV); // If the global has common linkage, it must have a zero initializer and // cannot be constant. if (GV.hasCommonLinkage()) { diff --git a/llvm/test/Verifier/global-initializer-sized.ll b/llvm/test/Verifier/global-initializer-sized.ll new file mode 100644 index 0000000000000..84fee12b98d4b --- /dev/null +++ b/llvm/test/Verifier/global-initializer-sized.ll @@ -0,0 +1,5 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +@g = global target("opaque") undef + +; CHECK: Global variable initializer must be sized diff --git a/llvm/test/Verifier/scalable-global-vars.ll b/llvm/test/Verifier/scalable-global-vars.ll index fb9a3067acba9..9df644d5e10f0 100644 --- a/llvm/test/Verifier/scalable-global-vars.ll +++ b/llvm/test/Verifier/scalable-global-vars.ll @@ -13,7 +13,7 @@ ; CHECK-NEXT: Globals cannot contain scalable types ; CHECK-NEXT: ptr @ScalableVecStructGlobal -@ScalableVecStructGlobal = global { i32, } zeroinitializer +@ScalableVecStructGlobal = external global { i32, } ; CHECK-NEXT: Globals cannot contain scalable types ; CHECK-NEXT: ptr @StructTestGlobal @@ -23,9 +23,9 @@ ; CHECK-NEXT: Globals cannot contain scalable types ; CHECK-NEXT: ptr @StructArrayTestGlobal %struct.array.test = type { [2 x ] } -@StructArrayTestGlobal = global %struct.array.test zeroinitializer +@StructArrayTestGlobal = external global %struct.array.test ; CHECK-NEXT: Globals cannot contain scalable types ; CHECK-NEXT: ptr @StructTargetTestGlobal %struct.target.test = type { target("aarch64.svcount"), target("aarch64.svcount") } -@StructTargetTestGlobal = global %struct.target.test zeroinitializer +@StructTargetTestGlobal = external global %struct.target.test