commit 7e0cc45ced230b4ef3a9d8eaedfbe92e75f21916 Author: Sean Perry Date: Fri Mar 26 16:37:29 2021 -0400 [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 Index: llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507/clang/include/clang/Driver/Driver.h =================================================================== --- llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507.orig/clang/include/clang/Driver/Driver.h +++ llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507/clang/include/clang/Driver/Driver.h @@ -158,16 +158,16 @@ public: std::string HostBits, HostMachine, HostSystem, HostRelease; /// The file to log CC_PRINT_PROC_STAT_FILE output to, if enabled. - std::string CCPrintStatReportFilename; + const char *CCPrintStatReportFilename; /// The file to log CC_PRINT_OPTIONS output to, if enabled. - std::string CCPrintOptionsFilename; + const char *CCPrintOptionsFilename; /// The file to log CC_PRINT_HEADERS output to, if enabled. - std::string CCPrintHeadersFilename; + const char *CCPrintHeadersFilename; /// The file to log CC_LOG_DIAGNOSTICS output to, if enabled. - std::string CCLogDiagnosticsFilename; + const char *CCLogDiagnosticsFilename; /// A list of inputs and their types for the given arguments. typedef SmallVector, 16> Index: llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507/clang/lib/Driver/Compilation.cpp =================================================================== --- llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507.orig/clang/lib/Driver/Compilation.cpp +++ llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507/clang/lib/Driver/Compilation.cpp @@ -170,11 +170,10 @@ int Compilation::ExecuteCommand(const Co // Follow gcc implementation of CC_PRINT_OPTIONS; we could also cache the // output stream. - if (getDriver().CCPrintOptions && - !getDriver().CCPrintOptionsFilename.empty()) { + if (getDriver().CCPrintOptions && getDriver().CCPrintOptionsFilename) { std::error_code EC; OwnedStream.reset(new llvm::raw_fd_ostream( - getDriver().CCPrintOptionsFilename.c_str(), EC, + getDriver().CCPrintOptionsFilename, EC, llvm::sys::fs::OF_Append | llvm::sys::fs::OF_Text)); if (EC) { getDriver().Diag(diag::err_drv_cc_print_options_failure) Index: llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507/clang/lib/Driver/Driver.cpp =================================================================== --- llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507.orig/clang/lib/Driver/Driver.cpp +++ llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507/clang/lib/Driver/Driver.cpp @@ -135,13 +135,14 @@ Driver::Driver(StringRef ClangExecutable : Diags(Diags), VFS(std::move(VFS)), Mode(GCCMode), SaveTemps(SaveTempsNone), BitcodeEmbed(EmbedNone), LTOMode(LTOK_None), ClangExecutable(ClangExecutable), SysRoot(DEFAULT_SYSROOT), - 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) { + 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) { // Provide a sane fallback if no VFS is specified. if (!this->VFS) this->VFS = llvm::vfs::getRealFileSystem(); @@ -4059,7 +4060,7 @@ void Driver::BuildJobs(Compilation &C) c else LinkingOutput = getDefaultImageName(); - if (CCPrintStatReportFilename.empty()) { + if (!CCPrintStatReportFilename) { using namespace llvm; // Human readable output. outs() << sys::path::filename(Cmd.getExecutable()) << ": " @@ -4082,7 +4083,7 @@ void Driver::BuildJobs(Compilation &C) c << '\n'; Out.flush(); std::error_code EC; - llvm::raw_fd_ostream OS(CCPrintStatReportFilename.c_str(), EC, + llvm::raw_fd_ostream OS(CCPrintStatReportFilename, EC, llvm::sys::fs::OF_Append | llvm::sys::fs::OF_Text); if (EC) Index: llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507/clang/tools/driver/driver.cpp =================================================================== --- llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507.orig/clang/tools/driver/driver.cpp +++ llvm-toolchain-snapshot_13~++20210403105842+b32e76c6d507/clang/tools/driver/driver.cpp @@ -244,28 +244,25 @@ static void getCLEnvVarOptions(std::stri } static void SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) { - 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; - }; + // 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"); - 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); + // 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"); } static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient,