[clang] 7e0cc45 - [SystemZ][z/OS] Save strings for CC_PRINT env vars
Muiez Ahmed via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 26 13:38:55 PDT 2021
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,
More information about the cfe-commits
mailing list