diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 21:20:15 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 21:20:15 +0000 | 
| commit | d225fe9c6746d065ebe184f96f2cfbafec025668 (patch) | |
| tree | 519a168bd6cb762c2cbd1f1aa28050565f385881 /clang/tools/driver/driver.cpp | |
| parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) | |
Notes
Diffstat (limited to 'clang/tools/driver/driver.cpp')
| -rw-r--r-- | clang/tools/driver/driver.cpp | 47 | 
1 files changed, 23 insertions, 24 deletions
diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp index 4cdf8015b1bf..39f6c7f62be4 100644 --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -258,27 +258,6 @@ static void SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) {    TheDriver.CCLogDiagnostics = !!::getenv("CC_LOG_DIAGNOSTICS");    if (TheDriver.CCLogDiagnostics)      TheDriver.CCLogDiagnosticsFilename = ::getenv("CC_LOG_DIAGNOSTICS_FILE"); - -  // Whether the cc1 tool should be called inside the current process, or if we -  // should spawn a new clang process (old behavior). -  // Not having an additional process saves some execution time of Windows, -  // and makes debugging easier. -  bool UseNewCC1Process = CLANG_SPAWN_CC1; - -  StringRef SpawnCC1Str = ::getenv("CLANG_SPAWN_CC1"); -  if (!SpawnCC1Str.empty()) { -    if (SpawnCC1Str != "0" && SpawnCC1Str != "1") { -      llvm::errs() << "error: the value of the environment variable " -                      "CLANG_SPAWN_CC1 must be either 0 or 1.\n"; -      ::exit(1); -    } -    UseNewCC1Process = SpawnCC1Str[0] - '0'; -  } -  if (!UseNewCC1Process) { -    TheDriver.CC1Main = &ExecuteCC1Tool; -    // Ensure the CC1Command actually catches cc1 crashes -    llvm::CrashRecoveryContext::Enable(); -  }  }  static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient, @@ -294,7 +273,7 @@ static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient,  // This lets us create the DiagnosticsEngine with a properly-filled-out  // DiagnosticOptions instance.  static DiagnosticOptions * -CreateAndPopulateDiagOpts(ArrayRef<const char *> argv) { +CreateAndPopulateDiagOpts(ArrayRef<const char *> argv, bool &UseNewCC1Process) {    auto *DiagOpts = new DiagnosticOptions;    unsigned MissingArgIndex, MissingArgCount;    InputArgList Args = getDriverOptTable().ParseArgs( @@ -303,6 +282,12 @@ CreateAndPopulateDiagOpts(ArrayRef<const char *> argv) {    // Any errors that would be diagnosed here will also be diagnosed later,    // when the DiagnosticsEngine actually exists.    (void)ParseDiagnosticArgs(*DiagOpts, Args); + +  UseNewCC1Process = +      Args.hasFlag(clang::driver::options::OPT_fno_integrated_cc1, +                   clang::driver::options::OPT_fintegrated_cc1, +                   /*Default=*/CLANG_SPAWN_CC1); +    return DiagOpts;  } @@ -330,7 +315,7 @@ static void SetInstallDir(SmallVectorImpl<const char *> &argv,  static int ExecuteCC1Tool(ArrayRef<const char *> argv) {    // If we call the cc1 tool from the clangDriver library (through -  // Driver::CC1Main), we need to cleanup the options usage count. The options +  // Driver::CC1Main), we need to clean up the options usage count. The options    // are currently global, and they might have been used previously by the    // driver.    llvm::cl::ResetAllOptionOccurrences(); @@ -413,6 +398,8 @@ int main(int argc_, const char **argv_) {      return ExecuteCC1Tool(argv);    } +  // Handle options that need handling before the real command line parsing in +  // Driver::BuildCompilation()    bool CanonicalPrefixes = true;    for (int i = 1, size = argv.size(); i < size; ++i) {      // Skip end-of-line response file markers @@ -457,8 +444,14 @@ int main(int argc_, const char **argv_) {    std::string Path = GetExecutablePath(argv[0], CanonicalPrefixes); +  // Whether the cc1 tool should be called inside the current process, or if we +  // should spawn a new clang subprocess (old behavior). +  // Not having an additional process saves some execution time of Windows, +  // and makes debugging and profiling easier. +  bool UseNewCC1Process; +    IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = -      CreateAndPopulateDiagOpts(argv); +      CreateAndPopulateDiagOpts(argv, UseNewCC1Process);    TextDiagnosticPrinter *DiagClient      = new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts); @@ -486,6 +479,12 @@ int main(int argc_, const char **argv_) {    SetBackdoorDriverOutputsFromEnvVars(TheDriver); +  if (!UseNewCC1Process) { +    TheDriver.CC1Main = &ExecuteCC1Tool; +    // Ensure the CC1Command actually catches cc1 crashes +    llvm::CrashRecoveryContext::Enable(); +  } +    std::unique_ptr<Compilation> C(TheDriver.BuildCompilation(argv));    int Res = 1;    if (C && !C->containsError()) {  | 
