From e350b28753e1713eac55c1ebd18125123f4d1ecc Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 26 Jan 2017 00:32:15 +0000 Subject: [PATCH] LowerTypeTests: Ignore external globals with type metadata. Thanks to Davide Italiano for finding the problem and providing a test case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293119 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/LowerTypeTests.cpp | 9 ++++++--- test/Transforms/LowerTypeTests/external-global.ll | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 test/Transforms/LowerTypeTests/external-global.ll diff --git a/lib/Transforms/IPO/LowerTypeTests.cpp b/lib/Transforms/IPO/LowerTypeTests.cpp index c7b9564c63f..120e93ab5b7 100644 --- a/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/lib/Transforms/IPO/LowerTypeTests.cpp @@ -878,9 +878,9 @@ void LowerTypeTestsModule::verifyTypeMDNode(GlobalObject *GO, MDNode *Type) { report_fatal_error( "A member of a type identifier may not have an explicit section"); - if (isa(GO) && GO->isDeclarationForLinker()) - report_fatal_error( - "A global var member of a type identifier must be a definition"); + // FIXME: We previously checked that global var member of a type identifier + // must be a definition, but the IR linker may leave type metadata on + // declarations. We should restore this check after fixing PR31759. auto OffsetConstMD = dyn_cast(Type->getOperand(0)); if (!OffsetConstMD) @@ -1375,6 +1375,9 @@ bool LowerTypeTestsModule::lower() { unsigned I = 0; SmallVector Types; for (GlobalObject &GO : M.global_objects()) { + if (isa(GO) && GO.isDeclarationForLinker()) + continue; + Types.clear(); GO.getMetadata(LLVMContext::MD_type, Types); if (Types.empty()) diff --git a/test/Transforms/LowerTypeTests/external-global.ll b/test/Transforms/LowerTypeTests/external-global.ll new file mode 100644 index 00000000000..0b80374aed7 --- /dev/null +++ b/test/Transforms/LowerTypeTests/external-global.ll @@ -0,0 +1,14 @@ +; RUN: opt -S -lowertypetests -lowertypetests-summary-action=export -o - %s | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-scei-ps4" + +; CHECK: @dipsy = external +@dipsy = external constant i8, !type !0 + +define void @tinkywinky() { + store i8* @dipsy, i8** undef + ret void +} + +!0 = !{i64 16, !"teletubbies"} -- 2.11.0