[clang] Remove duplication in types::getCompilationPhases()

Call Driver::getFinalPhase() instead of duplicating it.

https://reviews.llvm.org/D65993 added the duplication, then
02e35832c3 maded it more obviously a copy of getFinalPhase().

The only difference is that getCompilationPhases() used to use
LastPhase / IfsMerge where getFinalPhase() used Link. Adapt
getFinalPhase() to return IfsMerge when needed.

No intentional behavior change.

Differential Revision: https://reviews.llvm.org/D110770
This commit is contained in:
Nico Weber 2021-09-29 15:19:36 -04:00
parent 6714e1ce3b
commit fa32fd3bf7
5 changed files with 15 additions and 52 deletions

View file

@ -253,6 +253,14 @@ public:
/// 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 @@ private:
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,

View file

@ -22,11 +22,10 @@ namespace phases {
Assemble,
Link,
IfsMerge,
LastPhase = IfsMerge,
};
enum {
MaxNumberOfPhases = LastPhase + 1
MaxNumberOfPhases = IfsMerge + 1
};
const char *getPhaseName(ID Id);

View file

@ -111,7 +111,7 @@ namespace types {
/// getCompilationPhases - Get the list of compilation phases ('Phases') to be
/// done for type 'Id' up until including LastPhase.
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases>
getCompilationPhases(ID Id, phases::ID LastPhase = phases::LastPhase);
getCompilationPhases(ID Id, phases::ID LastPhase = phases::IfsMerge);
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases>
getCompilationPhases(const clang::driver::Driver &Driver,
llvm::opt::DerivedArgList &DAL, ID Id);

View file

@ -304,6 +304,9 @@ phases::ID Driver::getFinalPhase(const DerivedArgList &DAL,
} 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 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
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;

View file

@ -362,46 +362,7 @@ types::getCompilationPhases(ID Id, phases::ID LastPhase) {
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases>
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) {