From c9f277f754f3f2a805a077c7b53ef8216e598ec9 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Sat, 14 Mar 2015 00:00:49 +0000 Subject: [PATCH] LowerBitSets: Do not export symbols for bit set referenced globals on Darwin. The linker on that platform may re-order symbols or strip dead symbols, which will break bit set checks. Avoid this by hiding the symbols from the linker. llvm-svn: 232235 --- llvm/lib/Transforms/IPO/LowerBitSets.cpp | 10 +++++++++- llvm/test/Transforms/LowerBitSets/simple.ll | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/IPO/LowerBitSets.cpp b/llvm/lib/Transforms/IPO/LowerBitSets.cpp index 9eb5cdb..8602642 100644 --- a/llvm/lib/Transforms/IPO/LowerBitSets.cpp +++ b/llvm/lib/Transforms/IPO/LowerBitSets.cpp @@ -16,6 +16,7 @@ #include "llvm/Transforms/IPO.h" #include "llvm/ADT/EquivalenceClasses.h" #include "llvm/ADT/Statistic.h" +#include "llvm/ADT/Triple.h" #include "llvm/IR/Constant.h" #include "llvm/IR/Constants.h" #include "llvm/IR/GlobalVariable.h" @@ -186,6 +187,7 @@ struct LowerBitSets : public ModulePass { Module *M; + bool LinkerSubsectionsViaSymbols; IntegerType *Int1Ty; IntegerType *Int8Ty; IntegerType *Int32Ty; @@ -235,6 +237,9 @@ bool LowerBitSets::doInitialization(Module &Mod) { M = &Mod; const DataLayout &DL = Mod.getDataLayout(); + Triple TargetTriple(M->getTargetTriple()); + LinkerSubsectionsViaSymbols = TargetTriple.isMacOSX(); + Int1Ty = Type::getInt1Ty(M->getContext()); Int8Ty = Type::getInt8Ty(M->getContext()); Int32Ty = Type::getInt32Ty(M->getContext()); @@ -524,9 +529,12 @@ void LowerBitSets::buildBitSetsFromGlobals( ConstantInt::get(Int32Ty, I * 2)}; Constant *CombinedGlobalElemPtr = ConstantExpr::getGetElementPtr(CombinedGlobal, CombinedGlobalIdxs); + GlobalValue::LinkageTypes GAliasLinkage = LinkerSubsectionsViaSymbols + ? GlobalValue::PrivateLinkage + : Globals[I]->getLinkage(); GlobalAlias *GAlias = GlobalAlias::create( Globals[I]->getType()->getElementType(), - Globals[I]->getType()->getAddressSpace(), Globals[I]->getLinkage(), + Globals[I]->getType()->getAddressSpace(), GAliasLinkage, "", CombinedGlobalElemPtr, M); GAlias->takeName(Globals[I]); Globals[I]->replaceAllUsesWith(GAlias); diff --git a/llvm/test/Transforms/LowerBitSets/simple.ll b/llvm/test/Transforms/LowerBitSets/simple.ll index 7a7808b..b3b7eb3 100644 --- a/llvm/test/Transforms/LowerBitSets/simple.ll +++ b/llvm/test/Transforms/LowerBitSets/simple.ll @@ -1,4 +1,5 @@ ; RUN: opt -S -lowerbitsets < %s | FileCheck %s +; RUN: opt -S -lowerbitsets -mtriple=x86_64-apple-macosx10.8.0 < %s | FileCheck -check-prefix=CHECK-DARWIN %s ; RUN: opt -S -O3 < %s | FileCheck -check-prefix=CHECK-NODISCARD %s target datalayout = "e-p:32:32" @@ -41,6 +42,10 @@ target datalayout = "e-p:32:32" ; CHECK: @b = alias getelementptr inbounds ({ i32, [0 x i8], [63 x i32], [4 x i8], i32, [0 x i8], [2 x i32] }, { i32, [0 x i8], [63 x i32], [4 x i8], i32, [0 x i8], [2 x i32] }* [[G]], i32 0, i32 2) ; CHECK: @c = alias getelementptr inbounds ({ i32, [0 x i8], [63 x i32], [4 x i8], i32, [0 x i8], [2 x i32] }, { i32, [0 x i8], [63 x i32], [4 x i8], i32, [0 x i8], [2 x i32] }* [[G]], i32 0, i32 4) ; CHECK: @d = alias getelementptr inbounds ({ i32, [0 x i8], [63 x i32], [4 x i8], i32, [0 x i8], [2 x i32] }, { i32, [0 x i8], [63 x i32], [4 x i8], i32, [0 x i8], [2 x i32] }* [[G]], i32 0, i32 6) +; CHECK-DARWIN: @a = private alias +; CHECK-DARWIN: @b = private alias +; CHECK-DARWIN: @c = private alias +; CHECK-DARWIN: @d = private alias ; CHECK: @bits = private alias getelementptr inbounds ([68 x i8], [68 x i8]* [[BA]], i32 0, i32 0) ; CHECK: @bits1 = private alias getelementptr inbounds ([68 x i8], [68 x i8]* [[BA]], i32 0, i32 0) -- 2.7.4