Author: dblaikie Date: Wed Apr 12 15:58:33 2017 New Revision: 300104 URL: http://llvm.org/viewvc/llvm-project?rev=300104&view=rev Log: Modular Codegen: Separate flags for function and debug info support
This allows using and testing these two features separately. (noteably, debug info is, so far as I know, always a win (basically). But function modular codegen is currently a loss for highly optimized code - where most of the linkonce_odr definitions are optimized away, so providing weak_odr definitions is only overhead) Added: cfe/trunk/test/Modules/Inputs/codegen-flags/ cfe/trunk/test/Modules/Inputs/codegen-flags/foo.h cfe/trunk/test/Modules/Inputs/codegen-flags/foo.modulemap cfe/trunk/test/Modules/Inputs/codegen-flags/use.cpp cfe/trunk/test/Modules/codegen-flags.test Modified: cfe/trunk/include/clang/Basic/LangOptions.def cfe/trunk/include/clang/Driver/CC1Options.td cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/lib/Lex/ModuleMap.cpp cfe/trunk/lib/Serialization/ASTWriter.cpp cfe/trunk/lib/Serialization/ASTWriterDecl.cpp cfe/trunk/test/Modules/codegen.test Modified: cfe/trunk/include/clang/Basic/LangOptions.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=300104&r1=300103&r2=300104&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/LangOptions.def (original) +++ cfe/trunk/include/clang/Basic/LangOptions.def Wed Apr 12 15:58:33 2017 @@ -201,7 +201,8 @@ LANGOPT(SizedDeallocation , 1, 0, "sized LANGOPT(AlignedAllocation , 1, 0, "aligned allocation") LANGOPT(NewAlignOverride , 32, 0, "maximum alignment guaranteed by '::operator new(size_t)'") LANGOPT(ConceptsTS , 1, 0, "enable C++ Extensions for Concepts") -BENIGN_LANGOPT(ModularCodegen , 1, 0, "Modular codegen") +BENIGN_LANGOPT(ModulesCodegen , 1, 0, "Modules code generation") +BENIGN_LANGOPT(ModulesDebugInfo , 1, 0, "Modules debug info") BENIGN_LANGOPT(ElideConstructors , 1, 1, "C++ copy constructor elision") BENIGN_LANGOPT(DumpRecordLayouts , 1, 0, "dumping the layout of IRgen'd records") BENIGN_LANGOPT(DumpRecordLayoutsSimple , 1, 0, "dumping the layout of IRgen'd records in a simple form") Modified: cfe/trunk/include/clang/Driver/CC1Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=300104&r1=300103&r2=300104&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/CC1Options.td (original) +++ cfe/trunk/include/clang/Driver/CC1Options.td Wed Apr 12 15:58:33 2017 @@ -436,10 +436,14 @@ def fmodules_local_submodule_visibility Flag<["-"], "fmodules-local-submodule-visibility">, HelpText<"Enforce name visibility rules across submodules of the same " "top-level module.">; -def fmodule_codegen : +def fmodules_codegen : Flag<["-"], "fmodules-codegen">, HelpText<"Generate code for uses of this module that assumes an explicit " "object file will be built for the module">; +def fmodules_debuginfo : + Flag<["-"], "fmodules-debuginfo">, + HelpText<"Generate debug info for types in an object file built from this " + "module and do not generate them elsewhere">; def fmodule_format_EQ : Joined<["-"], "fmodule-format=">, HelpText<"Select the container format for clang modules and PCH. " "Supported options are 'raw' and 'obj'.">; Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=300104&r1=300103&r2=300104&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Wed Apr 12 15:58:33 2017 @@ -2017,7 +2017,8 @@ static void ParseLangArgs(LangOptions &O Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse; Opts.ModulesLocalVisibility = Args.hasArg(OPT_fmodules_local_submodule_visibility) || Opts.ModulesTS; - Opts.ModularCodegen = Args.hasArg(OPT_fmodule_codegen); + Opts.ModulesCodegen = Args.hasArg(OPT_fmodules_codegen); + Opts.ModulesDebugInfo = Args.hasArg(OPT_fmodules_debuginfo); Opts.ModulesSearchAll = Opts.Modules && !Args.hasArg(OPT_fno_modules_search_all) && Args.hasArg(OPT_fmodules_search_all); Modified: cfe/trunk/lib/Lex/ModuleMap.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=300104&r1=300103&r2=300104&view=diff ============================================================================== --- cfe/trunk/lib/Lex/ModuleMap.cpp (original) +++ cfe/trunk/lib/Lex/ModuleMap.cpp Wed Apr 12 15:58:33 2017 @@ -91,7 +91,6 @@ ModuleMap::ModuleMap(SourceManager &Sour HeaderInfo(HeaderInfo), BuiltinIncludeDir(nullptr), SourceModule(nullptr), NumCreatedModules(0) { MMapLangOpts.LineComment = true; - MMapLangOpts.ModularCodegen = LangOpts.ModularCodegen; } ModuleMap::~ModuleMap() { Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=300104&r1=300103&r2=300104&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed Apr 12 15:58:33 2017 @@ -4782,7 +4782,7 @@ ASTFileSignature ASTWriter::WriteASTCore if (!EagerlyDeserializedDecls.empty()) Stream.EmitRecord(EAGERLY_DESERIALIZED_DECLS, EagerlyDeserializedDecls); - if (Context.getLangOpts().ModularCodegen) + if (!ModularCodegenDecls.empty()) Stream.EmitRecord(MODULAR_CODEGEN_DECLS, ModularCodegenDecls); // Write the record containing tentative definitions. @@ -5788,11 +5788,10 @@ void ASTRecordWriter::AddCXXDefinitionDa // getODRHash will compute the ODRHash if it has not been previously computed. Record->push_back(D->getODRHash()); - - bool ModularCodegen = Writer->Context->getLangOpts().ModularCodegen && - Writer->WritingModule && !D->isDependentType(); - Record->push_back(ModularCodegen); - if (ModularCodegen) + bool ModulesDebugInfo = Writer->Context->getLangOpts().ModulesDebugInfo && + Writer->WritingModule && !D->isDependentType(); + Record->push_back(ModulesDebugInfo); + if (ModulesDebugInfo) Writer->ModularCodegenDecls.push_back(Writer->GetDeclRef(D)); // IsLambda bit is already saved. Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=300104&r1=300103&r2=300104&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Wed Apr 12 15:58:33 2017 @@ -2228,10 +2228,10 @@ void ASTRecordWriter::AddFunctionDefinit Writer->ClearSwitchCaseIDs(); assert(FD->doesThisDeclarationHaveABody()); - bool ModularCodegen = Writer->Context->getLangOpts().ModularCodegen && + bool ModulesCodegen = Writer->Context->getLangOpts().ModulesCodegen && Writer->WritingModule && !FD->isDependentContext(); - Record->push_back(ModularCodegen); - if (ModularCodegen) + Record->push_back(ModulesCodegen); + if (ModulesCodegen) Writer->ModularCodegenDecls.push_back(Writer->GetDeclRef(FD)); if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) { Record->push_back(CD->getNumCtorInitializers()); Added: cfe/trunk/test/Modules/Inputs/codegen-flags/foo.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/codegen-flags/foo.h?rev=300104&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/codegen-flags/foo.h (added) +++ cfe/trunk/test/Modules/Inputs/codegen-flags/foo.h Wed Apr 12 15:58:33 2017 @@ -0,0 +1,4 @@ +struct foo { +}; +inline void f1() { +} Added: cfe/trunk/test/Modules/Inputs/codegen-flags/foo.modulemap URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/codegen-flags/foo.modulemap?rev=300104&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/codegen-flags/foo.modulemap (added) +++ cfe/trunk/test/Modules/Inputs/codegen-flags/foo.modulemap Wed Apr 12 15:58:33 2017 @@ -0,0 +1 @@ +module foo { header "foo.h" } Added: cfe/trunk/test/Modules/Inputs/codegen-flags/use.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/codegen-flags/use.cpp?rev=300104&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/codegen-flags/use.cpp (added) +++ cfe/trunk/test/Modules/Inputs/codegen-flags/use.cpp Wed Apr 12 15:58:33 2017 @@ -0,0 +1,5 @@ +#include "foo.h" +void use() { + f1(); + foo f; +} Added: cfe/trunk/test/Modules/codegen-flags.test URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/codegen-flags.test?rev=300104&view=auto ============================================================================== --- cfe/trunk/test/Modules/codegen-flags.test (added) +++ cfe/trunk/test/Modules/codegen-flags.test Wed Apr 12 15:58:33 2017 @@ -0,0 +1,25 @@ +RUN: rm -rf %t +REQUIRES: x86-registered-target + +RUN: %clang_cc1 -triple=x86_64-linux-gnu -fmodules-codegen -x c++ -fmodules -emit-module -fmodule-name=foo %S/Inputs/codegen-flags/foo.modulemap -o %t/foo-cg.pcm +RUN: %clang_cc1 -triple=x86_64-linux-gnu -fmodules-debuginfo -x c++ -fmodules -emit-module -fmodule-name=foo %S/Inputs/codegen-flags/foo.modulemap -o %t/foo-di.pcm + +RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - %t/foo-cg.pcm | FileCheck --check-prefix=CG %s +RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - %t/foo-di.pcm | FileCheck --check-prefix=DI %s + +RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -fmodules -fmodule-file=%t/foo-cg.pcm %S/Inputs/codegen-flags/use.cpp | FileCheck --check-prefix=CG-USE %s +RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -fmodules -fmodule-file=%t/foo-di.pcm %S/Inputs/codegen-flags/use.cpp | FileCheck --check-prefix=DI-USE %s + +CG: define weak_odr void @_Z2f1v +CG: DICompileUnit +CG-NOT: DICompositeType + +CG-USE: declare void @_Z2f1v +CG-USE: DICompileUnit +CG-USE: distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo" + +DI-NOT: define +DI: distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo" + +DI-USE: define linkonce_odr void @_Z2f1v +DI-USE: = !DICompositeType(tag: DW_TAG_structure_type, name: "foo", {{.*}}, flags: DIFlagFwdDecl Modified: cfe/trunk/test/Modules/codegen.test URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/codegen.test?rev=300104&r1=300103&r2=300104&view=diff ============================================================================== --- cfe/trunk/test/Modules/codegen.test (original) +++ cfe/trunk/test/Modules/codegen.test Wed Apr 12 15:58:33 2017 @@ -1,7 +1,7 @@ RUN: rm -rf %t REQUIRES: x86-registered-target -RUN: %clang_cc1 -triple=x86_64-linux-gnu -fmodules-codegen -x c++ -fmodules -emit-module -fmodule-name=foo %S/Inputs/codegen/foo.modulemap -o %t/foo.pcm +RUN: %clang_cc1 -triple=x86_64-linux-gnu -fmodules-codegen -fmodules-debuginfo -x c++ -fmodules -emit-module -fmodule-name=foo %S/Inputs/codegen/foo.modulemap -o %t/foo.pcm RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - %t/foo.pcm | FileCheck --check-prefix=FOO --check-prefix=BOTH %s RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -fmodules -fmodule-file=%t/foo.pcm %S/Inputs/codegen/use.cpp | FileCheck --check-prefix=BOTH --check-prefix=USE %s _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits