Fix PR36268.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 8 Feb 2018 01:16:05 +0000 (01:16 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 8 Feb 2018 01:16:05 +0000 (01:16 +0000)
The issue is that clang was first creating a extern_weak hidden GV and
then changing the linkage to external.

Once we know it is not extern_weak we know it must be dso_local.

This patch refactors the code that sets the implicit dso_local to a
helper private function that is used every time we change the linkage
or visibility.

I will commit a patch to clang in a minute.

llvm-svn: 324551

llvm/include/llvm/IR/GlobalValue.h

index 116b54e..9478a46 100644 (file)
@@ -112,6 +112,12 @@ protected:
 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 @@ public:
     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 @@ public:
   }
 
   void setLinkage(LinkageTypes LT) {
-    if (isLocalLinkage(LT)) {
+    if (isLocalLinkage(LT))
       Visibility = DefaultVisibility;
-      setDSOLocal(true);
-    }
     Linkage = LT;
+    maybeSetDsoLocal();
   }
   LinkageTypes getLinkage() const { return LinkageTypes(Linkage); }