aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGenCXX
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2013-04-06 05:00:46 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2013-04-06 05:00:46 +0000
commit0024937dbb23752f606846f4a12aafc712bcde33 (patch)
treeb331a97395796a3c1702ef2565d92a3afe68963e /test/CodeGenCXX
parent3e5ebf1a05603e08f2d0b2b2a5fa9406fe4cfb22 (diff)
When an internal-linkage function or variable is declared within an extern "C"
linkage specification, and is marked as __attribute__((used)), try to also give it the unmangled name (by emitting an internal linkage alias) if nothing else within the translation unit would use that name. This allows inline asm in that translation unit to use the entity via its unmangled name, which people apparently rely on. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178950 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX')
-rw-r--r--test/CodeGenCXX/extern-c.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/test/CodeGenCXX/extern-c.cpp b/test/CodeGenCXX/extern-c.cpp
index a8c4f0cdbd..5899b9348c 100644
--- a/test/CodeGenCXX/extern-c.cpp
+++ b/test/CodeGenCXX/extern-c.cpp
@@ -36,3 +36,30 @@ namespace test2 {
extern "C" X test2_b;
X test2_b;
}
+
+extern "C" {
+ static int unused_var;
+ static int unused_fn() { return 0; }
+
+ __attribute__((used)) static int internal_var;
+ __attribute__((used)) static int internal_fn() { return 0; }
+
+ __attribute__((used)) static int duplicate_internal_var;
+ __attribute__((used)) static int duplicate_internal_fn() { return 0; }
+
+ namespace N {
+ __attribute__((used)) static int duplicate_internal_var;
+ __attribute__((used)) static int duplicate_internal_fn() { return 0; }
+ }
+
+ // CHECK: @llvm.used = appending global {{.*}} @internal_var {{.*}} @internal_fn
+
+ // CHECK-NOT: @unused
+ // CHECK-NOT: @duplicate_internal
+ // CHECK: @internal_var = alias internal i32* @_Z12internal_var
+ // CHECK-NOT: @unused
+ // CHECK-NOT: @duplicate_internal
+ // CHECK: @internal_fn = alias internal i32 ()* @_Z11internal_fnv
+ // CHECK-NOT: @unused
+ // CHECK-NOT: @duplicate_internal
+}