From: Anders Carlsson Date: Thu, 2 Apr 2009 16:24:45 +0000 (+0000) Subject: Implement mangling of declarations inside functions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1b42c794481f6f958267e4ba913d74fef43161f6;p=clang Implement mangling of declarations inside functions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68321 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 6e62fcfc2e..3e685e6b17 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -42,6 +42,7 @@ namespace { void mangleName(const NamedDecl *ND); void mangleUnqualifiedName(const NamedDecl *ND); void mangleSourceName(const IdentifierInfo *II); + void mangleLocalName(const NamedDecl *ND); void mangleNestedName(const NamedDecl *ND); void manglePrefix(const DeclContext *DC); void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity); @@ -149,9 +150,10 @@ void CXXNameMangler::mangleName(const NamedDecl *ND) { else if (isStdNamespace(ND->getDeclContext())) { Out << "St"; mangleUnqualifiedName(ND); - } else { + } else if (isa(ND->getDeclContext())) + mangleLocalName(ND); + else mangleNestedName(ND); - } } void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND) { @@ -226,6 +228,16 @@ void CXXNameMangler::mangleNestedName(const NamedDecl *ND) { Out << 'E'; } +void CXXNameMangler::mangleLocalName(const NamedDecl *ND) { + // := Z E [] + // := Z E s [] + // := _ + Out << 'Z'; + mangleFunctionEncoding(cast(ND->getDeclContext())); + Out << 'E'; + mangleSourceName(ND->getIdentifier()); +} + void CXXNameMangler::manglePrefix(const DeclContext *DC) { // ::= // ::= diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index e9a76c93f0..f608a22f03 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -39,5 +39,8 @@ extern "C" { namespace N { void unmangled_function() { } } } // RUN: grep unmangled_variable %t | count 1 && extern "C" { namespace N { int unmangled_variable; } } -// RUN: grep _ZN1N1iE %t | count 1 +// RUN: grep _ZN1N1iE %t | count 1 && namespace N { int i; } + +// RUN: grep _ZZN1N1fEiiE1b %t | count 2 +namespace N { int f(int, int) { static int b; return b; } }