Driver: Add types::getNumCompilationPhases, getCompilationPhase to

provide information about what steps should be done for a particular
file type.

llvm-svn: 66881
This commit is contained in:
Daniel Dunbar 2009-03-13 11:28:30 +00:00
parent 58cac7ca68
commit e71b9640ad
2 changed files with 54 additions and 0 deletions

View File

@ -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

View File

@ -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;
}