5353#include " ToolChains/WebAssembly.h"
5454#include " ToolChains/XCore.h"
5555#include " ToolChains/ZOS.h"
56- #include " clang/Basic/CharInfo.h"
5756#include " clang/Basic/DiagnosticDriver.h"
5857#include " clang/Basic/TargetID.h"
5958#include " clang/Basic/Version.h"
@@ -4292,13 +4291,6 @@ void Driver::handleArguments(Compilation &C, DerivedArgList &Args,
42924291 YcArg = nullptr ;
42934292 }
42944293
4295- if (Args.hasArgNoClaim (options::OPT_fmodules_driver))
4296- // TODO: Check against all incompatible -fmodules-driver arguments
4297- if (!ModulesModeCXX20) {
4298- Diag (diag::warn_modules_driver_unsupported_standard);
4299- Args.eraseArg (options::OPT_fmodules_driver);
4300- }
4301-
43024294 Arg *FinalPhaseArg;
43034295 phases::ID FinalPhase = getFinalPhase (Args, &FinalPhaseArg);
43044296
@@ -4425,174 +4417,6 @@ void Driver::handleArguments(Compilation &C, DerivedArgList &Args,
44254417 }
44264418}
44274419
4428- static void skipWhitespace (const char *&Ptr) {
4429- while (isWhitespace (*Ptr))
4430- ++Ptr;
4431- }
4432-
4433- // Returns the length of EOL, either 0 (no end-of-line), 1 (\n) or 2 (\r\n).
4434- static unsigned isEOL (const char *Ptr) {
4435- if (*Ptr == ' \0 ' )
4436- return 0 ;
4437- if (*(Ptr + 1 ) != ' \0 ' && isVerticalWhitespace (Ptr[0 ]) &&
4438- isVerticalWhitespace (Ptr[1 ]) && Ptr[0 ] != Ptr[1 ])
4439- return 2 ;
4440- return !!isVerticalWhitespace (Ptr[0 ]);
4441- }
4442-
4443- static void skipLine (const char *&Ptr) {
4444- for (;;) {
4445- char LastNonWhitespace = ' ' ;
4446- while (!isVerticalWhitespace (*Ptr) && *Ptr != ' \0 ' ) {
4447- if (!isHorizontalWhitespace (*Ptr))
4448- LastNonWhitespace = *Ptr;
4449- ++Ptr;
4450- }
4451-
4452- const unsigned Len = isEOL (Ptr);
4453- if (!Len)
4454- return ;
4455-
4456- Ptr += Len;
4457- if (LastNonWhitespace != ' \\ ' )
4458- break ;
4459- }
4460- }
4461-
4462- // Returns the length of a line splice sequence (including trailing
4463- // whitespace), or 0 if no line splice is found.
4464- static unsigned isLineSplice (const char *Start) {
4465- if (*Start != ' \\ ' )
4466- return 0 ;
4467-
4468- const char *Ptr = Start + 1 ;
4469- while (isHorizontalWhitespace (*Ptr))
4470- ++Ptr;
4471-
4472- if (unsigned Len = isEOL (Ptr))
4473- return Ptr - Start + Len;
4474- return 0 ;
4475- }
4476-
4477- static bool trySkipLineSplice (const char *&Ptr) {
4478- if (unsigned Len = isLineSplice (Ptr); Len) {
4479- Ptr += Len;
4480- return true ;
4481- }
4482- return false ;
4483- }
4484-
4485- static bool trySkipDirective (const char *&Ptr) {
4486- if (*Ptr != ' #' )
4487- return false ;
4488-
4489- ++Ptr;
4490- skipLine (Ptr);
4491- return true ;
4492- }
4493-
4494- static bool trySkipLineComment (const char *&Ptr) {
4495- if (Ptr[0 ] != ' /' || Ptr[1 ] != ' /' )
4496- return false ;
4497-
4498- Ptr += 2 ;
4499- skipLine (Ptr);
4500- return true ;
4501- }
4502-
4503- static bool trySkipBlockComment (const char *&Ptr) {
4504- if (Ptr[0 ] != ' /' || Ptr[1 ] != ' *' )
4505- return false ;
4506-
4507- Ptr += 2 ;
4508- while (*Ptr != ' \0 ' ) {
4509- if (Ptr[0 ] == ' *' && Ptr[1 ] == ' /' ) {
4510- Ptr += 2 ; // '*/'
4511- return true ;
4512- }
4513- ++Ptr;
4514- }
4515- return true ;
4516- }
4517-
4518- static bool trySkipComment (const char *&Ptr) {
4519- return trySkipLineComment (Ptr) || trySkipBlockComment (Ptr);
4520- }
4521-
4522- // Skipps over comments and (non-module) directives
4523- static void skipToRelevantCXXModuleText (const char *&Ptr) {
4524- while (*Ptr != ' \0 ' ) {
4525- skipWhitespace (Ptr);
4526- if (trySkipComment (Ptr) || trySkipDirective (Ptr) || trySkipLineSplice (Ptr))
4527- continue ;
4528- break ; // Found relevant text!
4529- }
4530- }
4531-
4532- static bool scanBufferForCXXModuleUsage (const llvm::MemoryBuffer &Buffer) {
4533- const char *Ptr = Buffer.getBufferStart ();
4534- skipToRelevantCXXModuleText (Ptr);
4535-
4536- // Check if the buffer has enough remaining bytes left for any of the
4537- // module-related declaration fragments we are checking for, without making
4538- // the potentially memory-mapped buffer load unnecessary pages.
4539- constexpr int MinKeywordLength = 6 ;
4540- const char *Begin = Ptr;
4541- for (int i = 0 ; i < MinKeywordLength; ++i) {
4542- if (*Ptr == ' \0 ' )
4543- return false ;
4544- ++Ptr;
4545- }
4546- StringRef Text (Begin, MinKeywordLength);
4547-
4548- const bool IsGlobalModule = Text.starts_with (" module" );
4549- if (!IsGlobalModule && !Text.starts_with (" import" ) &&
4550- !Text.starts_with (" export" ))
4551- return false ;
4552-
4553- // Ensure the keyword has a proper ending and isn't part of a identifier
4554- // or namespace. For this we might have to skip comments and line
4555- // continuations.
4556- while (*Ptr != ' \0 ' ) {
4557- if (isWhitespace (*Ptr) || (IsGlobalModule && *Ptr == ' ;' ))
4558- return true ;
4559- if (trySkipBlockComment (Ptr) || trySkipLineSplice (Ptr))
4560- continue ;
4561- return false ;
4562- }
4563-
4564- return false ;
4565- }
4566-
4567- static bool hasCXXModuleInputType (const Driver::InputList &Inputs) {
4568- const auto IsTypeCXXModule = [](const auto &Input) -> bool {
4569- const auto TypeID = Input.first ;
4570- return (TypeID == types::TY_CXXModule);
4571- };
4572- return llvm::any_of (Inputs, IsTypeCXXModule);
4573- }
4574-
4575- llvm::ErrorOr<bool >
4576- Driver::ScanInputsForCXXModuleUsage (const InputList &Inputs) const {
4577- const auto CXXInputs = llvm::make_filter_range (
4578- Inputs, [](const auto &Input) { return types::isCXX (Input.first ); });
4579-
4580- for (const auto &Input : CXXInputs) {
4581- StringRef Filename = Input.second ->getSpelling ();
4582- auto ErrOrBuffer = VFS->getBufferForFile (Filename);
4583- if (!ErrOrBuffer)
4584- return ErrOrBuffer.getError ();
4585- const auto Buffer = std::move (*ErrOrBuffer);
4586-
4587- if (scanBufferForCXXModuleUsage (*Buffer)) {
4588- Diags.Report (diag::remark_found_cxx20_module_usage) << Filename;
4589- return true ;
4590- }
4591- }
4592-
4593- return false ;
4594- }
4595-
45964420void Driver::BuildActions (Compilation &C, DerivedArgList &Args,
45974421 const InputList &Inputs, ActionList &Actions) const {
45984422 llvm::PrettyStackTraceString CrashInfo (" Building compilation actions" );
@@ -4604,33 +4428,6 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
46044428
46054429 handleArguments (C, Args, Inputs, Actions);
46064430
4607- if (Args.hasFlag (options::OPT_fmodules_driver,
4608- options::OPT_fno_modules_driver, false )) {
4609- // TODO: Move the logic for implicitly enabling explicit-module-builds out
4610- // of -fmodules-driver once it is no longer experimental.
4611- // Currently, this serves diagnostic purposes only.
4612- bool UsesCXXModules = hasCXXModuleInputType (Inputs);
4613- if (!UsesCXXModules) {
4614- const auto ErrOrScanResult = ScanInputsForCXXModuleUsage (Inputs);
4615- if (!ErrOrScanResult) {
4616- Diags.Report (diag::err_cannot_open_file)
4617- << ErrOrScanResult.getError ().message ();
4618- return ;
4619- }
4620- UsesCXXModules = *ErrOrScanResult;
4621- }
4622- if (UsesCXXModules)
4623- BuildDriverManagedModuleBuildActions (C, Args, Inputs, Actions);
4624- return ;
4625- }
4626-
4627- BuildDefaultActions (C, Args, Inputs, Actions);
4628- }
4629-
4630- void Driver::BuildDefaultActions (Compilation &C, DerivedArgList &Args,
4631- const InputList &Inputs,
4632- ActionList &Actions) const {
4633-
46344431 bool UseNewOffloadingDriver =
46354432 C.isOffloadingHostKind (Action::OFK_OpenMP) ||
46364433 C.isOffloadingHostKind (Action::OFK_SYCL) ||
@@ -4914,13 +4711,6 @@ void Driver::BuildDefaultActions(Compilation &C, DerivedArgList &Args,
49144711 Args.ClaimAllArgs (options::OPT_cl_ignored_Group);
49154712}
49164713
4917- void Driver::BuildDriverManagedModuleBuildActions (
4918- Compilation &C, llvm::opt::DerivedArgList &Args, const InputList &Inputs,
4919- ActionList &Actions) const {
4920- Diags.Report (diag::remark_performing_driver_managed_module_build);
4921- return ;
4922- }
4923-
49244714// / Returns the canonical name for the offloading architecture when using a HIP
49254715// / or CUDA architecture.
49264716static StringRef getCanonicalArchString (Compilation &C,
0 commit comments