Index: clang/test/CodeGenObjC/availability-dso-local.m =================================================================== --- /dev/null +++ clang/test/CodeGenObjC/availability-dso-local.m @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -triple thumbv7-apple-ios10.0.0 -emit-llvm -fvisibility hidden -w %s -o - | FileCheck %s + +// CHECK: @"OBJC_CLASS_$_a" = hidden global %struct._class_t + +__attribute__((availability(ios, introduced = 11.0))) @interface a @end + @implementation a @end Index: llvm/include/llvm/IR/GlobalValue.h =================================================================== --- llvm/include/llvm/IR/GlobalValue.h +++ llvm/include/llvm/IR/GlobalValue.h @@ -112,6 +112,12 @@ private: friend class Constant; + void maybeSetDsoLocal() { + if (hasLocalLinkage() || + (!hasDefaultVisibility() && !hasExternalWeakLinkage())) + setDSOLocal(true); + } + // Give subclasses access to what otherwise would be wasted padding. // (17 + 4 + 2 + 2 + 2 + 3 + 1 + 1) == 32. unsigned SubClassData : GlobalValueSubClassDataBits; @@ -233,8 +239,7 @@ assert((!hasLocalLinkage() || V == DefaultVisibility) && "local linkage requires default visibility"); Visibility = V; - if (!hasExternalWeakLinkage() && V != DefaultVisibility) - setDSOLocal(true); + maybeSetDsoLocal(); } /// If the value is "Thread Local", its value isn't shared by the threads. @@ -437,11 +442,10 @@ } void setLinkage(LinkageTypes LT) { - if (isLocalLinkage(LT)) { + if (isLocalLinkage(LT)) Visibility = DefaultVisibility; - setDSOLocal(true); - } Linkage = LT; + maybeSetDsoLocal(); } LinkageTypes getLinkage() const { return LinkageTypes(Linkage); }