Hello Daniel, Do you have time to comment on this patch?
Thanks, Matthew Curtis. On 3/1/2013 4:17 PM, Matthew Curtis wrote:
There is now a single function to get the list of phases for a given output Type. No functionality change intended. Thanks, Matthew Curtis _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
-- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
>From 882ec41b53ccb876f0ff39f5c94a6efd0bb311ce Mon Sep 17 00:00:00 2001 From: Matthew Curtis <[email protected]> Date: Fri, 1 Mar 2013 15:08:26 -0600 Subject: [PATCH] Minor refactor of how we get compilation phases. There is now a single function to get the list of phases for a given output Type. No functionality change intended. --- include/clang/Driver/Phases.h | 7 ++++ include/clang/Driver/Types.h | 12 +++---- lib/Driver/Driver.cpp | 16 +++++----- lib/Driver/Types.cpp | 62 ++++++++++++++-------------------------- 4 files changed, 42 insertions(+), 55 deletions(-) diff --git a/include/clang/Driver/Phases.h b/include/clang/Driver/Phases.h index a0c42ea..27e69ba 100644 --- a/include/clang/Driver/Phases.h +++ b/include/clang/Driver/Phases.h @@ -10,6 +10,8 @@ #ifndef CLANG_DRIVER_PHASES_H_ #define CLANG_DRIVER_PHASES_H_ +#include "llvm/ADT/SmallVector.h" + namespace clang { namespace driver { namespace phases { @@ -23,6 +25,11 @@ namespace phases { Link }; + enum { + MaxNumberOfPhases = Link + 1 + }; +typedef llvm::SmallVector<ID, MaxNumberOfPhases> PhaseList; + const char *getPhaseName(ID Id); } // end namespace phases diff --git a/include/clang/Driver/Types.h b/include/clang/Driver/Types.h index d28ca88..102e8f2 100644 --- a/include/clang/Driver/Types.h +++ b/include/clang/Driver/Types.h @@ -73,13 +73,11 @@ 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 \p N th compilation phase to - /// be done for this type. - phases::ID getCompilationPhase(ID Id, unsigned N); + /// getCompilationPhase - Get the list of compilation phases to be done for + /// this type. The 'P' must be able to accomodate at least + /// phases::MaxLengthOfPhaseList phases and upon return is terminated with + /// phases::Invalid. + void getCompilationPhases(ID Id, phases::PhaseList *Phases); /// lookupCXXTypeForCType - Lookup CXX input type that corresponds to given /// C type (used for clang++ emulation of g++ behaviour) diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 8229129..850f92e 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -1038,17 +1038,16 @@ void Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args, // Construct the actions to perform. ActionList LinkerInputs; ActionList SplitInputs; - unsigned NumSteps = 0; + phases::PhaseList PL; for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { types::ID InputType = Inputs[i].first; const Arg *InputArg = Inputs[i].second; - NumSteps = types::getNumCompilationPhases(InputType); - assert(NumSteps && "Invalid number of steps!"); + types::getCompilationPhases(InputType, &PL); // If the first step comes after the final phase we are doing as part of // this compilation, warn the user about it. - phases::ID InitialPhase = types::getCompilationPhase(InputType, 0); + phases::ID InitialPhase = PL[0]; if (InitialPhase > FinalPhase) { // Claim here to avoid the more general unused warning. InputArg->claim(); @@ -1083,8 +1082,9 @@ void Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args, // Build the pipeline for this file. OwningPtr<Action> Current(new InputAction(*InputArg, InputType)); - for (unsigned i = 0; i != NumSteps; ++i) { - phases::ID Phase = types::getCompilationPhase(InputType, i); + for (phases::PhaseList::iterator i = PL.begin(), e = PL.end(); + i != e; ++i) { + phases::ID Phase = *i; // We are done if this step is past what the user requested. if (Phase > FinalPhase) @@ -1092,7 +1092,7 @@ void Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args, // Queue linker inputs. if (Phase == phases::Link) { - assert(i + 1 == NumSteps && "linking must be final compilation step."); + assert((i + 1) == e && "linking must be final compilation step."); LinkerInputs.push_back(Current.take()); break; } @@ -1120,7 +1120,7 @@ void Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args, // If we are linking, claim any options which are obviously only used for // compilation. - if (FinalPhase == phases::Link && (NumSteps == 1)) + if (FinalPhase == phases::Link && PL.size() == 1) Args.ClaimAllArgs(options::OPT_CompileOnly_Group); } diff --git a/lib/Driver/Types.cpp b/lib/Driver/Types.cpp index 88574fc..f25cc72 100644 --- a/lib/Driver/Types.cpp +++ b/lib/Driver/Types.cpp @@ -179,47 +179,29 @@ types::ID types::lookupTypeForTypeSpecifier(const char *Name) { } // 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; +void types::getCompilationPhases(ID Id, phases::PhaseList *P) +{ + P->clear(); + if (Id != TY_Object) { + if (getPreprocessedType(Id) != TY_INVALID) { + P->push_back(phases::Preprocess); + } + + if (onlyPrecompileType(Id)) { + P->push_back(phases::Precompile); + } else { + if (!onlyAssembleType(Id)) { + P->push_back(phases::Compile); + } + P->push_back(phases::Assemble); + } } - - 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; + if (!onlyPrecompileType(Id)) { + P->push_back(phases::Link); + } + assert(0 < P->size() && "Not enough phases in list"); + assert(P->size() <= phases::MaxNumberOfPhases && "Too many phases in list"); + return; } ID types::lookupCXXTypeForCType(ID Id) { -- 1.7.8.3
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
