|
19 | 19 | #include "swift/Basic/Timer.h"
|
20 | 20 |
|
21 | 21 | #include <thread>
|
| 22 | +#include <tuple> |
22 | 23 |
|
23 | 24 | #define SWIFT_FUNC_STAT \
|
24 | 25 | do { \
|
@@ -329,5 +330,68 @@ inline FrontendStatsTracer::FrontendStatsTracer(UnifiedStatsReporter *R,
|
329 | 330 | const TypeRepr *TR)
|
330 | 331 | : FrontendStatsTracer(R, S, TR, getTraceFormatter<const TypeRepr *>()) {}
|
331 | 332 |
|
| 333 | +/// Utilities for constructing TraceFormatters from entities in the request-evaluator: |
| 334 | + |
| 335 | +template <typename T> |
| 336 | +typename std::enable_if< |
| 337 | + std::is_constructible<FrontendStatsTracer, UnifiedStatsReporter *, |
| 338 | + StringRef, const T *>::value, |
| 339 | + FrontendStatsTracer>::type |
| 340 | +make_tracer_direct(UnifiedStatsReporter *Reporter, StringRef Name, T *Value) { |
| 341 | + return FrontendStatsTracer(Reporter, Name, static_cast<const T *>(Value)); |
| 342 | +} |
| 343 | + |
| 344 | +template <typename T> |
| 345 | +typename std::enable_if< |
| 346 | + std::is_constructible<FrontendStatsTracer, UnifiedStatsReporter *, |
| 347 | + StringRef, const T *>::value, |
| 348 | + FrontendStatsTracer>::type |
| 349 | +make_tracer_direct(UnifiedStatsReporter *Reporter, StringRef Name, |
| 350 | + const T *Value) { |
| 351 | + return FrontendStatsTracer(Reporter, Name, Value); |
| 352 | +} |
| 353 | + |
| 354 | +template <typename T> |
| 355 | +typename std::enable_if< |
| 356 | + !std::is_constructible<FrontendStatsTracer, UnifiedStatsReporter *, |
| 357 | + StringRef, const T *>::value, |
| 358 | + FrontendStatsTracer>::type |
| 359 | +make_tracer_direct(UnifiedStatsReporter *Reporter, StringRef Name, T *Value) { |
| 360 | + return FrontendStatsTracer(Reporter, Name); |
| 361 | +} |
| 362 | + |
| 363 | +template <typename T> |
| 364 | +typename std::enable_if<!std::is_pointer<T>::value, FrontendStatsTracer>::type |
| 365 | +make_tracer_direct(UnifiedStatsReporter *Reporter, StringRef Name, T Value) { |
| 366 | + return FrontendStatsTracer(Reporter, Name); |
| 367 | +} |
| 368 | + |
| 369 | +template <typename T> struct is_pointerunion : std::false_type {}; |
| 370 | +template <typename T, typename U> |
| 371 | +struct is_pointerunion<llvm::PointerUnion<T, U>> : std::true_type {}; |
| 372 | + |
| 373 | +template <typename T, typename U> |
| 374 | +FrontendStatsTracer make_tracer_pointerunion(UnifiedStatsReporter *Reporter, |
| 375 | + StringRef Name, |
| 376 | + llvm::PointerUnion<T, U> Value) { |
| 377 | + if (Value.template is<T>()) |
| 378 | + return make_tracer_direct(Reporter, Name, Value.template get<T>()); |
| 379 | + else |
| 380 | + return make_tracer_direct(Reporter, Name, Value.template get<U>()); |
| 381 | +} |
| 382 | + |
| 383 | +template <typename T> |
| 384 | +typename std::enable_if<!is_pointerunion<T>::value, FrontendStatsTracer>::type |
| 385 | +make_tracer_pointerunion(UnifiedStatsReporter *Reporter, StringRef Name, |
| 386 | + T Value) { |
| 387 | + return make_tracer_direct(Reporter, Name, Value); |
| 388 | +} |
| 389 | + |
| 390 | +template <typename First, typename... Rest> |
| 391 | +FrontendStatsTracer make_tracer(UnifiedStatsReporter *Reporter, StringRef Name, |
| 392 | + std::tuple<First, Rest...> Value) { |
| 393 | + return make_tracer_pointerunion(Reporter, Name, std::get<0>(Value)); |
| 394 | +} |
| 395 | + |
332 | 396 | } // namespace swift
|
333 | 397 | #endif // SWIFT_BASIC_STATISTIC_H
|
0 commit comments