99 lines · c
1// RUN: %clang_cc1 %s -triple i386-unknown-unknown -Wno-implicit-function-declaration -fvisibility=default -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-DEFAULT2// RUN: %clang_cc1 %s -triple i386-unknown-unknown -Wno-implicit-function-declaration -fvisibility=protected -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-PROTECTED3// RUN: %clang_cc1 %s -triple i386-unknown-unknown -Wno-implicit-function-declaration -fvisibility=hidden -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-HIDDEN4 5// CHECK-DEFAULT: @g_def ={{.*}} global i32 06// CHECK-DEFAULT: @g_com ={{.*}} global i32 07// CHECK-DEFAULT: @g_ext = external global i328// CHECK-DEFAULT: @g_deferred = internal global9// CHECK-PROTECTED: @g_def = protected global i32 010// CHECK-PROTECTED: @g_com = protected global i32 011// CHECK-PROTECTED: @g_ext = external global i3212// CHECK-PROTECTED: @g_deferred = internal global13// CHECK-HIDDEN: @g_def = hidden global i32 014// CHECK-HIDDEN: @g_com = hidden global i32 015// CHECK-HIDDEN: @g_ext = external global i3216// CHECK-HIDDEN: @g_deferred = internal global17int g_com;18int g_def = 0;19extern int g_ext;20static char g_deferred[] = "hello";21 22// CHECK-DEFAULT: @test4 = hidden global i32 1023// CHECK-PROTECTED: @test4 = hidden global i32 1024// CHECK-HIDDEN: @test4 = hidden global i32 1025 26// CHECK-DEFAULT-LABEL: define{{.*}} i32 @f_def()27// CHECK-DEFAULT: declare void @f_ext()28// CHECK-DEFAULT-LABEL: define internal void @f_deferred()29// CHECK-PROTECTED-LABEL: define protected i32 @f_def()30// CHECK-PROTECTED: declare void @f_ext()31// CHECK-PROTECTED-LABEL: define internal void @f_deferred()32// CHECK-HIDDEN-LABEL: define hidden i32 @f_def()33// CHECK-HIDDEN: declare void @f_ext()34// CHECK-HIDDEN-LABEL: define internal void @f_deferred()35 36extern void f_ext(void);37 38static void f_deferred(void) {39}40 41int f_def(void) {42 f_ext();43 f_deferred();44 return g_com + g_def + g_ext + g_deferred[0];45}46 47// PR845748// CHECK-DEFAULT-LABEL: define{{.*}} void @test1(49// CHECK-PROTECTED-LABEL: define{{.*}} void @test1(50// CHECK-HIDDEN-LABEL: define{{.*}} void @test1(51struct Test1 { int field; };52void __attribute__((visibility("default"))) test1(struct Test1 *v) { }53 54// CHECK-DEFAULT-LABEL: define{{.*}} void @test2()55// CHECK-PROTECTED-LABEL: define{{.*}} void @test2()56// CHECK-HIDDEN-LABEL: define{{.*}} void @test2()57void test2(void);58void __attribute__((visibility("default"))) test2(void) {}59 60// CHECK-DEFAULT-LABEL: define hidden void @test3()61// CHECK-PROTECTED-LABEL: define hidden void @test3()62// CHECK-HIDDEN-LABEL: define hidden void @test3()63extern void test3(void);64__private_extern__ void test3(void) {}65 66// Top of file.67extern int test4;68__private_extern__ int test4 = 10;69 70// CHECK-DEFAULT-LABEL: define hidden void @test5()71// CHECK-PROTECTED-LABEL: define hidden void @test5()72// CHECK-HIDDEN-LABEL: define hidden void @test5()73__attribute__((availability(macosx,introduced=10.5,deprecated=10.6)))74__private_extern__ void test5(void) {}75 76 77#pragma clang attribute push([[gnu::visibility("hidden")]], apply_to=function)78 79// CHECK-DEFAULT-LABEL: define hidden void @func()80// CHECK-PROTECTED-LABEL: define hidden void @func()81// CHECK-HIDDEN-LABEL: define hidden void @func()82void func(void) {}83 84void call(void) {85 implicit_function();86 // CHECK-DEFAULT-LABEL: declare hidden i32 @implicit_function(...)87 // CHECK-PROTECTED-LABEL: declare hidden i32 @implicit_function(...)88 // CHECK-HIDDEN-LABEL: declare hidden i32 @implicit_function(...)89}90 91#pragma clang attribute pop92 93void call2(void) {94 implicit_function2();95 // CHECK-DEFAULT-LABEL: declare i32 @implicit_function2(...)96 // CHECK-PROTECTED-LABEL: declare i32 @implicit_function2(...)97 // CHECK-HIDDEN-LABEL: declare i32 @implicit_function2(...)98}99