diff --git a/clang/include/clang/Driver/Types.h b/clang/include/clang/Driver/Types.h index f9f7601c7cbb..9d2313c62bcb 100644 --- a/clang/include/clang/Driver/Types.h +++ b/clang/include/clang/Driver/Types.h @@ -10,6 +10,8 @@ #ifndef CLANG_DRIVER_TYPES_H_ #define CLANG_DRIVER_TYPES_H_ +#include "clang/Driver/Phases.h" + namespace clang { namespace driver { namespace types { @@ -62,6 +64,14 @@ namespace types { /// specified type name. ID lookupTypeForTypeSpecifier(const char *Name); + /// getNumCompilationPhases - Return the complete number of phases + /// to be done for this type. + unsigned getNumCompilationPhases(ID Id); + + /// getCompilationPhase - Return the \args N th compilation phase to + /// be done for this type. + phases::ID getCompilationPhase(ID Id, unsigned N); + } // end namespace types } // end namespace driver } // end namespace clang diff --git a/clang/lib/Driver/Types.cpp b/clang/lib/Driver/Types.cpp index 88389c9ce3a8..96d76dd4d606 100644 --- a/clang/lib/Driver/Types.cpp +++ b/clang/lib/Driver/Types.cpp @@ -128,3 +128,47 @@ types::ID types::lookupTypeForTypeSpecifier(const char *Name) { return TY_INVALID; } + +// FIXME: Why don't we just put this list in the defs file, eh. + +unsigned types::getNumCompilationPhases(ID Id) { + if (Id == TY_Object) + return 1; + + unsigned N = 0; + if (getPreprocessedType(Id) != TY_INVALID) + N += 1; + + if (onlyAssembleType(Id)) + return N + 2; // assemble, link + if (onlyPrecompileType(Id)) + return N + 1; // precompile + + return N + 3; // compile, assemble, link +} + +phases::ID types::getCompilationPhase(ID Id, unsigned N) { + assert(N < getNumCompilationPhases(Id) && "Invalid index."); + + if (Id == TY_Object) + return phases::Link; + + if (getPreprocessedType(Id) != TY_INVALID) { + if (N == 0) + return phases::Preprocess; + --N; + } + + if (onlyAssembleType(Id)) + return N == 0 ? phases::Assemble : phases::Link; + + if (onlyPrecompileType(Id)) + return phases::Precompile; + + if (N == 0) + return phases::Compile; + if (N == 1) + return phases::Assemble; + + return phases::Link; +}