From 3e2ad26b08a23e786e64e8e47547d25a1b5a7f28 Mon Sep 17 00:00:00 2001 From: Amy Huang Date: Thu, 22 Jul 2021 11:26:03 -0700 Subject: [PATCH] [DebugInfo] Add -fno-ctor-homing for as counterpart to -fuse-ctor-homing Add an opt out flag for constructor homing. Differential Revision: https://reviews.llvm.org/D106582 --- clang/docs/UsersManual.rst | 3 ++- clang/include/clang/Driver/Options.td | 2 ++ clang/lib/Frontend/CompilerInvocation.cpp | 15 +++++++++------ clang/test/CodeGenCXX/debug-info-ctor-homing-flag.cpp | 3 +++ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst index f7f76ed..20be01a 100644 --- a/clang/docs/UsersManual.rst +++ b/clang/docs/UsersManual.rst @@ -2563,7 +2563,8 @@ below. If multiple flags are present, the last one is used. non-trivial, non-aggregate C++ class in the modules that contain a definition of one of its constructors. This relies on the additional assumption that all classes that are not trivially constructible have a - non-trivial constructor that is used somewhere. + non-trivial constructor that is used somewhere. The negation, + -fno-use-ctor-homing, ensures that constructor homing is not used. This flag is not enabled by default, and needs to be used with -cc1 or -Xclang. diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 79955f4..1815cd4 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4836,6 +4836,8 @@ def mrelocation_model : Separate<["-"], "mrelocation-model">, def fno_math_builtin : Flag<["-"], "fno-math-builtin">, HelpText<"Disable implicit builtin knowledge of math functions">, MarshallingInfoFlag>; +def fno_use_ctor_homing: Flag<["-"], "fno-use-ctor-homing">, + HelpText<"Don't use constructor homing for debug info">; def fuse_ctor_homing: Flag<["-"], "fuse-ctor-homing">, HelpText<"Use constructor homing if we are using limited debug info already">; } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 2c696b5..a8f25fa 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1369,9 +1369,6 @@ void CompilerInvocation::GenerateCodeGenArgs( if (DebugInfoVal) GenerateArg(Args, OPT_debug_info_kind_EQ, *DebugInfoVal, SA); - if (Opts.DebugInfo == codegenoptions::DebugInfoConstructor) - GenerateArg(Args, OPT_fuse_ctor_homing, SA); - for (const auto &Prefix : Opts.DebugPrefixMap) GenerateArg(Args, OPT_fdebug_prefix_map_EQ, Prefix.first + "=" + Prefix.second, SA); @@ -1627,10 +1624,16 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, } // If -fuse-ctor-homing is set and limited debug info is already on, then use - // constructor homing. - if (Args.getLastArg(OPT_fuse_ctor_homing)) - if (Opts.getDebugInfo() == codegenoptions::LimitedDebugInfo) + // constructor homing, and vice versa for -fno-use-ctor-homing. + if (const Arg *A = + Args.getLastArg(OPT_fuse_ctor_homing, OPT_fno_use_ctor_homing)) { + if (A->getOption().matches(OPT_fuse_ctor_homing) && + Opts.getDebugInfo() == codegenoptions::LimitedDebugInfo) Opts.setDebugInfo(codegenoptions::DebugInfoConstructor); + if (A->getOption().matches(OPT_fno_use_ctor_homing) && + Opts.getDebugInfo() == codegenoptions::DebugInfoConstructor) + Opts.setDebugInfo(codegenoptions::LimitedDebugInfo); + } for (const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) { auto Split = StringRef(Arg).split('='); diff --git a/clang/test/CodeGenCXX/debug-info-ctor-homing-flag.cpp b/clang/test/CodeGenCXX/debug-info-ctor-homing-flag.cpp index 5443fa9..e0832f4 100644 --- a/clang/test/CodeGenCXX/debug-info-ctor-homing-flag.cpp +++ b/clang/test/CodeGenCXX/debug-info-ctor-homing-flag.cpp @@ -8,6 +8,9 @@ // RUN: | FileCheck %s -check-prefix=NO_DEBUG // RUN: %clang -cc1 -fuse-ctor-homing -emit-llvm %s -o - \ // RUN: | FileCheck %s -check-prefix=NO_DEBUG +// +// RUN: %clang -cc1 -debug-info-kind=constructor -fno-use-ctor-homing \ +// RUN: -emit-llvm %s -o - | FileCheck %s -check-prefix=FULL_DEBUG // This tests that the -fuse-ctor-homing is only used if limited debug info would have // been used otherwise. -- 2.7.4