[Driver] Simplify code. NFCI.

This commit is contained in:
Benjamin Kramer 2020-06-07 20:12:52 +02:00
parent 96458fc510
commit 02e35832c3
4 changed files with 32 additions and 57 deletions

View file

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

View file

@ -45,9 +45,6 @@ namespace types {
/// temp file of this type, or null if unspecified.
const char *getTypeTempSuffix(ID Id, bool CLMode = false);
/// onlyAssembleType - Should this type only be assembled.
bool onlyAssembleType(ID Id);
/// onlyPrecompileType - Should this type only be precompiled.
bool onlyPrecompileType(ID Id);
@ -101,13 +98,12 @@ namespace types {
ID lookupTypeForTypeSpecifier(const char *Name);
/// getCompilationPhases - Get the list of compilation phases ('Phases') to be
/// done for type 'Id'.
void getCompilationPhases(
ID Id,
llvm::SmallVectorImpl<phases::ID> &Phases);
void getCompilationPhases(const clang::driver::Driver &Driver,
llvm::opt::DerivedArgList &DAL, ID Id,
llvm::SmallVectorImpl<phases::ID> &Phases);
/// done for type 'Id' up until including LastPhase.
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases>
getCompilationPhases(ID Id, phases::ID LastPhase = phases::LastPhase);
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases>
getCompilationPhases(const clang::driver::Driver &Driver,
llvm::opt::DerivedArgList &DAL, ID Id);
/// lookupCXXTypeForCType - Lookup CXX input type that corresponds to given
/// C type (used for clang++ emulation of g++ behaviour)

View file

@ -3276,8 +3276,7 @@ void Driver::handleArguments(Compilation &C, DerivedArgList &Args,
types::ID InputType = I.first;
const Arg *InputArg = I.second;
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PL;
types::getCompilationPhases(InputType, PL);
auto PL = types::getCompilationPhases(InputType);
LastPLSize = PL.size();
// If the first step comes after the final phase we are doing as part of
@ -3322,11 +3321,9 @@ void Driver::handleArguments(Compilation &C, DerivedArgList &Args,
// Add a separate precompile phase for the compile phase.
if (FinalPhase >= phases::Compile) {
const types::ID HeaderType = lookupHeaderTypeForSourceType(InputType);
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PCHPL;
types::getCompilationPhases(HeaderType, PCHPL);
// Build the pipeline for the pch file.
Action *ClangClPch = C.MakeAction<InputAction>(*InputArg, HeaderType);
for (phases::ID Phase : PCHPL)
for (phases::ID Phase : types::getCompilationPhases(HeaderType))
ClangClPch = ConstructPhaseAction(C, Args, Phase, ClangClPch);
assert(ClangClPch);
Actions.push_back(ClangClPch);
@ -3409,13 +3406,11 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
types::ID InputType = I.first;
const Arg *InputArg = I.second;
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PL;
types::getCompilationPhases(*this, Args, InputType, PL);
auto PL = types::getCompilationPhases(*this, Args, InputType);
if (PL.empty())
continue;
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> FullPL;
types::getCompilationPhases(InputType, FullPL);
auto FullPL = types::getCompilationPhases(InputType);
// Build the pipeline for this file.
Action *Current = C.MakeAction<InputAction>(*InputArg, InputType);
@ -3509,15 +3504,9 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
C.MakeAction<IfsMergeJobAction>(MergerInputs, types::TY_Image));
if (Args.hasArg(options::OPT_emit_interface_stubs)) {
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PhaseList;
if (Args.hasArg(options::OPT_c)) {
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> CompilePhaseList;
types::getCompilationPhases(types::TY_IFS_CPP, CompilePhaseList);
llvm::copy_if(CompilePhaseList, std::back_inserter(PhaseList),
[&](phases::ID Phase) { return Phase <= phases::Compile; });
} else {
types::getCompilationPhases(types::TY_IFS_CPP, PhaseList);
}
auto PhaseList = types::getCompilationPhases(
types::TY_IFS_CPP,
Args.hasArg(options::OPT_c) ? phases::Compile : phases::LastPhase);
ActionList MergerInputs;

View file

@ -90,12 +90,6 @@ const char *types::getTypeTempSuffix(ID Id, bool CLMode) {
return getInfo(Id).TempSuffix;
}
bool types::onlyAssembleType(ID Id) {
return getInfo(Id).Phases.contains(phases::Assemble) &&
!getInfo(Id).Phases.contains(phases::Compile) &&
!getInfo(Id).Phases.contains(phases::Backend);
}
bool types::onlyPrecompileType(ID Id) {
return getInfo(Id).Phases.contains(phases::Precompile) &&
!isPreprocessedModuleType(Id);
@ -311,23 +305,21 @@ types::ID types::lookupTypeForTypeSpecifier(const char *Name) {
return TY_INVALID;
}
// FIXME: Why don't we just put this list in the defs file, eh.
// FIXME: The list is now in Types.def but for now this function will verify
// the old behavior and a subsequent change will delete most of the body.
void types::getCompilationPhases(ID Id, llvm::SmallVectorImpl<phases::ID> &P) {
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases>
types::getCompilationPhases(ID Id, phases::ID LastPhase) {
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> P;
const auto &Info = getInfo(Id);
for (int I = 0; I != phases::MaxNumberOfPhases; ++I)
for (int I = 0; I <= LastPhase; ++I)
if (Info.Phases.contains(static_cast<phases::ID>(I)))
P.push_back(static_cast<phases::ID>(I));
assert(0 < P.size() && "Not enough phases in list");
assert(P.size() <= phases::MaxNumberOfPhases && "Too many phases in list");
return P;
}
void types::getCompilationPhases(const clang::driver::Driver &Driver,
llvm::opt::DerivedArgList &DAL, ID Id,
llvm::SmallVectorImpl<phases::ID> &P) {
llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PhaseList;
types::getCompilationPhases(Id, PhaseList);
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.
@ -336,14 +328,12 @@ void types::getCompilationPhases(const clang::driver::Driver &Driver,
DAL.getLastArg(options::OPT__SLASH_EP) ||
DAL.getLastArg(options::OPT_M, options::OPT_MM) ||
DAL.getLastArg(options::OPT__SLASH_P))
llvm::copy_if(PhaseList, std::back_inserter(P),
[](phases::ID Phase) { return Phase <= phases::Preprocess; });
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))
llvm::copy_if(PhaseList, std::back_inserter(P),
[](phases::ID Phase) { return Phase <= phases::Precompile; });
LastPhase = phases::Precompile;
// -{fsyntax-only,-analyze,emit-ast} only run up to the compiler.
else if (DAL.getLastArg(options::OPT_fsyntax_only) ||
@ -355,21 +345,20 @@ void types::getCompilationPhases(const clang::driver::Driver &Driver,
DAL.getLastArg(options::OPT__migrate) ||
DAL.getLastArg(options::OPT__analyze) ||
DAL.getLastArg(options::OPT_emit_ast))
llvm::copy_if(PhaseList, std::back_inserter(P),
[](phases::ID Phase) { return Phase <= phases::Compile; });
LastPhase = phases::Compile;
else if (DAL.getLastArg(options::OPT_S) ||
DAL.getLastArg(options::OPT_emit_llvm))
llvm::copy_if(PhaseList, std::back_inserter(P),
[](phases::ID Phase) { return Phase <= phases::Backend; });
LastPhase = phases::Backend;
else if (DAL.getLastArg(options::OPT_c))
llvm::copy_if(PhaseList, std::back_inserter(P),
[](phases::ID Phase) { return Phase <= phases::Assemble; });
LastPhase = phases::Assemble;
// Generally means, do every phase until Link.
else
P = PhaseList;
LastPhase = phases::LastPhase;
return types::getCompilationPhases(Id, LastPhase);
}
ID types::lookupCXXTypeForCType(ID Id) {