aeubanks created this revision. Herald added subscribers: dexonsmith, dang. aeubanks requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This is to save memory for Clang compiles. Measuring building PassBuilder.cpp under /usr/bin/time, max rss goes from 0.93GB to 0.7GB. This does not turn it by default yet. I've turned on the option locally and run it over a good amount of files without any issues. For more background, see https://lists.llvm.org/pipermail/cfe-dev/2021-September/068930.html. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D111105 Files: clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Driver/Options.td clang/lib/CodeGen/CodeGenAction.cpp clang/test/Misc/clear-ast-before-backend.c Index: clang/test/Misc/clear-ast-before-backend.c =================================================================== --- /dev/null +++ clang/test/Misc/clear-ast-before-backend.c @@ -0,0 +1,3 @@ +// RUN: %clang -target x86_64-linux-gnu -c -Xclang -clear-ast-before-backend %s -S +// RUN: %clang -target x86_64-linux-gnu -c -Xclang -clear-ast-before-backend %s -S -### 2>&1 | FileCheck %s +// CHECK: "-clear-ast-before-backend" Index: clang/lib/CodeGen/CodeGenAction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenAction.cpp +++ clang/lib/CodeGen/CodeGenAction.cpp @@ -351,6 +351,11 @@ } } + // FIXME: Fix cleanup issues with clearing the AST when we properly free + // things. + if (CodeGenOpts.DisableFree && CodeGenOpts.ClearASTBeforeBackend) + C.getAllocator().Reset(); + EmbedBitcode(getModule(), CodeGenOpts, llvm::MemoryBufferRef()); EmitBackendOutput(Diags, HeaderSearchOpts, CodeGenOpts, TargetOpts, Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -5297,6 +5297,9 @@ def disable_free : Flag<["-"], "disable-free">, HelpText<"Disable freeing of memory on exit">, MarshallingInfoFlag<FrontendOpts<"DisableFree">>; +def clear_ast_before_backend : Flag<["-"], "clear-ast-before-backend">, + HelpText<"Clear the Clang AST before running backend code generation">, + MarshallingInfoFlag<CodeGenOpts<"ClearASTBeforeBackend">>; def enable_noundef_analysis : Flag<["-"], "enable-noundef-analysis">, Group<f_Group>, HelpText<"Enable analyzing function argument and return types for mandatory definedness">, MarshallingInfoFlag<CodeGenOpts<"EnableNoundefAttrs">>; Index: clang/include/clang/Basic/CodeGenOptions.def =================================================================== --- clang/include/clang/Basic/CodeGenOptions.def +++ clang/include/clang/Basic/CodeGenOptions.def @@ -54,6 +54,7 @@ CODEGENOPT(EnableAIXExtendedAltivecABI, 1, 0) ///< Set for -mabi=vec-extabi. Enables the extended Altivec ABI on AIX. ENUM_CODEGENOPT(FramePointer, FramePointerKind, 2, FramePointerKind::None) /// frame-pointer: all,non-leaf,none +CODEGENOPT(ClearASTBeforeBackend , 1, 0) ///< Free the AST before running backend code generation. Only works with -disable-free. CODEGENOPT(DisableFree , 1, 0) ///< Don't free memory. CODEGENOPT(DiscardValueNames , 1, 0) ///< Discard Value Names from the IR (LLVMContext flag) CODEGENOPT(DisableLLVMPasses , 1, 0) ///< Don't run any LLVM IR passes to get
Index: clang/test/Misc/clear-ast-before-backend.c =================================================================== --- /dev/null +++ clang/test/Misc/clear-ast-before-backend.c @@ -0,0 +1,3 @@ +// RUN: %clang -target x86_64-linux-gnu -c -Xclang -clear-ast-before-backend %s -S +// RUN: %clang -target x86_64-linux-gnu -c -Xclang -clear-ast-before-backend %s -S -### 2>&1 | FileCheck %s +// CHECK: "-clear-ast-before-backend" Index: clang/lib/CodeGen/CodeGenAction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenAction.cpp +++ clang/lib/CodeGen/CodeGenAction.cpp @@ -351,6 +351,11 @@ } } + // FIXME: Fix cleanup issues with clearing the AST when we properly free + // things. + if (CodeGenOpts.DisableFree && CodeGenOpts.ClearASTBeforeBackend) + C.getAllocator().Reset(); + EmbedBitcode(getModule(), CodeGenOpts, llvm::MemoryBufferRef()); EmitBackendOutput(Diags, HeaderSearchOpts, CodeGenOpts, TargetOpts, Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -5297,6 +5297,9 @@ def disable_free : Flag<["-"], "disable-free">, HelpText<"Disable freeing of memory on exit">, MarshallingInfoFlag<FrontendOpts<"DisableFree">>; +def clear_ast_before_backend : Flag<["-"], "clear-ast-before-backend">, + HelpText<"Clear the Clang AST before running backend code generation">, + MarshallingInfoFlag<CodeGenOpts<"ClearASTBeforeBackend">>; def enable_noundef_analysis : Flag<["-"], "enable-noundef-analysis">, Group<f_Group>, HelpText<"Enable analyzing function argument and return types for mandatory definedness">, MarshallingInfoFlag<CodeGenOpts<"EnableNoundefAttrs">>; Index: clang/include/clang/Basic/CodeGenOptions.def =================================================================== --- clang/include/clang/Basic/CodeGenOptions.def +++ clang/include/clang/Basic/CodeGenOptions.def @@ -54,6 +54,7 @@ CODEGENOPT(EnableAIXExtendedAltivecABI, 1, 0) ///< Set for -mabi=vec-extabi. Enables the extended Altivec ABI on AIX. ENUM_CODEGENOPT(FramePointer, FramePointerKind, 2, FramePointerKind::None) /// frame-pointer: all,non-leaf,none +CODEGENOPT(ClearASTBeforeBackend , 1, 0) ///< Free the AST before running backend code generation. Only works with -disable-free. CODEGENOPT(DisableFree , 1, 0) ///< Don't free memory. CODEGENOPT(DiscardValueNames , 1, 0) ///< Discard Value Names from the IR (LLVMContext flag) CODEGENOPT(DisableLLVMPasses , 1, 0) ///< Don't run any LLVM IR passes to get
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits