Skip to content

Commit

Permalink
[GlobalMerge] Preserve symbol visibility when merging globals
Browse files Browse the repository at this point in the history
Symbols created for merged external global variables have default
visibility. This can break programs when compiling with -Oz
-fvisibility=hidden as symbols that should be hidden will be exported at
link time.

Differential Revision: https://reviews.llvm.org/D73235

(cherry picked from commit a2fb2c0)
  • Loading branch information
mspang authored and zmodem committed Jan 29, 2020
1 parent 81d73c6 commit 425198b
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
2 changes: 2 additions & 0 deletions llvm/lib/CodeGen/GlobalMerge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,7 @@ bool GlobalMerge::doMerge(const SmallVectorImpl<GlobalVariable *> &Globals,
for (ssize_t k = i, idx = 0; k != j; k = GlobalSet.find_next(k), ++idx) {
GlobalValue::LinkageTypes Linkage = Globals[k]->getLinkage();
std::string Name = Globals[k]->getName();
GlobalValue::VisibilityTypes Visibility = Globals[k]->getVisibility();
GlobalValue::DLLStorageClassTypes DLLStorage =
Globals[k]->getDLLStorageClass();

Expand All @@ -549,6 +550,7 @@ bool GlobalMerge::doMerge(const SmallVectorImpl<GlobalVariable *> &Globals,
if (Linkage != GlobalValue::InternalLinkage || !IsMachO) {
GlobalAlias *GA = GlobalAlias::create(Tys[StructIdxs[idx]], AddrSpace,
Linkage, Name, GEP, &M);
GA->setVisibility(Visibility);
GA->setDLLStorageClass(DLLStorage);
}

Expand Down
26 changes: 26 additions & 0 deletions llvm/test/CodeGen/AArch64/global-merge-hidden-minsize.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
; RUN: llc %s -mtriple=arm-none-linux-gnu -o - | FileCheck %s
; RUN: llc %s -mtriple=aarch64-none-linux-gnu -o - | FileCheck %s

@x = hidden global i32 0, align 4
@y = hidden global i32 0, align 4

define hidden void @f() #0 {
store i32 0, i32* @x, align 4
store i32 0, i32* @y, align 4
ret void
}

attributes #0 = { minsize optsize }

; CHECK: .local .L_MergedGlobals
; CHECK: .comm .L_MergedGlobals,8,4

; CHECK: .globl x
; CHECK: .hidden x
; CHECK: .set x, .L_MergedGlobals
; CHECK: .size x, 4

; CHECK: .globl y
; CHECK: .hidden y
; CHECK: .set y, .L_MergedGlobals+4
; CHECK: .size y, 4

0 comments on commit 425198b

Please sign in to comment.