From 76c17d324ca877420e4be98638ef15a62b2efa4e Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 7 May 2014 22:57:20 +0000 Subject: 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208263 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Assembler/internal-hidden-alias.ll | 6 ++ test/Assembler/internal-hidden-function.ll | 7 ++ test/Assembler/internal-hidden-variable.ll | 4 ++ test/Assembler/internal-protected-alias.ll | 6 ++ test/Assembler/internal-protected-function.ll | 7 ++ test/Assembler/internal-protected-variable.ll | 4 ++ test/Assembler/private-hidden-alias.ll | 6 ++ test/Assembler/private-hidden-function.ll | 7 ++ test/Assembler/private-hidden-variable.ll | 4 ++ test/Assembler/private-protected-alias.ll | 6 ++ test/Assembler/private-protected-function.ll | 7 ++ test/Assembler/private-protected-variable.ll | 4 ++ .../local-linkage-default-visibility.3.4.ll | 79 +++++++++++++++++++++ .../local-linkage-default-visibility.3.4.ll.bc | Bin 0 -> 924 bytes test/LTO/keep-used-puts-during-instcombine.ll | 4 +- test/Transforms/GlobalOpt/alias-used-section.ll | 4 +- test/Transforms/GlobalOpt/atexit.ll | 2 +- test/Transforms/MergeFunc/crash.ll | 14 ++-- .../Transforms/MergeFunc/inttoptr-address-space.ll | 6 +- test/Transforms/MergeFunc/inttoptr.ll | 14 ++-- 20 files changed, 169 insertions(+), 22 deletions(-) create mode 100644 test/Assembler/internal-hidden-alias.ll create mode 100644 test/Assembler/internal-hidden-function.ll create mode 100644 test/Assembler/internal-hidden-variable.ll create mode 100644 test/Assembler/internal-protected-alias.ll create mode 100644 test/Assembler/internal-protected-function.ll create mode 100644 test/Assembler/internal-protected-variable.ll create mode 100644 test/Assembler/private-hidden-alias.ll create mode 100644 test/Assembler/private-hidden-function.ll create mode 100644 test/Assembler/private-hidden-variable.ll create mode 100644 test/Assembler/private-protected-alias.ll create mode 100644 test/Assembler/private-protected-function.ll create mode 100644 test/Assembler/private-protected-variable.ll create mode 100644 test/Bitcode/local-linkage-default-visibility.3.4.ll create mode 100644 test/Bitcode/local-linkage-default-visibility.3.4.ll.bc (limited to 'test') diff --git a/test/Assembler/internal-hidden-alias.ll b/test/Assembler/internal-hidden-alias.ll new file mode 100644 index 0000000000..660514bb18 --- /dev/null +++ b/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/test/Assembler/internal-hidden-function.ll b/test/Assembler/internal-hidden-function.ll new file mode 100644 index 0000000000..193ed7c289 --- /dev/null +++ b/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/test/Assembler/internal-hidden-variable.ll b/test/Assembler/internal-hidden-variable.ll new file mode 100644 index 0000000000..eddd06758a --- /dev/null +++ b/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/test/Assembler/internal-protected-alias.ll b/test/Assembler/internal-protected-alias.ll new file mode 100644 index 0000000000..d78582684c --- /dev/null +++ b/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/test/Assembler/internal-protected-function.ll b/test/Assembler/internal-protected-function.ll new file mode 100644 index 0000000000..944cb75eec --- /dev/null +++ b/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/test/Assembler/internal-protected-variable.ll b/test/Assembler/internal-protected-variable.ll new file mode 100644 index 0000000000..df02275bac --- /dev/null +++ b/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/test/Assembler/private-hidden-alias.ll b/test/Assembler/private-hidden-alias.ll new file mode 100644 index 0000000000..58be92a34f --- /dev/null +++ b/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/test/Assembler/private-hidden-function.ll b/test/Assembler/private-hidden-function.ll new file mode 100644 index 0000000000..dd73f0413b --- /dev/null +++ b/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/test/Assembler/private-hidden-variable.ll b/test/Assembler/private-hidden-variable.ll new file mode 100644 index 0000000000..ce6bfa9bae --- /dev/null +++ b/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/test/Assembler/private-protected-alias.ll b/test/Assembler/private-protected-alias.ll new file mode 100644 index 0000000000..a72c248f0b --- /dev/null +++ b/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/test/Assembler/private-protected-function.ll b/test/Assembler/private-protected-function.ll new file mode 100644 index 0000000000..5dbb420a82 --- /dev/null +++ b/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/test/Assembler/private-protected-variable.ll b/test/Assembler/private-protected-variable.ll new file mode 100644 index 0000000000..c4458f5b3f --- /dev/null +++ b/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 diff --git a/test/Bitcode/local-linkage-default-visibility.3.4.ll b/test/Bitcode/local-linkage-default-visibility.3.4.ll new file mode 100644 index 0000000000..45a7b1213a --- /dev/null +++ b/test/Bitcode/local-linkage-default-visibility.3.4.ll @@ -0,0 +1,79 @@ +; RUN: llvm-dis < %s.bc | FileCheck %s + +; local-linkage-default-visibility.3.4.ll.bc was generated by passing this file +; to llvm-as-3.4. The test checks that LLVM upgrades visibility of symbols +; with local linkage to default visibility. + +@default.internal.var = internal global i32 0 +; CHECK: @default.internal.var = internal global i32 0 + +@hidden.internal.var = internal hidden global i32 0 +; CHECK: @hidden.internal.var = internal global i32 0 + +@protected.internal.var = internal protected global i32 0 +; CHECK: @protected.internal.var = internal global i32 0 + +@default.private.var = private global i32 0 +; CHECK: @default.private.var = private global i32 0 + +@hidden.private.var = private hidden global i32 0 +; CHECK: @hidden.private.var = private global i32 0 + +@protected.private.var = private protected global i32 0 +; CHECK: @protected.private.var = private global i32 0 + +@global = global i32 0 + +@default.internal.alias = alias internal i32* @global +; CHECK: @default.internal.alias = alias internal i32* @global + +@hidden.internal.alias = hidden alias internal i32* @global +; CHECK: @hidden.internal.alias = alias internal i32* @global + +@protected.internal.alias = protected alias internal i32* @global +; CHECK: @protected.internal.alias = alias internal i32* @global + +@default.private.alias = alias private i32* @global +; CHECK: @default.private.alias = alias private i32* @global + +@hidden.private.alias = hidden alias private i32* @global +; CHECK: @hidden.private.alias = alias private i32* @global + +@protected.private.alias = protected alias private i32* @global +; CHECK: @protected.private.alias = alias private i32* @global + +define internal void @default.internal() { +; CHECK: define internal void @default.internal +entry: + ret void +} + +define internal hidden void @hidden.internal() { +; CHECK: define internal void @hidden.internal +entry: + ret void +} + +define internal protected void @protected.internal() { +; CHECK: define internal void @protected.internal +entry: + ret void +} + +define private void @default.private() { +; CHECK: define private void @default.private +entry: + ret void +} + +define private hidden void @hidden.private() { +; CHECK: define private void @hidden.private +entry: + ret void +} + +define private protected void @protected.private() { +; CHECK: define private void @protected.private +entry: + ret void +} diff --git a/test/Bitcode/local-linkage-default-visibility.3.4.ll.bc b/test/Bitcode/local-linkage-default-visibility.3.4.ll.bc new file mode 100644 index 0000000000..6e49f7e365 Binary files /dev/null and b/test/Bitcode/local-linkage-default-visibility.3.4.ll.bc differ diff --git a/test/LTO/keep-used-puts-during-instcombine.ll b/test/LTO/keep-used-puts-during-instcombine.ll index 1dc63dd4fc..69ce3ee3fa 100644 --- a/test/LTO/keep-used-puts-during-instcombine.ll +++ b/test/LTO/keep-used-puts-during-instcombine.ll @@ -20,14 +20,14 @@ entry: ret i32 0 } -define internal hidden i32 @printf(i8* readonly nocapture %fmt, ...) { +define internal i32 @printf(i8* readonly nocapture %fmt, ...) { entry: %ret = call i32 @bar(i8* %fmt) ret i32 %ret } ; CHECK: define {{.*}} @puts( -define internal hidden i32 @puts(i8* %s) { +define internal i32 @puts(i8* %s) { entry: %ret = call i32 @bar(i8* %s) ret i32 %ret diff --git a/test/Transforms/GlobalOpt/alias-used-section.ll b/test/Transforms/GlobalOpt/alias-used-section.ll index 987c4a4926..121793724d 100644 --- a/test/Transforms/GlobalOpt/alias-used-section.ll +++ b/test/Transforms/GlobalOpt/alias-used-section.ll @@ -1,8 +1,8 @@ ; RUN: opt -S -globalopt < %s | FileCheck %s @_Z17in_custom_section = internal global i8 42, section "CUSTOM" -@in_custom_section = protected dllexport alias internal i8* @_Z17in_custom_section +@in_custom_section = dllexport alias internal i8* @_Z17in_custom_section -; CHECK: @in_custom_section = internal protected dllexport global i8 42, section "CUSTOM" +; CHECK: @in_custom_section = internal dllexport global i8 42, section "CUSTOM" @llvm.used = appending global [1 x i8*] [i8* @in_custom_section], section "llvm.metadata" diff --git a/test/Transforms/GlobalOpt/atexit.ll b/test/Transforms/GlobalOpt/atexit.ll index dbcd0d7b00..55c2dab1c1 100644 --- a/test/Transforms/GlobalOpt/atexit.ll +++ b/test/Transforms/GlobalOpt/atexit.ll @@ -1,6 +1,6 @@ ; RUN: opt < %s -globalopt -S | FileCheck %s ; CHECK: ModuleID -define internal hidden i32 @__cxa_atexit(void (i8*)* nocapture %func, i8* nocapture %arg, i8* nocapture %dso_handle) nounwind readnone optsize noimplicitfloat { +define internal i32 @__cxa_atexit(void (i8*)* nocapture %func, i8* nocapture %arg, i8* nocapture %dso_handle) nounwind readnone optsize noimplicitfloat { unreachable } diff --git a/test/Transforms/MergeFunc/crash.ll b/test/Transforms/MergeFunc/crash.ll index 0897ba2893..3475e28a65 100644 --- a/test/Transforms/MergeFunc/crash.ll +++ b/test/Transforms/MergeFunc/crash.ll @@ -8,9 +8,9 @@ target triple = "i386-pc-linux-gnu" %.qux.2585 = type { i32, i32, i8* } @g2 = external unnamed_addr constant [9 x i8], align 1 -@g3 = internal hidden unnamed_addr constant [1 x i8*] [i8* bitcast (i8* (%.qux.2585*)* @func35 to i8*)] +@g3 = internal unnamed_addr constant [1 x i8*] [i8* bitcast (i8* (%.qux.2585*)* @func35 to i8*)] -define internal hidden i32 @func1(i32* %ptr, { i32, i32 }* nocapture %method) align 2 { +define internal i32 @func1(i32* %ptr, { i32, i32 }* nocapture %method) align 2 { br label %1 ;