[cfe-commits] r85400 - in /cfe/trunk: include/clang/AST/Redeclarable.h lib/CodeGen/Mangle.cpp test/CodeGen/mangle.c

Douglas Gregor dgregor at apple.com
Wed Oct 28 09:31:35 PDT 2009


Author: dgregor
Date: Wed Oct 28 11:31:34 2009
New Revision: 85400

URL: http://llvm.org/viewvc/llvm-project?rev=85400&view=rev
Log:
Mangle based on the declaration we're given, not the canonical
declaration, since attributes that affect mangling may have been added
to subsequent declarations. However, to determine the linkage of the
declaration, we need to look at the canonical declaration. Fixes PR4412.

Modified:
    cfe/trunk/include/clang/AST/Redeclarable.h
    cfe/trunk/lib/CodeGen/Mangle.cpp
    cfe/trunk/test/CodeGen/mangle.c

Modified: cfe/trunk/include/clang/AST/Redeclarable.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Redeclarable.h?rev=85400&r1=85399&r2=85400&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/Redeclarable.h (original)
+++ cfe/trunk/include/clang/AST/Redeclarable.h Wed Oct 28 11:31:34 2009
@@ -88,6 +88,11 @@
     return D;
   }
 
+  /// \brief Returns the most recent (re)declaration of this declaration.
+  const decl_type *getMostRecentDeclaration() const {
+    return getFirstDeclaration()->RedeclLink.getNext();
+  }
+  
   /// \brief Set the previous declaration. If PrevDecl is NULL, set this as the
   /// first and only declaration.
   void setPreviousDeclaration(decl_type *PrevDecl) {

Modified: cfe/trunk/lib/CodeGen/Mangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/Mangle.cpp?rev=85400&r1=85399&r2=85400&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/Mangle.cpp (original)
+++ cfe/trunk/lib/CodeGen/Mangle.cpp Wed Oct 28 11:31:34 2009
@@ -115,6 +115,7 @@
 }
 
 static bool isInCLinkageSpecification(const Decl *D) {
+  D = D->getCanonicalDecl();
   for (const DeclContext *DC = D->getDeclContext();
        !DC->isTranslationUnit(); DC = DC->getParent()) {
     if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))
@@ -1362,7 +1363,7 @@
                                    "Mangling declaration");
     
     CXXNameMangler Mangler(Context, os);
-    if (!Mangler.mangle(cast<NamedDecl>(D->getCanonicalDecl())))
+    if (!Mangler.mangle(D))
       return false;
 
     os.flush();

Modified: cfe/trunk/test/CodeGen/mangle.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mangle.c?rev=85400&r1=85399&r2=85400&view=diff

==============================================================================
--- cfe/trunk/test/CodeGen/mangle.c (original)
+++ cfe/trunk/test/CodeGen/mangle.c Wed Oct 28 11:31:34 2009
@@ -1,22 +1,20 @@
-// RUN: clang-cc -triple i386-pc-linux-gnu -emit-llvm -o %t %s &&
-// RUN: grep '@_Z2f0i' %t &&
-// RUN: grep '@_Z2f0l' %t &&
+// RUN: clang-cc -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck %s
 
-// Make sure we mangle overloadable, even in C system headers.
+// CHECK: @"\01foo"
 
+// Make sure we mangle overloadable, even in C system headers.
 # 1 "somesystemheader.h" 1 3 4
+// CHECK: @_Z2f0i
 void __attribute__((__overloadable__)) f0(int a) {}
+// CHECK: @_Z2f0l
 void __attribute__((__overloadable__)) f0(long b) {}
 
-
+// CHECK: @"\01bar"
 
 // These should get merged.
 void foo() __asm__("bar");
 void foo2() __asm__("bar");
 
-// RUN: grep '@"\\01foo"' %t &&
-// RUN: grep '@"\\01bar"' %t
-
 int nux __asm__("foo");
 extern float nux2 __asm__("foo");
 
@@ -52,3 +50,12 @@
 
 int foo7 __asm__("foo7") __attribute__((used));
 float foo8 __asm__("foo7") = 42;
+
+// PR4412
+int func(void);
+extern int func (void) __asm__ ("FUNC");
+
+// CHECK: @"\01FUNC"
+int func(void) {
+  return 42;
+}





More information about the cfe-commits mailing list