diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -253,6 +253,14 @@ /// or when using the -gen-reproducer driver flag. unsigned GenReproducer : 1; + // getFinalPhase - Determine which compilation mode we are in and record + // which option we used to determine the final phase. + // TODO: Much of what getFinalPhase returns are not actually true compiler + // modes. Fold this functionality into Types::getCompilationPhases and + // handleArguments. + phases::ID getFinalPhase(const llvm::opt::DerivedArgList &DAL, + llvm::opt::Arg **FinalPhaseArg = nullptr) const; + private: /// Certain options suppress the 'no input files' warning. unsigned SuppressMissingInputWarning : 1; @@ -270,14 +278,6 @@ llvm::opt::DerivedArgList * TranslateInputArgs(const llvm::opt::InputArgList &Args) const; - // getFinalPhase - Determine which compilation mode we are in and record - // which option we used to determine the final phase. - // TODO: Much of what getFinalPhase returns are not actually true compiler - // modes. Fold this functionality into Types::getCompilationPhases and - // handleArguments. - phases::ID getFinalPhase(const llvm::opt::DerivedArgList &DAL, - llvm::opt::Arg **FinalPhaseArg = nullptr) const; - // handleArguments - All code related to claiming and printing diagnostics // related to arguments to the driver are done here. void handleArguments(Compilation &C, llvm::opt::DerivedArgList &Args, diff --git a/clang/include/clang/Driver/Phases.h b/clang/include/clang/Driver/Phases.h --- a/clang/include/clang/Driver/Phases.h +++ b/clang/include/clang/Driver/Phases.h @@ -22,11 +22,10 @@ Assemble, Link, IfsMerge, - LastPhase = IfsMerge, }; enum { - MaxNumberOfPhases = LastPhase + 1 + MaxNumberOfPhases = IfsMerge + 1 }; const char *getPhaseName(ID Id); diff --git a/clang/include/clang/Driver/Types.h b/clang/include/clang/Driver/Types.h --- a/clang/include/clang/Driver/Types.h +++ b/clang/include/clang/Driver/Types.h @@ -111,7 +111,7 @@ /// getCompilationPhases - Get the list of compilation phases ('Phases') to be /// done for type 'Id' up until including LastPhase. llvm::SmallVector - getCompilationPhases(ID Id, phases::ID LastPhase = phases::LastPhase); + getCompilationPhases(ID Id, phases::ID LastPhase = phases::IfsMerge); llvm::SmallVector getCompilationPhases(const clang::driver::Driver &Driver, llvm::opt::DerivedArgList &DAL, ID Id); diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -304,6 +304,9 @@ } else if ((PhaseArg = DAL.getLastArg(options::OPT_c))) { FinalPhase = phases::Assemble; + } else if ((PhaseArg = DAL.getLastArg(options::OPT_emit_interface_stubs))) { + FinalPhase = phases::IfsMerge; + // Otherwise do everything. } else FinalPhase = phases::Link; @@ -3841,7 +3844,7 @@ if (Args.hasArg(options::OPT_emit_interface_stubs)) { auto PhaseList = types::getCompilationPhases( types::TY_IFS_CPP, - Args.hasArg(options::OPT_c) ? phases::Compile : phases::LastPhase); + Args.hasArg(options::OPT_c) ? phases::Compile : phases::IfsMerge); ActionList MergerInputs; diff --git a/clang/lib/Driver/Types.cpp b/clang/lib/Driver/Types.cpp --- a/clang/lib/Driver/Types.cpp +++ b/clang/lib/Driver/Types.cpp @@ -362,46 +362,7 @@ llvm::SmallVector types::getCompilationPhases(const clang::driver::Driver &Driver, llvm::opt::DerivedArgList &DAL, ID Id) { - phases::ID LastPhase; - - // Filter to compiler mode. When the compiler is run as a preprocessor then - // compilation is not an option. - // -S runs the compiler in Assembly listing mode. - if (Driver.CCCIsCPP() || DAL.getLastArg(options::OPT_E) || - DAL.getLastArg(options::OPT__SLASH_EP) || - DAL.getLastArg(options::OPT_M, options::OPT_MM) || - DAL.getLastArg(options::OPT__SLASH_P)) - LastPhase = phases::Preprocess; - - // --precompile only runs up to precompilation. - // This is a clang extension and is not compatible with GCC. - else if (DAL.getLastArg(options::OPT__precompile)) - LastPhase = phases::Precompile; - - // -{fsyntax-only,-analyze,emit-ast} only run up to the compiler. - else if (DAL.getLastArg(options::OPT_fsyntax_only) || - DAL.getLastArg(options::OPT_print_supported_cpus) || - DAL.getLastArg(options::OPT_module_file_info) || - DAL.getLastArg(options::OPT_verify_pch) || - DAL.getLastArg(options::OPT_rewrite_objc) || - DAL.getLastArg(options::OPT_rewrite_legacy_objc) || - DAL.getLastArg(options::OPT__migrate) || - DAL.getLastArg(options::OPT__analyze) || - DAL.getLastArg(options::OPT_emit_ast)) - LastPhase = phases::Compile; - - else if (DAL.getLastArg(options::OPT_S) || - DAL.getLastArg(options::OPT_emit_llvm)) - LastPhase = phases::Backend; - - else if (DAL.getLastArg(options::OPT_c)) - LastPhase = phases::Assemble; - - // Generally means, do every phase until Link. - else - LastPhase = phases::LastPhase; - - return types::getCompilationPhases(Id, LastPhase); + return types::getCompilationPhases(Id, Driver.getFinalPhase(DAL)); } ID types::lookupCXXTypeForCType(ID Id) {