From d986fc8b4816bd51fb9de5d8ee04fbbc80909b62 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Thu, 5 Aug 2010 07:00:53 +0000 Subject: [PATCH] Tests for #pragma GCC visibility. llvm-svn: 110316 --- clang/test/CodeGen/pragma-visibility.c | 24 +++++++ clang/test/CodeGenCXX/pragma-visibility.cpp | 72 +++++++++++++++++++++ clang/test/Parser/pragma-visibility.c | 9 +++ 3 files changed, 105 insertions(+) create mode 100644 clang/test/CodeGen/pragma-visibility.c create mode 100644 clang/test/CodeGenCXX/pragma-visibility.cpp create mode 100644 clang/test/Parser/pragma-visibility.c diff --git a/clang/test/CodeGen/pragma-visibility.c b/clang/test/CodeGen/pragma-visibility.c new file mode 100644 index 000000000000..16460a28280e --- /dev/null +++ b/clang/test/CodeGen/pragma-visibility.c @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s + +#pragma GCC visibility push(hidden) +int x = 2; +// CHECK: @x = hidden global + +extern int y; +#pragma GCC visibility pop +int y = 4; +// CHECK: @y = hidden global + +#pragma GCC visibility push(hidden) +extern __attribute((visibility("default"))) int z; +int z = 0; +// CHECK: @z = global +#pragma GCC visibility pop + +#pragma GCC visibility push(hidden) +void f() {} +// CHECK: define hidden void @f + +__attribute((visibility("default"))) void g(); +void g() {} +// CHECK: define void @g diff --git a/clang/test/CodeGenCXX/pragma-visibility.cpp b/clang/test/CodeGenCXX/pragma-visibility.cpp new file mode 100644 index 000000000000..05de78670a04 --- /dev/null +++ b/clang/test/CodeGenCXX/pragma-visibility.cpp @@ -0,0 +1,72 @@ +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s + +#pragma GCC visibility push(hidden) +struct x { + static int y; +}; +#pragma GCC visibility pop +int x::y = 10; +// CHECK: @_ZN1x1yE = hidden global + +#pragma GCC visibility push(hidden) +struct __attribute((visibility("default"))) x2 { + static int y; +}; +int x2::y = 10; +// CHECK: @_ZN2x21yE = global +#pragma GCC visibility pop + +#pragma GCC visibility push(hidden) +struct x3 { + static int y; +} __attribute((visibility("default"))); +int x3::y = 10; +// CHECK: @_ZN2x31yE = global +#pragma GCC visibility pop + +#pragma GCC visibility push(hidden) +template struct x4 { + static int y; +}; +#pragma GCC visibility pop +template<> int x4::y = 10; +// CHECK: @_ZN2x4IiE1yE = hidden global i32 + +#pragma GCC visibility push(hidden) +template int f() { return x; } +extern "C" int g() { return f<3>(); } +#pragma GCC visibility pop +// CHECK: define hidden i32 @g() +// CHECK: define linkonce_odr hidden i32 @_Z1fILi3EEiv() + +#pragma GCC visibility push(hidden) +template struct x5 { + void y(); +}; +#pragma GCC visibility pop +template<> void x5::y() {} +// CHECK: define hidden void @_ZN2x5IiE1yEv + +#pragma GCC visibility push(hidden) +namespace n __attribute((visibility("default"))) { + void f() {} + // CHECK: define void @_ZN1n1fEv +} +#pragma GCC visibility pop + +namespace n __attribute((visibility("default"))) { + extern int foofoo; // FIXME: Shouldn't be necessary, but otherwise the pragma + // gets to Sema before the namespace! +#pragma GCC visibility push(hidden) + void g() {} + // CHECK: define hidden void @_ZN1n1gEv +#pragma GCC visibility pop +} + +namespace n __attribute((visibility("hidden"))) { + extern int foofoo; // FIXME: Shouldn't be necessary, but otherwise the pragma + // gets to Sema before the namespace! + #pragma GCC visibility pop + void h() {} + // CHECK: define void @_ZN1n1hEv +} diff --git a/clang/test/Parser/pragma-visibility.c b/clang/test/Parser/pragma-visibility.c new file mode 100644 index 000000000000..cfc3d9eccd86 --- /dev/null +++ b/clang/test/Parser/pragma-visibility.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +#pragma GCC visibility foo // expected-warning{{expected identifier in '#pragma visibility' - ignored}} +#pragma GCC visibility pop foo // expected-warning{{extra tokens at end of '#pragma visibility' - ignored}} +#pragma GCC visibility push // expected-warning{{missing '(' after '#pragma visibility'}} +#pragma GCC visibility push( // expected-warning{{expected identifier in '#pragma visibility' - ignored}} +#pragma GCC visibility push(hidden // expected-warning{{missing ')' after '#pragma visibility' - ignoring}} +#pragma GCC visibility push(hidden) +#pragma GCC visibility pop