diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml index 96dd3a375..98cc10ef3 100644 --- a/.github/workflows/emscripten.yml +++ b/.github/workflows/emscripten.yml @@ -314,6 +314,7 @@ jobs: { git apply -v emscripten-clang19-2-shift-temporary-files-to-tmp-dir.patch git apply -v emscripten-clang19-3-remove-zdefs.patch + git apply -v emscripten-clang19-4-enable_exception_handling.patch } elseif ( "${{ matrix.clang-runtime }}" -imatch "20" ) { diff --git a/patches/llvm/emscripten-clang19-4-enable_exception_handling.patch b/patches/llvm/emscripten-clang19-4-enable_exception_handling.patch new file mode 100644 index 000000000..36b36ba47 --- /dev/null +++ b/patches/llvm/emscripten-clang19-4-enable_exception_handling.patch @@ -0,0 +1,67 @@ +diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp +index 985d0b7c0..20a727893 100644 +--- a/clang/lib/Interpreter/Interpreter.cpp ++++ b/clang/lib/Interpreter/Interpreter.cpp +@@ -135,6 +135,48 @@ CreateCI(const llvm::opt::ArgStringList &Argv) { + return std::move(Clang); + } + ++static llvm::Error HandleFrontendOptions(const CompilerInstance &CI) { ++ const auto &FrontendOpts = CI.getFrontendOpts(); ++ ++ if (FrontendOpts.ShowHelp) { ++ driver::getDriverOptTable().printHelp( ++ llvm::outs(), "clang -cc1 [options] file...", ++ "LLVM 'Clang' Compiler: http://clang.llvm.org", ++ /*ShowHidden=*/false, /*ShowAllAliases=*/false, ++ llvm::opt::Visibility(driver::options::CC1Option)); ++ return llvm::createStringError(llvm::errc::not_supported, "Help displayed"); ++ } ++ ++ if (FrontendOpts.ShowVersion) { ++ llvm::cl::PrintVersionMessage(); ++ return llvm::createStringError(llvm::errc::not_supported, ++ "Version displayed"); ++ } ++ ++ if (!FrontendOpts.LLVMArgs.empty()) { ++ unsigned NumArgs = FrontendOpts.LLVMArgs.size(); ++ auto Args = std::make_unique(NumArgs + 2); ++ Args[0] = "clang-repl (LLVM option parsing)"; ++ for (unsigned i = 0; i != NumArgs; ++i) { ++ Args[i + 1] = FrontendOpts.LLVMArgs[i].c_str(); ++ // remove the leading '-' from the option name ++ if (Args[i + 1][0] == '-') { ++ auto *option = static_cast *>( ++ llvm::cl::getRegisteredOptions()[Args[i + 1] + 1]); ++ if (option) { ++ option->setInitialValue(true); ++ } else { ++ llvm::errs() << "Unknown LLVM option: " << Args[i + 1] << "\n"; ++ } ++ } ++ } ++ Args[NumArgs + 1] = nullptr; ++ llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args.get()); ++ } ++ ++ return llvm::Error::success(); ++} ++ + } // anonymous namespace + + llvm::Expected> +@@ -306,7 +348,12 @@ const char *const Runtimes = R"( + + llvm::Expected> + Interpreter::create(std::unique_ptr CI) { +- llvm::Error Err = llvm::Error::success(); ++ ++ llvm::Error Err = HandleFrontendOptions(*CI); ++ if (Err) { ++ return std::move(Err); ++ } ++ + auto Interp = + std::unique_ptr(new Interpreter(std::move(CI), Err)); + if (Err)