IR: Don't allow non-default visibility on local linkage

Visibilities of `hidden` and `protected` are meaningless for symbols
with local linkage.

  - Change the assembler to reject non-default visibility on symbols
    with local linkage.

  - Change the bitcode reader to auto-upgrade `hidden` and `protected`
    to `default` when the linkage is local.

  - Update LangRef.

<rdar://problem/16141113>

llvm-svn: 208263
diff --git a/llvm/test/Assembler/internal-hidden-alias.ll b/llvm/test/Assembler/internal-hidden-alias.ll
new file mode 100644
index 0000000..660514b
--- /dev/null
+++ b/llvm/test/Assembler/internal-hidden-alias.ll
@@ -0,0 +1,6 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+@global = global i32 0
+
+@alias = hidden alias internal i32* @global
+; CHECK: symbol with local linkage must have default visibility
diff --git a/llvm/test/Assembler/internal-hidden-function.ll b/llvm/test/Assembler/internal-hidden-function.ll
new file mode 100644
index 0000000..193ed7c
--- /dev/null
+++ b/llvm/test/Assembler/internal-hidden-function.ll
@@ -0,0 +1,7 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+define internal hidden void @function() {
+; CHECK: symbol with local linkage must have default visibility
+entry:
+  ret void
+}
diff --git a/llvm/test/Assembler/internal-hidden-variable.ll b/llvm/test/Assembler/internal-hidden-variable.ll
new file mode 100644
index 0000000..eddd0675
--- /dev/null
+++ b/llvm/test/Assembler/internal-hidden-variable.ll
@@ -0,0 +1,4 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+@var = internal hidden global i32 0
+; CHECK: symbol with local linkage must have default visibility
diff --git a/llvm/test/Assembler/internal-protected-alias.ll b/llvm/test/Assembler/internal-protected-alias.ll
new file mode 100644
index 0000000..d785826
--- /dev/null
+++ b/llvm/test/Assembler/internal-protected-alias.ll
@@ -0,0 +1,6 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+@global = global i32 0
+
+@alias = protected alias internal i32* @global
+; CHECK: symbol with local linkage must have default visibility
diff --git a/llvm/test/Assembler/internal-protected-function.ll b/llvm/test/Assembler/internal-protected-function.ll
new file mode 100644
index 0000000..944cb75
--- /dev/null
+++ b/llvm/test/Assembler/internal-protected-function.ll
@@ -0,0 +1,7 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+define internal protected void @function() {
+; CHECK: symbol with local linkage must have default visibility
+entry:
+  ret void
+}
diff --git a/llvm/test/Assembler/internal-protected-variable.ll b/llvm/test/Assembler/internal-protected-variable.ll
new file mode 100644
index 0000000..df02275
--- /dev/null
+++ b/llvm/test/Assembler/internal-protected-variable.ll
@@ -0,0 +1,4 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+@var = internal protected global i32 0
+; CHECK: symbol with local linkage must have default visibility
diff --git a/llvm/test/Assembler/private-hidden-alias.ll b/llvm/test/Assembler/private-hidden-alias.ll
new file mode 100644
index 0000000..58be92a
--- /dev/null
+++ b/llvm/test/Assembler/private-hidden-alias.ll
@@ -0,0 +1,6 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+@global = global i32 0
+
+@alias = hidden alias private i32* @global
+; CHECK: symbol with local linkage must have default visibility
diff --git a/llvm/test/Assembler/private-hidden-function.ll b/llvm/test/Assembler/private-hidden-function.ll
new file mode 100644
index 0000000..dd73f04
--- /dev/null
+++ b/llvm/test/Assembler/private-hidden-function.ll
@@ -0,0 +1,7 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+define private hidden void @function() {
+; CHECK: symbol with local linkage must have default visibility
+entry:
+  ret void
+}
diff --git a/llvm/test/Assembler/private-hidden-variable.ll b/llvm/test/Assembler/private-hidden-variable.ll
new file mode 100644
index 0000000..ce6bfa9
--- /dev/null
+++ b/llvm/test/Assembler/private-hidden-variable.ll
@@ -0,0 +1,4 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+@var = private hidden global i32 0
+; CHECK: symbol with local linkage must have default visibility
diff --git a/llvm/test/Assembler/private-protected-alias.ll b/llvm/test/Assembler/private-protected-alias.ll
new file mode 100644
index 0000000..a72c248
--- /dev/null
+++ b/llvm/test/Assembler/private-protected-alias.ll
@@ -0,0 +1,6 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+@global = global i32 0
+
+@alias = protected alias private i32* @global
+; CHECK: symbol with local linkage must have default visibility
diff --git a/llvm/test/Assembler/private-protected-function.ll b/llvm/test/Assembler/private-protected-function.ll
new file mode 100644
index 0000000..5dbb420
--- /dev/null
+++ b/llvm/test/Assembler/private-protected-function.ll
@@ -0,0 +1,7 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+define private protected void @function() {
+; CHECK: symbol with local linkage must have default visibility
+entry:
+  ret void
+}
diff --git a/llvm/test/Assembler/private-protected-variable.ll b/llvm/test/Assembler/private-protected-variable.ll
new file mode 100644
index 0000000..c4458f5
--- /dev/null
+++ b/llvm/test/Assembler/private-protected-variable.ll
@@ -0,0 +1,4 @@
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
+
+@var = private protected global i32 0
+; CHECK: symbol with local linkage must have default visibility