r175937 - Remove the hack that avoided mangling static functions in extern C contexts.

Rafael Espindola rafael.espindola at gmail.com
Fri Feb 22 16:26:28 PST 2013


Author: rafael
Date: Fri Feb 22 18:26:28 2013
New Revision: 175937

URL: http://llvm.org/viewvc/llvm-project?rev=175937&view=rev
Log:
Remove the hack that avoided mangling static functions in extern C contexts.

Weather we should give C language linkage to functions and variables with
internal linkage probably depends on how much code assumes it. The standard
says they should have no language linkage, but gcc and msvc assign them
C language linkage.

This commit removes the hack that was preventing the mangling on static
functions declare in extern C contexts. It is an experiment to see if we
can implement the rules in the standard.

If it turns out that many users depend on these functions and variables
having C language linkage, we should change isExternC instead and try
to convince the CWG to change the standard.

Modified:
    cfe/trunk/lib/AST/ItaniumMangle.cpp
    cfe/trunk/lib/Sema/SemaOverload.cpp
    cfe/trunk/test/CodeGenCXX/c-linkage.cpp
    cfe/trunk/test/SemaCXX/linkage2.cpp

Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=175937&r1=175936&r2=175937&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ItaniumMangle.cpp (original)
+++ cfe/trunk/lib/AST/ItaniumMangle.cpp Fri Feb 22 18:26:28 2013
@@ -385,15 +385,6 @@ bool ItaniumMangleContext::shouldMangleD
     // C functions are not mangled.
     if (L == CLanguageLinkage)
       return false;
-
-    // FIXME: Users assume they know the mangling of static functions
-    // declared in extern "C" contexts, so we cannot always mangle them.
-    // As an improvement, maybe we could mangle them only if they are actually
-    // overloaded.
-    const DeclContext *DC = FD->getDeclContext();
-    if (!DC->isRecord() &&
-        FD->getFirstDeclaration()->getDeclContext()->isExternCContext())
-      return false;
   }
 
   // Otherwise, no mangling is done outside C++ mode.

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=175937&r1=175936&r2=175937&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Fri Feb 22 18:26:28 2013
@@ -974,14 +974,6 @@ static bool canBeOverloaded(const Functi
   if (D.isMain())
     return false;
 
-  // FIXME: Users assume they know the mangling of static functions
-  // declared in extern "C" contexts. For now just disallow overloading these
-  // functions so that we can avoid mangling them.
-  const DeclContext *DC = D.getDeclContext();
-  if (!DC->isRecord() &&
-      D.getFirstDeclaration()->getDeclContext()->isExternCContext())
-    return false;
-
   return true;
 }
 

Modified: cfe/trunk/test/CodeGenCXX/c-linkage.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/c-linkage.cpp?rev=175937&r1=175936&r2=175937&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/c-linkage.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/c-linkage.cpp Fri Feb 22 18:26:28 2013
@@ -15,11 +15,13 @@ extern "C" {
 extern "C" {
   static void test2_f() {
   }
-  // This is not required by the standard, but users assume they know
-  // the mangling of static functions in extern "C" contexts.
-  // CHECK: define internal void @test2_f(
+  // CHECK: define internal void @_Z7test2_fv
+  static void test2_f(int x) {
+  }
+  // CHECK: define internal void @_Z7test2_fi
   void test2_use() {
     test2_f();
+    test2_f(42);
   }
 }
 

Modified: cfe/trunk/test/SemaCXX/linkage2.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/linkage2.cpp?rev=175937&r1=175936&r2=175937&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/linkage2.cpp (original)
+++ cfe/trunk/test/SemaCXX/linkage2.cpp Fri Feb 22 18:26:28 2013
@@ -12,12 +12,12 @@ namespace test1 {
   }
 }
 
-// FIXME: This should be OK. Both test2_f don't have language linkage since they
-// have internal linkage.
+// This is OK. Both test2_f don't have language linkage since they have
+// internal linkage.
 extern "C" {
-  static void test2_f() { // expected-note {{previous definition is here}}
+  static void test2_f() {
   }
-  static void test2_f(int x) { // expected-error {{conflicting types for 'test2_f'}}
+  static void test2_f(int x) {
   }
 }
 





More information about the cfe-commits mailing list