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
diff --git a/test/CodeGenCXX/extern-c.cpp b/test/CodeGenCXX/extern-c.cpp
index a8c4f0c..5899b93 100644
--- a/test/CodeGenCXX/extern-c.cpp
+++ b/test/CodeGenCXX/extern-c.cpp
@@ -36,3 +36,30 @@
   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
+}