GlobalValue: Assert symbols with local linkage have default visibility
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 7 May 2014 23:00:22 +0000 (23:00 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Wed, 7 May 2014 23:00:22 +0000 (23:00 +0000)
The change to ExtractGV.cpp has no functionality change except to avoid
the asserts.  Existing testcases already cover this, so I didn't add a
new one.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208264 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/GlobalValue.h
lib/Transforms/IPO/ExtractGV.cpp

index 84343001112130d044c0de65ab9273ed32775b4d..51b9380ec1cfb0b1aacf626b2acd80c06a21aa1c 100644 (file)
@@ -93,7 +93,11 @@ public:
   bool hasProtectedVisibility() const {
     return Visibility == ProtectedVisibility;
   }
-  void setVisibility(VisibilityTypes V) { Visibility = V; }
+  void setVisibility(VisibilityTypes V) {
+    assert((!hasLocalLinkage() || V == DefaultVisibility) &&
+           "local linkage requires default visibility");
+    Visibility = V;
+  }
 
   DLLStorageClassTypes getDLLStorageClass() const {
     return DLLStorageClassTypes(DllStorageClass);
@@ -195,7 +199,11 @@ public:
   bool hasExternalWeakLinkage() const { return isExternalWeakLinkage(Linkage); }
   bool hasCommonLinkage() const { return isCommonLinkage(Linkage); }
 
-  void setLinkage(LinkageTypes LT) { Linkage = LT; }
+  void setLinkage(LinkageTypes LT) {
+    assert((!isLocalLinkage(LT) || hasDefaultVisibility()) &&
+           "local linkage requires default visibility");
+    Linkage = LT;
+  }
   LinkageTypes getLinkage() const { return Linkage; }
 
   bool isDiscardableIfUnused() const {
index 408713a2c24b3f3c0589db20f9480a171aad951f..40ec9fa8c1dea825b5b4b8a15e0dd2bdc85f3701 100644 (file)
@@ -27,11 +27,10 @@ using namespace llvm;
 /// the split module remain valid.
 static void makeVisible(GlobalValue &GV, bool Delete) {
   bool Local = GV.hasLocalLinkage();
-  if (Local)
-    GV.setVisibility(GlobalValue::HiddenVisibility);
-
   if (Local || Delete) {
     GV.setLinkage(GlobalValue::ExternalLinkage);
+    if (Local)
+      GV.setVisibility(GlobalValue::HiddenVisibility);
     return;
   }