From: Arthur Eubanks Date: Wed, 6 Oct 2021 20:57:29 +0000 (-0700) Subject: Reland [clang] Pass -clear-ast-before-backend in Clang::ConstructJob() X-Git-Tag: upstream/15.0.7~28018 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=19b07ec00062daffcb2fb132f4ac0f2484ff44fa;p=platform%2Fupstream%2Fllvm.git Reland [clang] Pass -clear-ast-before-backend in Clang::ConstructJob() This clears the memory used for the Clang AST before we run LLVM passes. https://llvm-compile-time-tracker.com/compare.php?from=d0a5f61c4f6fccec87fd5207e3fcd9502dd59854&to=b7437fee79e04464dd968e1a29185495f3590481&stat=max-rss shows significant memory savings with no slowdown (in fact -O0 slightly speeds up). For more background, see https://lists.llvm.org/pipermail/cfe-dev/2021-September/068930.html. Turn this off for the interpreter since it does codegen multiple times. Relanding with fix for -print-stats: D111973 Relanding with fix for plugins: D112190 If you'd like to use this even with plugins, consider using the features introduced in D112096. This can be turned off with -Xclang -no-clear-ast-before-backend. Differential Revision: https://reviews.llvm.org/D111270 --- diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 8dabfff..d5b5e3b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4675,6 +4675,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // cleanup. if (!C.isForDiagnostics()) CmdArgs.push_back("-disable-free"); + CmdArgs.push_back("-clear-ast-before-backend"); #ifdef NDEBUG const bool IsAssertBuild = false; diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index 02b3025..d14940d 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -113,6 +113,10 @@ CreateCI(const llvm::opt::ArgStringList &Argv) { Clang->getTarget().adjust(Clang->getDiagnostics(), Clang->getLangOpts()); + // Don't clear the AST before backend codegen since we do codegen multiple + // times, reusing the same AST. + Clang->getCodeGenOpts().ClearASTBeforeBackend = false; + return std::move(Clang); }