blob: 8e153b893a3fd230e1d7b34ca393ed92fb1d8e2a [file] [log] [blame]
John McCall5fe84122010-10-26 04:59:26 +00001// RUN: %clang_cc1 %s -triple i386-unknown-unknown -fvisibility default -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-DEFAULT
2// RUN: %clang_cc1 %s -triple i386-unknown-unknown -fvisibility protected -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-PROTECTED
3// RUN: %clang_cc1 %s -triple i386-unknown-unknown -fvisibility hidden -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-HIDDEN
Daniel Dunbarea10ab62009-04-07 22:36:33 +00004
John McCall5fe84122010-10-26 04:59:26 +00005// CHECK-DEFAULT: @g_def = global i32 0
6// CHECK-DEFAULT: @g_com = common global i32 0
7// CHECK-DEFAULT: @g_ext = external global i32
8// CHECK-DEFAULT: @g_deferred = internal global
9// CHECK-PROTECTED: @g_def = protected global i32 0
10// CHECK-PROTECTED: @g_com = common protected global i32 0
11// CHECK-PROTECTED: @g_ext = external global i32
12// CHECK-PROTECTED: @g_deferred = internal global
13// CHECK-HIDDEN: @g_def = hidden global i32 0
14// CHECK-HIDDEN: @g_com = common hidden global i32 0
15// CHECK-HIDDEN: @g_ext = external global i32
16// CHECK-HIDDEN: @g_deferred = internal global
Daniel Dunbarea10ab62009-04-07 22:36:33 +000017int g_com;
18int g_def = 0;
19extern int g_ext;
Daniel Dunbard272cca2009-04-10 20:26:50 +000020static char g_deferred[] = "hello";
Daniel Dunbarea10ab62009-04-07 22:36:33 +000021
John McCall23032652010-11-02 18:38:13 +000022// CHECK-DEFAULT: @test4 = hidden global i32 10
23// CHECK-PROTECTED: @test4 = hidden global i32 10
24// CHECK-HIDDEN: @test4 = hidden global i32 10
25
Stephen Lin43622612013-08-15 06:47:53 +000026// CHECK-DEFAULT-LABEL: define i32 @f_def()
John McCall5fe84122010-10-26 04:59:26 +000027// CHECK-DEFAULT: declare void @f_ext()
Stephen Lin43622612013-08-15 06:47:53 +000028// CHECK-DEFAULT-LABEL: define internal void @f_deferred()
29// CHECK-PROTECTED-LABEL: define protected i32 @f_def()
John McCall5fe84122010-10-26 04:59:26 +000030// CHECK-PROTECTED: declare void @f_ext()
Stephen Lin43622612013-08-15 06:47:53 +000031// CHECK-PROTECTED-LABEL: define internal void @f_deferred()
32// CHECK-HIDDEN-LABEL: define hidden i32 @f_def()
John McCall5fe84122010-10-26 04:59:26 +000033// CHECK-HIDDEN: declare void @f_ext()
Stephen Lin43622612013-08-15 06:47:53 +000034// CHECK-HIDDEN-LABEL: define internal void @f_deferred()
John McCall5fe84122010-10-26 04:59:26 +000035
Daniel Dunbarea10ab62009-04-07 22:36:33 +000036extern void f_ext(void);
37
Daniel Dunbard272cca2009-04-10 20:26:50 +000038static void f_deferred(void) {
39}
40
Daniel Dunbarea10ab62009-04-07 22:36:33 +000041int f_def(void) {
42 f_ext();
Daniel Dunbard272cca2009-04-10 20:26:50 +000043 f_deferred();
44 return g_com + g_def + g_ext + g_deferred[0];
Daniel Dunbarea10ab62009-04-07 22:36:33 +000045}
John McCall5fe84122010-10-26 04:59:26 +000046
47// PR8457
Stephen Lin43622612013-08-15 06:47:53 +000048// CHECK-DEFAULT-LABEL: define void @test1(
49// CHECK-PROTECTED-LABEL: define void @test1(
50// CHECK-HIDDEN-LABEL: define void @test1(
John McCall5fe84122010-10-26 04:59:26 +000051struct Test1 { int field; };
52void __attribute__((visibility("default"))) test1(struct Test1 *v) { }
John McCallb7139c42010-10-28 04:18:25 +000053
54// rdar://problem/8595231
Stephen Lin43622612013-08-15 06:47:53 +000055// CHECK-DEFAULT-LABEL: define void @test2()
56// CHECK-PROTECTED-LABEL: define void @test2()
57// CHECK-HIDDEN-LABEL: define void @test2()
John McCallb7139c42010-10-28 04:18:25 +000058void test2(void);
59void __attribute__((visibility("default"))) test2(void) {}
John McCall23032652010-11-02 18:38:13 +000060
Stephen Lin43622612013-08-15 06:47:53 +000061// CHECK-DEFAULT-LABEL: define hidden void @test3()
62// CHECK-PROTECTED-LABEL: define hidden void @test3()
63// CHECK-HIDDEN-LABEL: define hidden void @test3()
John McCall23032652010-11-02 18:38:13 +000064extern void test3(void);
65__private_extern__ void test3(void) {}
66
67// Top of file.
68extern int test4;
69__private_extern__ int test4 = 10;
John McCall185b5ee2013-02-23 01:15:17 +000070
71// rdar://12399248
Stephen Lin43622612013-08-15 06:47:53 +000072// CHECK-DEFAULT-LABEL: define hidden void @test5()
73// CHECK-PROTECTED-LABEL: define hidden void @test5()
74// CHECK-HIDDEN-LABEL: define hidden void @test5()
John McCall185b5ee2013-02-23 01:15:17 +000075__attribute__((availability(macosx,introduced=10.5,deprecated=10.6)))
76__private_extern__ void test5(void) {}