diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index fa4c1439c9261..15d3b033c1eee 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -141,6 +141,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 namespace clang { @@ -451,7 +493,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) diff --git a/clang/test/Interpreter/handlefrontendopts.cpp b/clang/test/Interpreter/handlefrontendopts.cpp new file mode 100644 index 0000000000000..7596a6e745a03 --- /dev/null +++ b/clang/test/Interpreter/handlefrontendopts.cpp @@ -0,0 +1,5 @@ +// RUN: not clang-repl --Xcc -Xclang --Xcc -help 2>&1 | FileCheck %s --check-prefix=HELP +// RUN: not clang-repl --Xcc -Xclang --Xcc -version 2>&1 | FileCheck %s --check-prefix=VERSION + +// HELP: Help displayed +// VERSION: Version displayed \ No newline at end of file