r255281 - Do not generate DW_TAG_imported_module for anonymous namespaces (even nested) for all the platforms except PS4.
David Blaikie via cfe-commits
cfe-commits at lists.llvm.org
Sun Dec 13 15:46:28 PST 2015
On Thu, Dec 10, 2015 at 10:52 AM, Ekaterina Romanova via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: kromanova
> Date: Thu Dec 10 12:52:50 2015
> New Revision: 255281
>
> URL: http://llvm.org/viewvc/llvm-project?rev=255281&view=rev
> Log:
> Do not generate DW_TAG_imported_module for anonymous namespaces (even
> nested) for all the platforms except PS4.
> For PS4, generate explicit import for anonymous namespaces and mark it by
> DW_AT_artificial attribute.
>
> Differential Revision: http://reviews.llvm.org/D12624
>
>
> Added:
> cfe/trunk/test/CodeGenCXX/debug-info-anon-namespace.cpp
> Modified:
> cfe/trunk/include/clang/Frontend/CodeGenOptions.def
> cfe/trunk/include/clang/Parse/Parser.h
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> cfe/trunk/lib/Parse/ParseDecl.cpp
> cfe/trunk/lib/Parse/ParseDeclCXX.cpp
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>
> Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=255281&r1=255280&r2=255281&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original)
> +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Thu Dec 10
> 12:52:50 2015
> @@ -166,6 +166,10 @@ CODEGENOPT(DebugColumnInfo, 1, 0) ///< W
> CODEGENOPT(DebugTypeExtRefs, 1, 0) ///< Whether or not debug info should
> contain
> ///< external references to a PCH or
> module.
>
> +CODEGENOPT(DebugExplicitImport, 1, 0) ///< Whether or not debug info
> should
> + ///< contain explicit imports for
> + ///< anonymous namespaces
> +
> CODEGENOPT(EmitLLVMUseLists, 1, 0) ///< Control whether to serialize
> use-lists.
>
> /// The user specified number of registers to be used for integral
> arguments,
>
> Modified: cfe/trunk/include/clang/Parse/Parser.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=255281&r1=255280&r2=255281&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Parse/Parser.h (original)
> +++ cfe/trunk/include/clang/Parse/Parser.h Thu Dec 10 12:52:50 2015
> @@ -2337,8 +2337,8 @@ private:
>
> void DiagnoseUnexpectedNamespace(NamedDecl *Context);
>
> - Decl *ParseNamespace(unsigned Context, SourceLocation &DeclEnd,
> - SourceLocation InlineLoc = SourceLocation());
> + DeclGroupPtrTy ParseNamespace(unsigned Context, SourceLocation &DeclEnd,
> + SourceLocation InlineLoc =
> SourceLocation());
> void ParseInnerNamespace(std::vector<SourceLocation>& IdentLoc,
> std::vector<IdentifierInfo*>& Ident,
> std::vector<SourceLocation>& NamespaceLoc,
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=255281&r1=255280&r2=255281&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Thu Dec 10 12:52:50 2015
> @@ -4093,7 +4093,8 @@ public:
> SourceLocation IdentLoc,
> IdentifierInfo *Ident,
> SourceLocation LBrace,
> - AttributeList *AttrList);
> + AttributeList *AttrList,
> + UsingDirectiveDecl * &UsingDecl);
> void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
>
> NamespaceDecl *getStdNamespace() const;
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=255281&r1=255280&r2=255281&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Thu Dec 10 12:52:50 2015
> @@ -3408,10 +3408,14 @@ llvm::DIScope *CGDebugInfo::getCurrentCo
> void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) {
> if (CGM.getCodeGenOpts().getDebugInfo() <
> CodeGenOptions::LimitedDebugInfo)
> return;
> - DBuilder.createImportedModule(
> - getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())),
> - getOrCreateNameSpace(UD.getNominatedNamespace()),
> - getLineNumber(UD.getLocation()));
> + const NamespaceDecl *NSDecl = UD.getNominatedNamespace();
> + if (!NSDecl->isAnonymousNamespace() ||
> + CGM.getCodeGenOpts().DebugExplicitImport) {
> + DBuilder.createImportedModule(
> + getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())),
> + getOrCreateNameSpace(NSDecl),
> + getLineNumber(UD.getLocation()));
> + }
> }
>
> void CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) {
>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=255281&r1=255280&r2=255281&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Dec 10 12:52:50 2015
> @@ -365,6 +365,7 @@ static bool ParseCodeGenArgs(CodeGenOpti
> const TargetOptions &TargetOpts) {
> using namespace options;
> bool Success = true;
> + llvm::Triple Triple = llvm::Triple(TargetOpts.Triple);
>
> unsigned OptimizationLevel = getOptimizationLevel(Args, IK, Diags);
> // TODO: This could be done in Driver
> @@ -409,6 +410,8 @@ static bool ParseCodeGenArgs(CodeGenOpti
> Opts.EmitCodeView = Args.hasArg(OPT_gcodeview);
> Opts.SplitDwarfFile = Args.getLastArgValue(OPT_split_dwarf_file);
> Opts.DebugTypeExtRefs = Args.hasArg(OPT_dwarf_ext_refs);
> + if (Triple.isPS4CPU())
> + Opts.DebugExplicitImport = true;
>
Could/should this ^ just be: Opts.DebugExplicitImport = Triple.isPS4CPU(); ?
>
> for (const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ))
> Opts.DebugPrefixMap.insert(StringRef(Arg).split('='));
>
> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=255281&r1=255280&r2=255281&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Thu Dec 10 12:52:50 2015
> @@ -1465,15 +1465,13 @@ Parser::DeclGroupPtrTy Parser::ParseDecl
> if (getLangOpts().CPlusPlus && NextToken().is(tok::kw_namespace)) {
> ProhibitAttributes(attrs);
> SourceLocation InlineLoc = ConsumeToken();
> - SingleDecl = ParseNamespace(Context, DeclEnd, InlineLoc);
> - break;
> + return ParseNamespace(Context, DeclEnd, InlineLoc);
> }
> return ParseSimpleDeclaration(Context, DeclEnd, attrs,
> true);
> case tok::kw_namespace:
> ProhibitAttributes(attrs);
> - SingleDecl = ParseNamespace(Context, DeclEnd);
> - break;
> + return ParseNamespace(Context, DeclEnd);
> case tok::kw_using:
> SingleDecl = ParseUsingDirectiveOrDeclaration(Context,
> ParsedTemplateInfo(),
> DeclEnd, attrs,
> &OwnedType);
>
> Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=255281&r1=255280&r2=255281&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Thu Dec 10 12:52:50 2015
> @@ -55,9 +55,9 @@ using namespace clang;
> /// namespace-alias-definition: [C++ 7.3.2: namespace.alias]
> /// 'namespace' identifier '=' qualified-namespace-specifier ';'
> ///
> -Decl *Parser::ParseNamespace(unsigned Context,
> - SourceLocation &DeclEnd,
> - SourceLocation InlineLoc) {
> +Parser::DeclGroupPtrTy Parser::ParseNamespace(unsigned Context,
> + SourceLocation &DeclEnd,
> + SourceLocation InlineLoc) {
> assert(Tok.is(tok::kw_namespace) && "Not a namespace!");
> SourceLocation NamespaceLoc = ConsumeToken(); // eat the 'namespace'.
> ObjCDeclContextSwitch ObjCDC(*this);
> @@ -65,7 +65,7 @@ Decl *Parser::ParseNamespace(unsigned Co
> if (Tok.is(tok::code_completion)) {
> Actions.CodeCompleteNamespaceDecl(getCurScope());
> cutOffParsing();
> - return nullptr;
> + return DeclGroupPtrTy();;
>
Extra semicolon here ^
And is there any reason not to just use nullptr here and elsewhere?
Anything with the substring "PtrTy" in the name seems like it should be
pointer-like and be convertible from nullptr_t, no? (what is
DeclGroupPtrTy?)
> }
>
> SourceLocation IdentLoc;
> @@ -109,15 +109,16 @@ Decl *Parser::ParseNamespace(unsigned Co
> Diag(Tok, diag::err_expected) << tok::identifier;
> // Skip to end of the definition and eat the ';'.
> SkipUntil(tok::semi);
> - return nullptr;
> + return DeclGroupPtrTy();
> }
> if (attrLoc.isValid())
> Diag(attrLoc, diag::err_unexpected_namespace_attributes_alias);
> if (InlineLoc.isValid())
> Diag(InlineLoc, diag::err_inline_namespace_alias)
> << FixItHint::CreateRemoval(InlineLoc);
> - return ParseNamespaceAlias(NamespaceLoc, IdentLoc, Ident, DeclEnd);
> - }
> + Decl *NSAlias = ParseNamespaceAlias(NamespaceLoc, IdentLoc, Ident,
> DeclEnd);
> + return Actions.ConvertDeclToDeclGroup(NSAlias);
> +}
>
> BalancedDelimiterTracker T(*this, tok::l_brace);
> if (T.consumeOpen()) {
> @@ -125,7 +126,7 @@ Decl *Parser::ParseNamespace(unsigned Co
> Diag(Tok, diag::err_expected) << tok::l_brace;
> else
> Diag(Tok, diag::err_expected_either) << tok::identifier <<
> tok::l_brace;
> - return nullptr;
> + return DeclGroupPtrTy();
> }
>
> if (getCurScope()->isClassScope() ||
> getCurScope()->isTemplateParamScope() ||
> @@ -133,7 +134,7 @@ Decl *Parser::ParseNamespace(unsigned Co
> getCurScope()->getFnParent()) {
> Diag(T.getOpenLocation(), diag::err_namespace_nonnamespace_scope);
> SkipUntil(tok::r_brace);
> - return nullptr;
> + return DeclGroupPtrTy();
> }
>
> if (ExtraIdent.empty()) {
> @@ -180,10 +181,11 @@ Decl *Parser::ParseNamespace(unsigned Co
> // Enter a scope for the namespace.
> ParseScope NamespaceScope(this, Scope::DeclScope);
>
> + UsingDirectiveDecl *ImplicitUsingDirectiveDecl = nullptr;
> Decl *NamespcDecl =
> Actions.ActOnStartNamespaceDef(getCurScope(), InlineLoc, NamespaceLoc,
> IdentLoc, Ident, T.getOpenLocation(),
> - attrs.getList());
> + attrs.getList(),
> ImplicitUsingDirectiveDecl);
>
> PrettyDeclStackTraceEntry CrashInfo(Actions, NamespcDecl, NamespaceLoc,
> "parsing namespace");
> @@ -198,8 +200,9 @@ Decl *Parser::ParseNamespace(unsigned Co
>
> DeclEnd = T.getCloseLocation();
> Actions.ActOnFinishNamespaceDef(NamespcDecl, DeclEnd);
> -
> - return NamespcDecl;
> +
> + return Actions.ConvertDeclToDeclGroup(NamespcDecl,
> + ImplicitUsingDirectiveDecl);
> }
>
> /// ParseInnerNamespace - Parse the contents of a namespace.
> @@ -229,17 +232,19 @@ void Parser::ParseInnerNamespace(std::ve
> // FIXME: Preserve the source information through to the AST rather than
> // desugaring it here.
> ParseScope NamespaceScope(this, Scope::DeclScope);
> + UsingDirectiveDecl *ImplicitUsingDirectiveDecl = nullptr;
> Decl *NamespcDecl =
> Actions.ActOnStartNamespaceDef(getCurScope(), SourceLocation(),
> NamespaceLoc[index], IdentLoc[index],
> Ident[index],
> Tracker.getOpenLocation(),
> - attrs.getList());
> + attrs.getList(),
> ImplicitUsingDirectiveDecl);
> + assert(!ImplicitUsingDirectiveDecl &&
> + "nested namespace definition cannot define anonymous namespace");
>
> ParseInnerNamespace(IdentLoc, Ident, NamespaceLoc, ++index, InlineLoc,
> attrs, Tracker);
>
> NamespaceScope.Exit();
> -
> Actions.ActOnFinishNamespaceDef(NamespcDecl,
> Tracker.getCloseLocation());
> }
>
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=255281&r1=255280&r2=255281&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Dec 10 12:52:50 2015
> @@ -7185,7 +7185,8 @@ Decl *Sema::ActOnStartNamespaceDef(Scope
> SourceLocation IdentLoc,
> IdentifierInfo *II,
> SourceLocation LBrace,
> - AttributeList *AttrList) {
> + AttributeList *AttrList,
> + UsingDirectiveDecl *&UD) {
> SourceLocation StartLoc = InlineLoc.isValid() ? InlineLoc :
> NamespaceLoc;
> // For anonymous namespace, take the location of the left brace.
> SourceLocation Loc = II ? IdentLoc : LBrace;
> @@ -7299,14 +7300,13 @@ Decl *Sema::ActOnStartNamespaceDef(Scope
> // namespace internal linkage.
>
> if (!PrevNS) {
> - UsingDirectiveDecl* UD
> - = UsingDirectiveDecl::Create(Context, Parent,
> - /* 'using' */ LBrace,
> - /* 'namespace' */ SourceLocation(),
> - /* qualifier */
> NestedNameSpecifierLoc(),
> - /* identifier */ SourceLocation(),
> - Namespc,
> - /* Ancestor */ Parent);
> + UD = UsingDirectiveDecl::Create(Context, Parent,
> + /* 'using' */ LBrace,
> + /* 'namespace' */ SourceLocation(),
> + /* qualifier */
> NestedNameSpecifierLoc(),
> + /* identifier */ SourceLocation(),
> + Namespc,
> + /* Ancestor */ Parent);
> UD->setImplicit();
> Parent->addDecl(UD);
> }
>
> Added: cfe/trunk/test/CodeGenCXX/debug-info-anon-namespace.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-anon-namespace.cpp?rev=255281&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info-anon-namespace.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/debug-info-anon-namespace.cpp Thu Dec 10
> 12:52:50 2015
> @@ -0,0 +1,26 @@
> +// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited -triple
> x86_64-scei-ps4 -O0 %s -o - | FileCheck --check-prefix=PS4 %s
> +// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited -triple
> x86_64-unknown-linux-gnu -O0 %s -o - | FileCheck --check-prefix=NON-PS4 %s
> +
> +namespace
> +{
> + int a = 5;
> +}
> +int *b = &a;
> +
> +namespace
> +{
> + namespace {
> + int a1 = 5;
> + }
> + int a2 = 7;
> +}
> +int *b1 = &a1;
> +int *b2 = &a2;
> +
> +
> +// PS4: [[NS:![0-9]+]] = !DINamespace
> +// PS4: [[NS2:![0-9]+]] = !DINamespace
> +// PS4: !DIImportedEntity(tag: DW_TAG_imported_module, scope: !0, entity:
> [[NS]])
> +// PS4: !DIImportedEntity(tag: DW_TAG_imported_module, scope: [[NS]],
> entity: [[NS2]], line: {{[0-9]+}})
> +// NON-PS4-NOT: !DIImportedEntity
> +
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151213/3154fab8/attachment-0001.html>
More information about the cfe-commits
mailing list