| ... | @@ -207,8 +207,6 @@ extern int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, | ... | @@ -207,8 +207,6 @@ extern int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, |
| 207 | void *MainAddr); | 207 | void *MainAddr); |
| 208 | extern int cc1as_main(ArrayRef<const char *> Argv, const char *Argv0, | 208 | extern int cc1as_main(ArrayRef<const char *> Argv, const char *Argv0, |
| 209 | void *MainAddr); | 209 | void *MainAddr); |
| 210 | extern int cc1gen_reproducer_main(ArrayRef<const char *> Argv, | | |
| 211 | const char *Argv0, void *MainAddr); | | |
| 212 | | 210 | |
| 213 | static void insertTargetAndModeArgs(const ParsedClangName &NameParts, | 211 | static void insertTargetAndModeArgs(const ParsedClangName &NameParts, |
| 214 | SmallVectorImpl<const char *> &ArgVector, | 212 | SmallVectorImpl<const char *> &ArgVector, |
| ... | @@ -318,22 +316,28 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV) { | ... | @@ -318,22 +316,28 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV) { |
| 318 | if (Tool == "-cc1as") | 316 | if (Tool == "-cc1as") |
| 319 | return cc1as_main(makeArrayRef(ArgV).slice(2), ArgV[0], | 317 | return cc1as_main(makeArrayRef(ArgV).slice(2), ArgV[0], |
| 320 | GetExecutablePathVP); | 318 | GetExecutablePathVP); |
| 321 | if (Tool == "-cc1gen-reproducer") | | |
| 322 | return cc1gen_reproducer_main(makeArrayRef(ArgV).slice(2), ArgV[0], | | |
| 323 | GetExecutablePathVP); | | |
| 324 | // Reject unknown tools. | 319 | // Reject unknown tools. |
| 325 | llvm::errs() << "error: unknown integrated tool '" << Tool << "'. " | 320 | llvm::errs() << "error: unknown integrated tool '" << Tool << "'. " |
| 326 | << "Valid tools include '-cc1' and '-cc1as'.\n"; | 321 | << "Valid tools include '-cc1' and '-cc1as'.\n"; |
| 327 | return 1; | 322 | return 1; |
| 328 | } | 323 | } |
| 329 | | 324 | |
| 330 | int main(int Argc, const char **Argv) { | 325 | extern "C" int ZigClang_main(int Argc, const char **Argv); |
| | 326 | int ZigClang_main(int Argc, const char **Argv) { |
| 331 | noteBottomOfStack(); | 327 | noteBottomOfStack(); |
| 332 | llvm::InitLLVM X(Argc, Argv); | 328 | // ZIG PATCH: On Windows, InitLLVM calls GetCommandLineW(), |
| | 329 | // and overwrites the args. We don't want it to do that, |
| | 330 | // and we also don't need the signal handlers it installs |
| | 331 | // (we have our own already), so we just use llvm_shutdown_obj |
| | 332 | // instead. |
| | 333 | // llvm::InitLLVM X(Argc, Argv); |
| | 334 | llvm::llvm_shutdown_obj X; |
| | 335 | |
| 333 | llvm::setBugReportMsg("PLEASE submit a bug report to " BUG_REPORT_URL | 336 | llvm::setBugReportMsg("PLEASE submit a bug report to " BUG_REPORT_URL |
| 334 | " and include the crash backtrace, preprocessed " | 337 | " and include the crash backtrace, preprocessed " |
| 335 | "source, and associated run script.\n"); | 338 | "source, and associated run script.\n"); |
| 336 | SmallVector<const char *, 256> Args(Argv, Argv + Argc); | 339 | size_t argv_offset = (strcmp(Argv[1], "-cc1") == 0 || strcmp(Argv[1], "-cc1as") == 0) ? 0 : 1; |
| | 340 | SmallVector<const char *, 256> Args(Argv + argv_offset, Argv + Argc); |
| 337 | | 341 | |
| 338 | if (llvm::sys::Process::FixupStandardFileDescriptors()) | 342 | if (llvm::sys::Process::FixupStandardFileDescriptors()) |
| 339 | return 1; | 343 | return 1; |
| ... | @@ -432,7 +436,9 @@ int main(int Argc, const char **Argv) { | ... | @@ -432,7 +436,9 @@ int main(int Argc, const char **Argv) { |
| 432 | ApplyQAOverride(Args, OverrideStr, SavedStrings); | 436 | ApplyQAOverride(Args, OverrideStr, SavedStrings); |
| 433 | } | 437 | } |
| 434 | | 438 | |
| 435 | std::string Path = GetExecutablePath(Args[0], CanonicalPrefixes); | 439 | // Pass local param `Argv[0]` as fallback. |
| | 440 | // See https://github.com/ziglang/zig/pull/3292 . |
| | 441 | std::string Path = GetExecutablePath(Argv[0], CanonicalPrefixes); |
| 436 | | 442 | |
| 437 | // Whether the cc1 tool should be called inside the current process, or if we | 443 | // Whether the cc1 tool should be called inside the current process, or if we |
| 438 | // should spawn a new clang subprocess (old behavior). | 444 | // should spawn a new clang subprocess (old behavior). |