Switch all request infrastructure to SWIFT_REQUEST

Formally define the Zones in the TypeID header.  This is not its final
resting place.
This commit is contained in:
Robert Widmann
2019-08-27 16:59:36 -07:00
parent 5ec344b5b9
commit a19a70e5c9
19 changed files with 77 additions and 67 deletions

View File

@@ -36,10 +36,8 @@ class Type;
struct TypePair;
enum class AncestryFlags : uint8_t;
#define SWIFT_AST_TYPEID_ZONE 1
// Define the AST type zone (zone 1)
#define SWIFT_TYPEID_ZONE SWIFT_AST_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE AST
#define SWIFT_TYPEID_HEADER "swift/AST/ASTTypeIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"

View File

@@ -97,24 +97,21 @@ public:
void cacheResult(DefaultAndMax value) const;
};
/// The zone number for access-control requests.
#define SWIFT_ACCESS_REQUESTS_TYPEID_ZONE 11
#define SWIFT_TYPEID_ZONE SWIFT_ACCESS_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE AccessControl
#define SWIFT_TYPEID_HEADER "swift/AST/AccessTypeIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
#undef SWIFT_TYPEID_HEADER
// Set up reporting of evaluated requests.
#define SWIFT_TYPEID(RequestType) \
#define SWIFT_REQUEST(Zone, RequestType) \
template<> \
inline void reportEvaluatedRequest(UnifiedStatsReporter &stats, \
const RequestType &request) { \
++stats.getFrontendCounters().RequestType; \
}
#include "swift/AST/AccessTypeIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
} // end namespace swift

View File

@@ -249,7 +249,7 @@ public:
///
/// These functions will be called to evaluate any requests within that
/// zone.
void registerRequestFunctions(uint8_t zoneID,
void registerRequestFunctions(Zone zone,
ArrayRef<AbstractRequestFunction *> functions);
/// Evaluate the given request and produce its result,

View File

@@ -254,10 +254,7 @@ public:
void cacheResult(DestructorDecl *value) const;
};
/// The zone number for name-lookup requests.
#define SWIFT_NAME_LOOKUP_REQUESTS_TYPEID_ZONE 9
#define SWIFT_TYPEID_ZONE SWIFT_NAME_LOOKUP_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE NameLookup
#define SWIFT_TYPEID_HEADER "swift/AST/NameLookupTypeIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
@@ -268,14 +265,14 @@ template<typename Request>
void reportEvaluatedRequest(UnifiedStatsReporter &stats,
const Request &request);
#define SWIFT_TYPEID(RequestType) \
#define SWIFT_REQUEST(Zone, RequestType) \
template<> \
inline void reportEvaluatedRequest(UnifiedStatsReporter &stats, \
const RequestType &request) { \
++stats.getFrontendCounters().RequestType; \
}
#include "swift/AST/NameLookupTypeIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
} // end namespace swift

View File

@@ -1150,24 +1150,21 @@ inline bool AnyValue::Holder<Type>::equals(const HolderBase &other) const {
void simple_display(llvm::raw_ostream &out, Type value);
/// The zone number for the type checker.
#define SWIFT_TYPE_CHECKER_REQUESTS_TYPEID_ZONE 10
#define SWIFT_TYPEID_ZONE SWIFT_TYPE_CHECKER_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE TypeChecker
#define SWIFT_TYPEID_HEADER "swift/AST/TypeCheckerTypeIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
#undef SWIFT_TYPEID_HEADER
// Set up reporting of evaluated requests.
#define SWIFT_TYPEID(RequestType) \
#define SWIFT_REQUEST(Zone, RequestType) \
template<> \
inline void reportEvaluatedRequest(UnifiedStatsReporter &stats, \
const RequestType &request) { \
++stats.getFrontendCounters().RequestType; \
}
#include "swift/AST/TypeCheckerTypeIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
} // end namespace swift

View File

@@ -33,9 +33,10 @@
// Define a TypeID where the type name and internal name are the same.
#define SWIFT_TYPEID(Type) SWIFT_TYPEID_NAMED(Type, Type)
#define SWIFT_REQUEST(Zone, Type) SWIFT_TYPEID_NAMED(Type, Type)
// First pass: put all of the names into an enum so we get values for them.
template<> struct TypeIDZoneTypes<SWIFT_TYPEID_ZONE> {
template<> struct TypeIDZoneTypes<Zone::SWIFT_TYPEID_ZONE> {
enum Types : uint8_t {
#define SWIFT_TYPEID_NAMED(Type, Name) Name,
#define SWIFT_TYPEID_TEMPLATE1_NAMED(Template, Name, Param1, Arg1) Name,
@@ -48,9 +49,10 @@ template<> struct TypeIDZoneTypes<SWIFT_TYPEID_ZONE> {
// Second pass: create specializations of TypeID for these types.
#define SWIFT_TYPEID_NAMED(Type, Name) \
template<> struct TypeID<Type> { \
static const uint8_t zoneID = SWIFT_TYPEID_ZONE; \
static const uint8_t zoneID = \
static_cast<uint8_t>(Zone::SWIFT_TYPEID_ZONE); \
static const uint8_t localID = \
TypeIDZoneTypes<SWIFT_TYPEID_ZONE>::Name; \
TypeIDZoneTypes<Zone::SWIFT_TYPEID_ZONE>::Name; \
\
static const uint64_t value = formTypeID(zoneID, localID); \
\
@@ -61,8 +63,8 @@ template<> struct TypeID<Type> { \
template<Param1> struct TypeID<Template<Arg1>> { \
private: \
static const uint64_t templateID = \
formTypeID(SWIFT_TYPEID_ZONE, \
TypeIDZoneTypes<SWIFT_TYPEID_ZONE>::Name); \
formTypeID(static_cast<uint8_t>(Zone::SWIFT_TYPEID_ZONE), \
TypeIDZoneTypes<Zone::SWIFT_TYPEID_ZONE>::Name); \
\
public: \
static const uint64_t value = \
@@ -76,6 +78,9 @@ public: \
template<Param1> const uint64_t TypeID<Template<Arg1>>::value;
#include SWIFT_TYPEID_HEADER
#undef SWIFT_REQUEST
#undef SWIFT_TYPEID_NAMED
#undef SWIFT_TYPEID_TEMPLATE1_NAMED

View File

@@ -33,6 +33,7 @@
#endif
// Define a TypeID where the type name and internal name are the same.
#define SWIFT_REQUEST(Zone, Type) SWIFT_TYPEID_NAMED(Type, Type)
#define SWIFT_TYPEID(Type) SWIFT_TYPEID_NAMED(Type, Type)
// Out-of-line definitions.
@@ -43,6 +44,8 @@
#include SWIFT_TYPEID_HEADER
#undef SWIFT_REQUEST
#undef SWIFT_TYPEID_NAMED
#undef SWIFT_TYPEID_TEMPLATE1_NAMED

View File

@@ -27,6 +27,22 @@
namespace swift {
enum class Zone : uint8_t {
C = 0,
AST = 1,
AccessControl = 11,
IDETypes = 136,
IDE = 137,
IDETypeChecking = 97,
NameLookup = 9,
TypeChecker = 10,
// N.B. This is not a formal zone and exists solely to support the unit tests.
ArithmeticEvaluator = 255,
};
static_assert(std::is_same<std::underlying_type<Zone>::type, uint8_t>::value,
"underlying type is no longer uint8_t!");
/// Form a unique 64-bit integer value describing the type `T`.
///
/// This template needs to be specialized for every type that can
@@ -37,7 +53,7 @@ struct TypeID;
/// Template whose specializations provide the set of type IDs within a
/// given zone.
template<uint8_t Zone> struct TypeIDZoneTypes;
template<Zone Zone> struct TypeIDZoneTypes;
/// Form a type ID given a zone and type value.
constexpr uint64_t formTypeID(uint8_t zone, uint8_t type) {
@@ -45,7 +61,7 @@ constexpr uint64_t formTypeID(uint8_t zone, uint8_t type) {
}
// Define the C type zone (zone 0).
#define SWIFT_TYPEID_ZONE 0
#define SWIFT_TYPEID_ZONE C
#define SWIFT_TYPEID_HEADER "swift/Basic/CTypeIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"

View File

@@ -282,22 +282,21 @@ public:
};
/// The zone number for the IDE.
#define SWIFT_IDE_REQUESTS_TYPEID_ZONE 137
#define SWIFT_TYPEID_ZONE SWIFT_IDE_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE IDE
#define SWIFT_TYPEID_HEADER "swift/IDE/IDERequestIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
#undef SWIFT_TYPEID_HEADER
// Set up reporting of evaluated requests.
#define SWIFT_TYPEID(RequestType) \
#define SWIFT_REQUEST(Zone, RequestType) \
template<> \
inline void reportEvaluatedRequest(UnifiedStatsReporter &stats, \
const RequestType &request) { \
++stats.getFrontendCounters().RequestType; \
}
#include "swift/IDE/IDERequestIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
} // end namespace swift

View File

@@ -20,8 +20,7 @@
#include "swift/Basic/TypeID.h"
namespace swift {
#define SWIFT_IDE_TYPEID_ZONE 136
#define SWIFT_TYPEID_ZONE SWIFT_IDE_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE IDETypes
#define SWIFT_TYPEID_HEADER "swift/IDE/IDETypeIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"

View File

@@ -258,22 +258,21 @@ public:
};
/// The zone number for the IDE.
#define SWIFT_IDE_TYPE_CHECK_REQUESTS_TYPEID_ZONE 97
#define SWIFT_TYPEID_ZONE SWIFT_IDE_TYPE_CHECK_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE IDETypeChecking
#define SWIFT_TYPEID_HEADER "swift/Sema/IDETypeCheckingRequestIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
#undef SWIFT_TYPEID_HEADER
// Set up reporting of evaluated requests.
#define SWIFT_TYPEID(RequestType) \
#define SWIFT_REQUEST(Zone, RequestType) \
template<> \
inline void reportEvaluatedRequest(UnifiedStatsReporter &stats, \
const RequestType &request) { \
++stats.getFrontendCounters().RequestType; \
}
#include "swift/Sema/IDETypeCheckingRequestIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
} // end namespace swift

View File

@@ -25,7 +25,7 @@ using namespace swift;
namespace swift {
// Implement the access-control type zone.
#define SWIFT_TYPEID_ZONE SWIFT_ACCESSS_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE AccessControl
#define SWIFT_TYPEID_HEADER "swift/AST/AccessTypeIDZone.def"
#include "swift/Basic/ImplementTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
@@ -321,13 +321,13 @@ DefaultAndMaxAccessLevelRequest::cacheResult(
// Define request evaluation functions for each of the access requests.
static AbstractRequestFunction *accessRequestFunctions[] = {
#define SWIFT_TYPEID(Name) \
#define SWIFT_REQUEST(Zone, Name) \
reinterpret_cast<AbstractRequestFunction *>(&Name::evaluateRequest),
#include "swift/AST/AccessTypeIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
};
void swift::registerAccessRequestFunctions(Evaluator &evaluator) {
evaluator.registerRequestFunctions(SWIFT_ACCESS_REQUESTS_TYPEID_ZONE,
evaluator.registerRequestFunctions(Zone::AccessControl,
accessRequestFunctions);
}

View File

@@ -50,8 +50,9 @@ Evaluator::getAbstractRequestFunction(uint8_t zoneID, uint8_t requestID) const {
}
void Evaluator::registerRequestFunctions(
uint8_t zoneID,
Zone zone,
ArrayRef<AbstractRequestFunction *> functions) {
uint8_t zoneID = static_cast<uint8_t>(zone);
#ifndef NDEBUG
for (const auto &zone : requestFunctionsByZone) {
assert(zone.first != zoneID);

View File

@@ -21,7 +21,7 @@ using namespace swift;
namespace swift {
// Implement the name lookup type zone.
#define SWIFT_TYPEID_ZONE SWIFT_NAME_LOOKUP_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE NameLookup
#define SWIFT_TYPEID_HEADER "swift/AST/NameLookupTypeIDZone.def"
#include "swift/Basic/ImplementTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
@@ -113,13 +113,13 @@ void GetDestructorRequest::cacheResult(DestructorDecl *value) const {
// Define request evaluation functions for each of the name lookup requests.
static AbstractRequestFunction *nameLookupRequestFunctions[] = {
#define SWIFT_TYPEID(Name) \
#define SWIFT_REQUEST(Zone, Name) \
reinterpret_cast<AbstractRequestFunction *>(&Name::evaluateRequest),
#include "swift/AST/NameLookupTypeIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
};
void swift::registerNameLookupRequestFunctions(Evaluator &evaluator) {
evaluator.registerRequestFunctions(SWIFT_NAME_LOOKUP_REQUESTS_TYPEID_ZONE,
evaluator.registerRequestFunctions(Zone::NameLookup,
nameLookupRequestFunctions);
}

View File

@@ -23,7 +23,7 @@ using namespace swift;
namespace swift {
// Implement the type checker type zone (zone 10).
#define SWIFT_TYPEID_ZONE SWIFT_TYPE_CHECKER_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE TypeChecker
#define SWIFT_TYPEID_HEADER "swift/AST/TypeCheckerTypeIDZone.def"
#include "swift/Basic/ImplementTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE

View File

@@ -29,7 +29,7 @@ using namespace swift::ide;
namespace swift {
// Implement the IDE type zone.
#define SWIFT_TYPEID_ZONE SWIFT_IDE_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE IDE
#define SWIFT_TYPEID_HEADER "swift/IDE/IDERequestIDZone.def"
#include "swift/Basic/ImplementTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
@@ -38,14 +38,14 @@ namespace swift {
// Define request evaluation functions for each of the IDE requests.
static AbstractRequestFunction *ideRequestFunctions[] = {
#define SWIFT_TYPEID(Name) \
#define SWIFT_REQUEST(Zone, Name) \
reinterpret_cast<AbstractRequestFunction *>(&Name::evaluateRequest),
#include "swift/IDE/IDERequestIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
};
void swift::registerIDERequestFunctions(Evaluator &evaluator) {
evaluator.registerRequestFunctions(SWIFT_IDE_REQUESTS_TYPEID_ZONE,
evaluator.registerRequestFunctions(Zone::IDE,
ideRequestFunctions);
registerIDETypeCheckRequestFunctions(evaluator);
}

View File

@@ -25,7 +25,7 @@ using namespace swift;
namespace swift {
// Implement the IDE type zone.
#define SWIFT_TYPEID_ZONE SWIFT_IDE_TYPE_CHECK_REQUESTS_TYPEID_ZONE
#define SWIFT_TYPEID_ZONE IDETypeChecking
#define SWIFT_TYPEID_HEADER "swift/Sema/IDETypeCheckingRequestIDZone.def"
#include "swift/Basic/ImplementTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
@@ -34,14 +34,14 @@ namespace swift {
// Define request evaluation functions for each of the IDE type check requests.
static AbstractRequestFunction *ideTypeCheckRequestFunctions[] = {
#define SWIFT_TYPEID(Name) \
#define SWIFT_REQUEST(Zone, Name) \
reinterpret_cast<AbstractRequestFunction *>(&Name::evaluateRequest),
#include "swift/Sema/IDETypeCheckingRequestIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
};
void swift::registerIDETypeCheckRequestFunctions(Evaluator &evaluator) {
evaluator.registerRequestFunctions(SWIFT_IDE_TYPE_CHECK_REQUESTS_TYPEID_ZONE,
evaluator.registerRequestFunctions(Zone::IDETypeChecking,
ideTypeCheckRequestFunctions);
}

View File

@@ -234,13 +234,13 @@ FunctionBuilderTypeRequest::evaluate(Evaluator &evaluator,
// Define request evaluation functions for each of the type checker requests.
static AbstractRequestFunction *typeCheckerRequestFunctions[] = {
#define SWIFT_TYPEID(Name) \
#define SWIFT_REQUEST(Zone, Name) \
reinterpret_cast<AbstractRequestFunction *>(&Name::evaluateRequest),
#include "swift/AST/TypeCheckerTypeIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
};
void swift::registerTypeCheckerRequestFunctions(Evaluator &evaluator) {
evaluator.registerRequestFunctions(SWIFT_TYPE_CHECKER_REQUESTS_TYPEID_ZONE,
evaluator.registerRequestFunctions(Zone::TypeChecker,
typeCheckerRequestFunctions);
}

View File

@@ -174,12 +174,11 @@ struct ExternallyCachedEvaluationRule
// Define the arithmetic evaluator's zone.
namespace swift {
#define SWIFT_ARITHMETIC_EVALUATOR_ZONE 255
#define SWIFT_TYPEID_ZONE SWIFT_ARITHMETIC_EVALUATOR_ZONE
#define SWIFT_TYPEID_ZONE ArithmeticEvaluator
#define SWIFT_TYPEID_HEADER "ArithmeticEvaluatorTypeIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"
#define SWIFT_TYPEID_ZONE SWIFT_ARITHMETIC_EVALUATOR_ZONE
#define SWIFT_TYPEID_ZONE ArithmeticEvaluator
#define SWIFT_TYPEID_HEADER "ArithmeticEvaluatorTypeIDZone.def"
#include "swift/Basic/ImplementTypeIDZone.h"
@@ -187,10 +186,10 @@ namespace swift {
/// All of the arithmetic request functions.
static AbstractRequestFunction *arithmeticRequestFunctions[] = {
#define SWIFT_TYPEID(Name) \
#define SWIFT_REQUEST(Zone, Name) \
reinterpret_cast<AbstractRequestFunction *>(&Name::evaluateRequest),
#include "ArithmeticEvaluatorTypeIDZone.def"
#undef SWIFT_TYPEID
#undef SWIFT_REQUEST
};
/// Helper to short-circuit errors to NaN.
@@ -212,7 +211,7 @@ TEST(ArithmeticEvaluator, Simple) {
SourceManager sourceMgr;
DiagnosticEngine diags(sourceMgr);
Evaluator evaluator(diags);
evaluator.registerRequestFunctions(SWIFT_ARITHMETIC_EVALUATOR_ZONE,
evaluator.registerRequestFunctions(Zone::ArithmeticEvaluator,
arithmeticRequestFunctions);
const double expectedResult = (3.14159 + 2.71828) * 42.0;
@@ -335,7 +334,7 @@ TEST(ArithmeticEvaluator, Cycle) {
SourceManager sourceMgr;
DiagnosticEngine diags(sourceMgr);
Evaluator evaluator(diags);
evaluator.registerRequestFunctions(SWIFT_ARITHMETIC_EVALUATOR_ZONE,
evaluator.registerRequestFunctions(Zone::ArithmeticEvaluator,
arithmeticRequestFunctions);
// Evaluate when there is a cycle.