From: Eli Friedman Date: Fri, 5 Jul 2013 20:27:40 +0000 (+0000) Subject: Don't use mangleCXXRTTIName in TBAA for C code. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1847c718fe61f8e99d77c60ab77c9bf2ad4d77aa;p=clang Don't use mangleCXXRTTIName in TBAA for C code. This changes the TBAA code so it doesn't use mangleCXXRTTIName in C, because it doesn't really make sense there. Also, as sort of a defense-in-depth change, fix the mangler so it handles C RecordDecls correctly. No tests because I don't know the TBAA code well enough to write a test, and I don't know how else to trigger mangling a local struct in C. Fixes a crash with r185450 reported by Joerg Sonnenberger. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185721 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index adfc3a790f..79219825aa 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -72,11 +72,11 @@ static bool isLocalContainerContext(const DeclContext *DC) { return isa(DC) || isa(DC) || isa(DC); } -static const CXXRecordDecl *GetLocalClassDecl(const Decl *D) { +static const RecordDecl *GetLocalClassDecl(const Decl *D) { const DeclContext *DC = getEffectiveDeclContext(D); while (!DC->isNamespace() && !DC->isTranslationUnit()) { if (isLocalContainerContext(DC)) - return dyn_cast(D); + return dyn_cast(D); D = cast(DC); DC = getEffectiveDeclContext(D); } @@ -1280,7 +1280,7 @@ void CXXNameMangler::mangleLocalName(const Decl *D) { // _ // := _ assert(isa(D) || isa(D)); - const CXXRecordDecl *RD = GetLocalClassDecl(D); + const RecordDecl *RD = GetLocalClassDecl(D); const DeclContext *DC = getEffectiveDeclContext(RD ? RD : D); Out << 'Z'; @@ -1301,9 +1301,10 @@ void CXXNameMangler::mangleLocalName(const Decl *D) { // numbering will be local to the particular argument in which it appears // -- other default arguments do not affect its encoding. bool SkipDiscriminator = false; - if (RD->isLambda()) { + const CXXRecordDecl *CXXRD = dyn_cast(RD); + if (CXXRD->isLambda()) { if (const ParmVarDecl *Parm - = dyn_cast_or_null(RD->getLambdaContextDecl())) { + = dyn_cast_or_null(CXXRD->getLambdaContextDecl())) { if (const FunctionDecl *Func = dyn_cast(Parm->getDeclContext())) { Out << 'd'; diff --git a/lib/CodeGen/CodeGenTBAA.cpp b/lib/CodeGen/CodeGenTBAA.cpp index f299481ffe..0a8c293cb7 100644 --- a/lib/CodeGen/CodeGenTBAA.cpp +++ b/lib/CodeGen/CodeGenTBAA.cpp @@ -150,19 +150,11 @@ CodeGenTBAA::getTBAAInfo(QualType QTy) { // Enum types are distinct types. In C++ they have "underlying types", // however they aren't related for TBAA. if (const EnumType *ETy = dyn_cast(Ty)) { - // In C mode, two anonymous enums are compatible iff their members - // are the same -- see C99 6.2.7p1. For now, be conservative. We could - // theoretically implement this by combining information about all the - // members into a single identifying MDNode. - if (!Features.CPlusPlus && - ETy->getDecl()->getTypedefNameForAnonDecl()) - return MetadataCache[Ty] = getChar(); - // In C++ mode, types have linkage, so we can rely on the ODR and // on their mangled names, if they're external. // TODO: Is there a way to get a program-wide unique name for a // decl with local linkage or no linkage? - if (Features.CPlusPlus && !ETy->getDecl()->isExternallyVisible()) + if (!Features.CPlusPlus || !ETy->getDecl()->isExternallyVisible()) return MetadataCache[Ty] = getChar(); // TODO: This is using the RTTI name. Is there a better way to get