Commit 425198bf authored by Michael Spang's avatar Michael Spang Committed by Hans Wennborg
Browse files

[GlobalMerge] Preserve symbol visibility when merging globals

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 a2fb2c0d)
parent 81d73c6d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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();

@@ -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);
      }

+26 −0
Original line number Diff line number Diff line
; 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