112 lines · cpp
1// RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -fvisibility-inlines-hidden -emit-llvm -o - %s -O2 -disable-llvm-passes | FileCheck %s2// RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -emit-llvm -o - %s -O2 -disable-llvm-passes | FileCheck -check-prefixes=CHECK-NO-VIH %s3// RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -fvisibility=hidden -fvisibility-inlines-hidden -emit-llvm -o - %s -O2 -disable-llvm-passes | FileCheck %s --check-prefix=CHECK-VIS-HIDDEN4// RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -fvisibility=protected -fvisibility-inlines-hidden -emit-llvm -o - %s -O2 -disable-llvm-passes | FileCheck %s --check-prefix=CHECK-VIS-PROTECTED5 6// When a function is hidden due to -fvisibility-inlines-hidden option, static local variables of the function should not be hidden by the option.7 8// CHECK-DAG: @_ZZ4funcvE3var = internal global i32 09// CHECK-DAG: @_ZZ11hidden_funcvE3var = internal global i32 010// CHECK-DAG: @_ZZ12default_funcvE3var = internal global i32 011// CHECK-DAG: @_ZZ11inline_funcvE3var = linkonce_odr global i32 0, comdat12// CHECK-DAG: @_ZZ18inline_hidden_funcvE3var = linkonce_odr hidden global i32 0, comdat13// CHECK-DAG: @_ZZ19inline_default_funcvE3var = linkonce_odr global i32 0, comdat14// CHECK-DAG: @_ZZN13ExportedClass10inl_methodEvE3var = linkonce_odr global i32 0, comdat, align 415// CHECK-DAG: define{{.*}} i32 @_Z4funcv()16// CHECK-DAG: define hidden noundef i32 @_Z11hidden_funcv()17// CHECK-DAG: define{{.*}} i32 @_Z12default_funcv()18// CHECK-DAG: define linkonce_odr hidden noundef i32 @_Z11inline_funcv()19// CHECK-DAG: define linkonce_odr hidden noundef i32 @_Z18inline_hidden_funcv()20// CHECK-DAG: define linkonce_odr noundef i32 @_Z19inline_default_funcv()21// CHECK-DAG: define linkonce_odr hidden noundef i32 @_ZN13ExportedClass10inl_methodEv({{.*}})22// CHECK-DAG: define{{.*}} i32 @_ZN13ExportedClass10ext_methodEv({{.*}})23 24// CHECK-NO-VIH-DAG: @_ZZ4funcvE3var = internal global i32 025// CHECK-NO-VIH-DAG: @_ZZ11hidden_funcvE3var = internal global i32 026// CHECK-NO-VIH-DAG: @_ZZ12default_funcvE3var = internal global i32 027// CHECK-NO-VIH-DAG: @_ZZ11inline_funcvE3var = linkonce_odr global i32 0, comdat28// CHECK-NO-VIH-DAG: @_ZZ18inline_hidden_funcvE3var = linkonce_odr hidden global i32 0, comdat29// CHECK-NO-VIH-DAG: @_ZZ19inline_default_funcvE3var = linkonce_odr global i32 0, comdat30// CHECK-NO-VIH-DAG: @_ZZN13ExportedClass10inl_methodEvE3var = linkonce_odr global i32 0, comdat, align 431// CHECK-NO-VIH-DAG: define{{.*}} i32 @_Z4funcv()32// CHECK-NO-VIH-DAG: define hidden noundef i32 @_Z11hidden_funcv()33// CHECK-NO-VIH-DAG: define{{.*}} i32 @_Z12default_funcv()34// CHECK-NO-VIH-DAG: define linkonce_odr noundef i32 @_Z11inline_funcv()35// CHECK-NO-VIH-DAG: define linkonce_odr hidden noundef i32 @_Z18inline_hidden_funcv()36// CHECK-NO-VIH-DAG: define linkonce_odr noundef i32 @_Z19inline_default_funcv()37// CHECK-NO-VIH-DAG: define linkonce_odr noundef i32 @_ZN13ExportedClass10inl_methodEv({{.*}})38// CHECK-NO-VIH-DAG: define{{.*}} i32 @_ZN13ExportedClass10ext_methodEv({{.*}})39 40// CHECK-VIS-HIDDEN-DAG: @_ZZ4funcvE3var = internal global i32 041// CHECK-VIS-HIDDEN-DAG: @_ZZ11hidden_funcvE3var = internal global i32 042// CHECK-VIS-HIDDEN-DAG: @_ZZ12default_funcvE3var = internal global i32 043// CHECK-VIS-HIDDEN-DAG: @_ZZ11inline_funcvE3var = linkonce_odr hidden global i32 0, comdat44// CHECK-VIS-HIDDEN-DAG: @_ZZ18inline_hidden_funcvE3var = linkonce_odr hidden global i32 0, comdat45// CHECK-VIS-HIDDEN-DAG: @_ZZ19inline_default_funcvE3var = linkonce_odr global i32 0, comdat46// CHECK-VIS-HIDDEN-DAG: @_ZZN13ExportedClass10inl_methodEvE3var = linkonce_odr global i32 0, comdat, align 447// CHECK-VIS-HIDDEN-DAG: define hidden noundef i32 @_Z4funcv()48// CHECK-VIS-HIDDEN-DAG: define hidden noundef i32 @_Z11hidden_funcv()49// CHECK-VIS-HIDDEN-DAG: define{{.*}} i32 @_Z12default_funcv()50// CHECK-VIS-HIDDEN-DAG: define linkonce_odr hidden noundef i32 @_Z11inline_funcv()51// CHECK-VIS-HIDDEN-DAG: define linkonce_odr hidden noundef i32 @_Z18inline_hidden_funcv()52// CHECK-VIS-HIDDEN-DAG: define linkonce_odr noundef i32 @_Z19inline_default_funcv()53// CHECK-VIS-HIDDEN-DAG: define linkonce_odr hidden noundef i32 @_ZN13ExportedClass10inl_methodEv({{.*}})54// CHECK-VIS-HIDDEN-DAG: define{{.*}} i32 @_ZN13ExportedClass10ext_methodEv({{.*}})55 56// CHECK-VIS-PROTECTED-DAG: @_ZZ4funcvE3var = internal global i32 057// CHECK-VIS-PROTECTED-DAG: @_ZZ11hidden_funcvE3var = internal global i32 058// CHECK-VIS-PROTECTED-DAG: @_ZZ12default_funcvE3var = internal global i32 059// CHECK-VIS-PROTECTED-DAG: @_ZZ11inline_funcvE3var = linkonce_odr protected global i32 0, comdat60// CHECK-VIS-PROTECTED-DAG: @_ZZ18inline_hidden_funcvE3var = linkonce_odr hidden global i32 0, comdat61// CHECK-VIS-PROTECTED-DAG: @_ZZ19inline_default_funcvE3var = linkonce_odr global i32 0, comdat62// CHECK-VIS-PROTECTED-DAG: @_ZZN13ExportedClass10inl_methodEvE3var = linkonce_odr global i32 0, comdat, align 463// CHECK-VIS-PROTECTED-DAG: define protected noundef i32 @_Z4funcv()64// CHECK-VIS-PROTECTED-DAG: define hidden noundef i32 @_Z11hidden_funcv()65// CHECK-VIS-PROTECTED-DAG: define{{.*}} i32 @_Z12default_funcv()66// CHECK-VIS-PROTECTED-DAG: define linkonce_odr hidden noundef i32 @_Z11inline_funcv()67// CHECK-VIS-PROTECTED-DAG: define linkonce_odr hidden noundef i32 @_Z18inline_hidden_funcv()68// CHECK-VIS-PROTECTED-DAG: define linkonce_odr noundef i32 @_Z19inline_default_funcv()69// CHECK-VIS-PROTECTED-DAG: define linkonce_odr hidden noundef i32 @_ZN13ExportedClass10inl_methodEv({{.*}})70// CHECK-VIS-PROTECTED-DAG: define{{.*}} i32 @_ZN13ExportedClass10ext_methodEv({{.*}})71 72int func(void) {73 static int var = 0;74 return var++;75}76inline int inline_func(void) {77 static int var = 0;78 return var++;79}80int __attribute__((visibility("hidden"))) hidden_func(void) {81 static int var = 0;82 return var++;83}84inline int __attribute__((visibility("hidden"))) inline_hidden_func(void) {85 static int var = 0;86 return var++;87}88int __attribute__((visibility("default"))) default_func(void) {89 static int var = 0;90 return var++;91}92inline int __attribute__((visibility("default"))) inline_default_func(void) {93 static int var = 0;94 return var++;95}96struct __attribute__((visibility("default"))) ExportedClass {97 int inl_method() {98 static int var = 0;99 return var++;100 }101 int ext_method();102};103int ExportedClass::ext_method() { return inl_method(); }104void bar(void) {105 func();106 inline_func();107 hidden_func();108 inline_hidden_func();109 default_func();110 inline_default_func();111}112