r185402 - Don't skip lambdas when mangling local vars.
Eli Friedman
eli.friedman at gmail.com
Mon Jul 1 19:01:19 PDT 2013
Author: efriedma
Date: Mon Jul 1 21:01:18 2013
New Revision: 185402
URL: http://llvm.org/viewvc/llvm-project?rev=185402&view=rev
Log:
Don't skip lambdas when mangling local vars.
This commit rearranges the logic in CXXNameMangler::mangleLocalName and
GetLocalClassDecl so that it doesn't accidentally skip over lambdas. It
also reduces code duplication a bit.
Modified:
cfe/trunk/lib/AST/ItaniumMangle.cpp
cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/blocks-irgen.mm
cfe/trunk/test/CodeGenCXX/mangle-lambdas.cpp
Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=185402&r1=185401&r2=185402&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ItaniumMangle.cpp (original)
+++ cfe/trunk/lib/AST/ItaniumMangle.cpp Mon Jul 1 21:01:18 2013
@@ -64,15 +64,13 @@ static const DeclContext *getEffectivePa
return getEffectiveDeclContext(cast<Decl>(DC));
}
-static const CXXRecordDecl *GetLocalClassDecl(const NamedDecl *ND) {
- const DeclContext *DC = dyn_cast<DeclContext>(ND);
- if (!DC)
- DC = getEffectiveDeclContext(ND);
+static const CXXRecordDecl *GetLocalClassDecl(const Decl *D) {
+ const DeclContext *DC = getEffectiveDeclContext(D);
while (!DC->isNamespace() && !DC->isTranslationUnit()) {
- const DeclContext *Parent = getEffectiveDeclContext(cast<Decl>(DC));
- if (isa<FunctionDecl>(Parent))
- return dyn_cast<CXXRecordDecl>(DC);
- DC = Parent;
+ if (isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC) || isa<BlockDecl>(DC))
+ return dyn_cast<CXXRecordDecl>(D);
+ D = cast<Decl>(DC);
+ DC = getEffectiveDeclContext(D);
}
return 0;
}
@@ -1272,16 +1270,21 @@ void CXXNameMangler::mangleLocalName(con
// <local-name> := Z <function encoding> E d [ <parameter number> ]
// _ <entity name>
// <discriminator> := _ <non-negative number>
- const DeclContext *DC = getEffectiveDeclContext(ND);
+ const CXXRecordDecl *RD = GetLocalClassDecl(ND);
+ const DeclContext *DC = getEffectiveDeclContext(RD ? RD : ND);
Out << 'Z';
- if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(DC)) {
- mangleObjCMethodName(MD);
- } else if (const CXXRecordDecl *RD = GetLocalClassDecl(ND)) {
- mangleFunctionEncoding(cast<FunctionDecl>(getEffectiveDeclContext(RD)));
- Out << 'E';
+ if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(DC))
+ mangleObjCMethodName(MD);
+ else if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC))
+ manglePrefix(BD); // FIXME: This isn't right.
+ else
+ mangleFunctionEncoding(cast<FunctionDecl>(DC));
+ Out << 'E';
+
+ if (RD) {
// The parameter number is omitted for the last parameter, 0 for the
// second-to-last parameter, 1 for the third-to-last parameter, etc. The
// <entity name> will of course contain a <closure-type-name>: Its
@@ -1307,7 +1310,7 @@ void CXXNameMangler::mangleLocalName(con
if (ND == RD) // equality ok because RD derived from ND above
mangleUnqualifiedName(ND);
else
- mangleNestedName(ND, DC, true /*NoFunction*/);
+ mangleNestedName(ND, getEffectiveDeclContext(ND), true /*NoFunction*/);
if (!SkipDiscriminator) {
unsigned disc;
@@ -1321,10 +1324,7 @@ void CXXNameMangler::mangleLocalName(con
return;
}
- else
- mangleFunctionEncoding(cast<FunctionDecl>(DC));
- Out << 'E';
mangleUnqualifiedName(ND);
}
Modified: cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/blocks-irgen.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/blocks-irgen.mm?rev=185402&r1=185401&r2=185402&view=diff
==============================================================================
--- cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/blocks-irgen.mm (original)
+++ cfe/trunk/test/CXX/expr/expr.prim/expr.prim.lambda/blocks-irgen.mm Mon Jul 1 21:01:18 2013
@@ -14,7 +14,7 @@ namespace PR12746 {
}
// CHECK: define internal zeroext i1 @___ZN7PR127462f1EPi_block_invoke
- // CHECK: call zeroext i1 @"_ZNK7PR127462f1Ub_3$_0clEv"
+ // CHECK: call zeroext i1 @"_ZZ7PR127462f1Ub_ENK3$_0clEv"
bool f2(int *x) {
auto outer = [&]() -> bool {
Modified: cfe/trunk/test/CodeGenCXX/mangle-lambdas.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-lambdas.cpp?rev=185402&r1=185401&r2=185402&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/mangle-lambdas.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/mangle-lambdas.cpp Mon Jul 1 21:01:18 2013
@@ -1,9 +1,9 @@
// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-macosx10.7.0 -emit-llvm -o - %s | FileCheck %s
// CHECK: @_ZZNK7PR12917IJiiEE1nMUlvE_clEvE1n = linkonce_odr global i32 0
-// CHECK: @_ZZN7PR12917IJicdEEC1EicdEd_N1nE = linkonce_odr global i32 0
-// CHECK: @_ZZN7PR12917IJicdEEC1EicdEd0_N1nE = linkonce_odr global i32 0
-// CHECK: @_ZZN7PR12917IJicdEEC1EicdEd1_N1nE = linkonce_odr global i32 0
+// CHECK: @_ZZZN7PR12917IJicdEEC1EicdEd_NKUlvE_clEvE1n = linkonce_odr global i32 0
+// CHECK: @_ZZZN7PR12917IJicdEEC1EicdEd0_NKUlvE_clEvE1n = linkonce_odr global i32 0
+// CHECK: @_ZZZN7PR12917IJicdEEC1EicdEd1_NKUlvE_clEvE1n = linkonce_odr global i32 0
// CHECK: define linkonce_odr void @_Z11inline_funci
inline void inline_func(int n) {
More information about the cfe-commits
mailing list