Author: Sean Perry Date: 2021-03-26T16:38:36-04:00 New Revision: 7e0cc45ced230b4ef3a9d8eaedfbe92e75f21916
URL: https://github.com/llvm/llvm-project/commit/7e0cc45ced230b4ef3a9d8eaedfbe92e75f21916 DIFF: https://github.com/llvm/llvm-project/commit/7e0cc45ced230b4ef3a9d8eaedfbe92e75f21916.diff LOG: [SystemZ][z/OS] Save strings for CC_PRINT env vars The contents of the string returned by getenv() is not guaranteed across calls to getenv(). The code to handle the CC_PRINT etc env vars calls getenv() and saves the results in just a char *. The string returned by getenv() needs to be copied and saved. Switching the type of the strings from char * to std::string will do this and manage the alloated memory. Differential Revision: https://reviews.llvm.org/D98554 Added: Modified: clang/include/clang/Driver/Driver.h clang/lib/Driver/Compilation.cpp clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/tools/driver/driver.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 54c20620910b3..469c000c952ca 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -157,16 +157,16 @@ class Driver { std::string HostBits, HostMachine, HostSystem, HostRelease; /// The file to log CC_PRINT_PROC_STAT_FILE output to, if enabled. - const char *CCPrintStatReportFilename; + std::string CCPrintStatReportFilename; /// The file to log CC_PRINT_OPTIONS output to, if enabled. - const char *CCPrintOptionsFilename; + std::string CCPrintOptionsFilename; /// The file to log CC_PRINT_HEADERS output to, if enabled. - const char *CCPrintHeadersFilename; + std::string CCPrintHeadersFilename; /// The file to log CC_LOG_DIAGNOSTICS output to, if enabled. - const char *CCLogDiagnosticsFilename; + std::string CCLogDiagnosticsFilename; /// A list of inputs and their types for the given arguments. typedef SmallVector<std::pair<types::ID, const llvm::opt::Arg *>, 16> diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp index d330557390804..f28c23a59940d 100644 --- a/clang/lib/Driver/Compilation.cpp +++ b/clang/lib/Driver/Compilation.cpp @@ -170,10 +170,11 @@ int Compilation::ExecuteCommand(const Command &C, // Follow gcc implementation of CC_PRINT_OPTIONS; we could also cache the // output stream. - if (getDriver().CCPrintOptions && getDriver().CCPrintOptionsFilename) { + if (getDriver().CCPrintOptions && + !getDriver().CCPrintOptionsFilename.empty()) { std::error_code EC; OwnedStream.reset(new llvm::raw_fd_ostream( - getDriver().CCPrintOptionsFilename, EC, + getDriver().CCPrintOptionsFilename.c_str(), EC, llvm::sys::fs::OF_Append | llvm::sys::fs::OF_Text)); if (EC) { getDriver().Diag(diag::err_drv_cc_print_options_failure) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 0918ea455811c..171d3d5b5b88c 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -135,14 +135,13 @@ Driver::Driver(StringRef ClangExecutable, StringRef TargetTriple, : Diags(Diags), VFS(std::move(VFS)), Mode(GCCMode), SaveTemps(SaveTempsNone), BitcodeEmbed(EmbedNone), LTOMode(LTOK_None), ClangExecutable(ClangExecutable), SysRoot(DEFAULT_SYSROOT), - DriverTitle(Title), CCPrintStatReportFilename(nullptr), - CCPrintOptionsFilename(nullptr), CCPrintHeadersFilename(nullptr), - CCLogDiagnosticsFilename(nullptr), CCCPrintBindings(false), - CCPrintOptions(false), CCPrintHeaders(false), CCLogDiagnostics(false), - CCGenDiagnostics(false), CCPrintProcessStats(false), - TargetTriple(TargetTriple), CCCGenericGCCName(""), Saver(Alloc), - CheckInputsExist(true), GenReproducer(false), - SuppressMissingInputWarning(false) { + DriverTitle(Title), CCPrintStatReportFilename(), CCPrintOptionsFilename(), + CCPrintHeadersFilename(), CCLogDiagnosticsFilename(), + CCCPrintBindings(false), CCPrintOptions(false), CCPrintHeaders(false), + CCLogDiagnostics(false), CCGenDiagnostics(false), + CCPrintProcessStats(false), TargetTriple(TargetTriple), + CCCGenericGCCName(""), Saver(Alloc), CheckInputsExist(true), + GenReproducer(false), SuppressMissingInputWarning(false) { // Provide a sane fallback if no VFS is specified. if (!this->VFS) this->VFS = llvm::vfs::getRealFileSystem(); @@ -4057,7 +4056,7 @@ void Driver::BuildJobs(Compilation &C) const { else LinkingOutput = getDefaultImageName(); - if (!CCPrintStatReportFilename) { + if (CCPrintStatReportFilename.empty()) { using namespace llvm; // Human readable output. outs() << sys::path::filename(Cmd.getExecutable()) << ": " @@ -4080,7 +4079,7 @@ void Driver::BuildJobs(Compilation &C) const { << '\n'; Out.flush(); std::error_code EC; - llvm::raw_fd_ostream OS(CCPrintStatReportFilename, EC, + llvm::raw_fd_ostream OS(CCPrintStatReportFilename.c_str(), EC, llvm::sys::fs::OF_Append | llvm::sys::fs::OF_Text); if (EC) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index f8cc23198e67a..804f528838c58 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5108,8 +5108,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (D.CCPrintHeaders && !D.CCGenDiagnostics) { CmdArgs.push_back("-header-include-file"); - CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename - : "-"); + CmdArgs.push_back(!D.CCPrintHeadersFilename.empty() + ? D.CCPrintHeadersFilename.c_str() + : "-"); CmdArgs.push_back("-sys-header-deps"); } Args.AddLastArg(CmdArgs, options::OPT_P); @@ -5117,8 +5118,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (D.CCLogDiagnostics && !D.CCGenDiagnostics) { CmdArgs.push_back("-diagnostic-log-file"); - CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename - : "-"); + CmdArgs.push_back(!D.CCLogDiagnosticsFilename.empty() + ? D.CCLogDiagnosticsFilename.c_str() + : "-"); } // Give the gen diagnostics more chances to succeed, by avoiding intentional diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp index c3a3aab066ace..ee3ffe3012d1e 100644 --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -244,25 +244,28 @@ static void getCLEnvVarOptions(std::string &EnvValue, llvm::StringSaver &Saver, } static void SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) { - // Handle CC_PRINT_OPTIONS and CC_PRINT_OPTIONS_FILE. - TheDriver.CCPrintOptions = !!::getenv("CC_PRINT_OPTIONS"); - if (TheDriver.CCPrintOptions) - TheDriver.CCPrintOptionsFilename = ::getenv("CC_PRINT_OPTIONS_FILE"); - - // Handle CC_PRINT_HEADERS and CC_PRINT_HEADERS_FILE. - TheDriver.CCPrintHeaders = !!::getenv("CC_PRINT_HEADERS"); - if (TheDriver.CCPrintHeaders) - TheDriver.CCPrintHeadersFilename = ::getenv("CC_PRINT_HEADERS_FILE"); - - // Handle CC_LOG_DIAGNOSTICS and CC_LOG_DIAGNOSTICS_FILE. - TheDriver.CCLogDiagnostics = !!::getenv("CC_LOG_DIAGNOSTICS"); - if (TheDriver.CCLogDiagnostics) - TheDriver.CCLogDiagnosticsFilename = ::getenv("CC_LOG_DIAGNOSTICS_FILE"); - - // Handle CC_PRINT_PROC_STAT and CC_PRINT_PROC_STAT_FILE. - TheDriver.CCPrintProcessStats = !!::getenv("CC_PRINT_PROC_STAT"); - if (TheDriver.CCPrintProcessStats) - TheDriver.CCPrintStatReportFilename = ::getenv("CC_PRINT_PROC_STAT_FILE"); + auto CheckEnvVar = [](const char *EnvOptSet, const char *EnvOptFile, + std::string &OptFile) { + bool OptSet = !!::getenv(EnvOptSet); + if (OptSet) { + if (const char *Var = ::getenv(EnvOptFile)) + OptFile = Var; + } + return OptSet; + }; + + TheDriver.CCPrintOptions = + CheckEnvVar("CC_PRINT_OPTIONS", "CC_PRINT_OPTIONS_FILE", + TheDriver.CCPrintOptionsFilename); + TheDriver.CCPrintHeaders = + CheckEnvVar("CC_PRINT_HEADERS", "CC_PRINT_HEADERS_FILE", + TheDriver.CCPrintHeadersFilename); + TheDriver.CCLogDiagnostics = + CheckEnvVar("CC_LOG_DIAGNOSTICS", "CC_LOG_DIAGNOSTICS_FILE", + TheDriver.CCLogDiagnosticsFilename); + TheDriver.CCPrintProcessStats = + CheckEnvVar("CC_PRINT_PROC_STAT", "CC_PRINT_PROC_STAT_FILE", + TheDriver.CCPrintStatReportFilename); } static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits