/// 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);
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)
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
// 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);
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);
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;
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);
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.
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) ||
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) {