diff options
| author | Fangrui Song <maskray@google.com> | 2018-12-11 17:34:15 +0000 | 
|---|---|---|
| committer | Fangrui Song <maskray@google.com> | 2018-12-11 17:34:15 +0000 | 
| commit | 9569523ab27162b87113a3fc1b227413a4a8a98e (patch) | |
| tree | 3fa4d6f3917dc295e33347c88f4779918e944e02 /llvm/tools/llvm-xray | |
| parent | 2112fbcc00b1ed469f272bc17d8f057ca3d8fdde (diff) | |
| download | bcm5719-llvm-9569523ab27162b87113a3fc1b227413a4a8a98e.tar.gz bcm5719-llvm-9569523ab27162b87113a3fc1b227413a4a8a98e.zip | |
[XRay] Add a helper function sortByKey to simplify code
Reviewers: dberris, mboerger
Reviewed By: dberris
Subscribers: mgrang, llvm-commits
Differential Revision: https://reviews.llvm.org/D55548
llvm-svn: 348869
Diffstat (limited to 'llvm/tools/llvm-xray')
| -rw-r--r-- | llvm/tools/llvm-xray/xray-account.cpp | 99 | 
1 files changed, 31 insertions, 68 deletions
| diff --git a/llvm/tools/llvm-xray/xray-account.cpp b/llvm/tools/llvm-xray/xray-account.cpp index 3f01605fd85..9985c9adcf6 100644 --- a/llvm/tools/llvm-xray/xray-account.cpp +++ b/llvm/tools/llvm-xray/xray-account.cpp @@ -259,9 +259,18 @@ ResultRow getStats(std::vector<uint64_t> &Timings) {  } // namespace +using TupleType = std::tuple<int32_t, uint64_t, ResultRow>; + +template <typename F> +static void sortByKey(std::vector<TupleType> &Results, F Fn) { +  bool ASC = AccountSortOrder == SortDirection::ASCENDING; +  llvm::sort(Results, [=](const TupleType &L, const TupleType &R) { +    return ASC ? Fn(L) < Fn(R) : Fn(L) > Fn(R); +  }); +} +  template <class F>  void LatencyAccountant::exportStats(const XRayFileHeader &Header, F Fn) const { -  using TupleType = std::tuple<int32_t, uint64_t, ResultRow>;    std::vector<TupleType> Results;    Results.reserve(FunctionLatencies.size());    for (auto FT : FunctionLatencies) { @@ -286,77 +295,31 @@ void LatencyAccountant::exportStats(const XRayFileHeader &Header, F Fn) const {    // Sort the data according to user-provided flags.    switch (AccountSortOutput) {    case SortField::FUNCID: -    llvm::sort(Results, [](const TupleType &L, const TupleType &R) { -      if (AccountSortOrder == SortDirection::ASCENDING) -        return std::get<0>(L) < std::get<0>(R); -      if (AccountSortOrder == SortDirection::DESCENDING) -        return std::get<0>(L) > std::get<0>(R); -      llvm_unreachable("Unknown sort direction"); -    }); +    sortByKey(Results, [](const TupleType &X) { return std::get<0>(X); });      break;    case SortField::COUNT: -    llvm::sort(Results, [](const TupleType &L, const TupleType &R) { -      if (AccountSortOrder == SortDirection::ASCENDING) -        return std::get<1>(L) < std::get<1>(R); -      if (AccountSortOrder == SortDirection::DESCENDING) -        return std::get<1>(L) > std::get<1>(R); -      llvm_unreachable("Unknown sort direction"); -    }); +    sortByKey(Results, [](const TupleType &X) { return std::get<1>(X); });      break; -  default: -    // Here we need to look into the ResultRow for the rest of the data that -    // we want to sort by. -    llvm::sort(Results, [&](const TupleType &L, const TupleType &R) { -      auto &LR = std::get<2>(L); -      auto &RR = std::get<2>(R); -      switch (AccountSortOutput) { -      case SortField::COUNT: -        if (AccountSortOrder == SortDirection::ASCENDING) -          return LR.Count < RR.Count; -        if (AccountSortOrder == SortDirection::DESCENDING) -          return LR.Count > RR.Count; -        llvm_unreachable("Unknown sort direction"); -      case SortField::MIN: -        if (AccountSortOrder == SortDirection::ASCENDING) -          return LR.Min < RR.Min; -        if (AccountSortOrder == SortDirection::DESCENDING) -          return LR.Min > RR.Min; -        llvm_unreachable("Unknown sort direction"); -      case SortField::MED: -        if (AccountSortOrder == SortDirection::ASCENDING) -          return LR.Median < RR.Median; -        if (AccountSortOrder == SortDirection::DESCENDING) -          return LR.Median > RR.Median; -        llvm_unreachable("Unknown sort direction"); -      case SortField::PCT90: -        if (AccountSortOrder == SortDirection::ASCENDING) -          return LR.Pct90 < RR.Pct90; -        if (AccountSortOrder == SortDirection::DESCENDING) -          return LR.Pct90 > RR.Pct90; -        llvm_unreachable("Unknown sort direction"); -      case SortField::PCT99: -        if (AccountSortOrder == SortDirection::ASCENDING) -          return LR.Pct99 < RR.Pct99; -        if (AccountSortOrder == SortDirection::DESCENDING) -          return LR.Pct99 > RR.Pct99; -        llvm_unreachable("Unknown sort direction"); -      case SortField::MAX: -        if (AccountSortOrder == SortDirection::ASCENDING) -          return LR.Max < RR.Max; -        if (AccountSortOrder == SortDirection::DESCENDING) -          return LR.Max > RR.Max; -        llvm_unreachable("Unknown sort direction"); -      case SortField::SUM: -        if (AccountSortOrder == SortDirection::ASCENDING) -          return LR.Sum < RR.Sum; -        if (AccountSortOrder == SortDirection::DESCENDING) -          return LR.Sum > RR.Sum; -        llvm_unreachable("Unknown sort direction"); -      default: -        llvm_unreachable("Unsupported sort order"); -      } -    }); +  case SortField::MIN: +    sortByKey(Results, [](const TupleType &X) { return std::get<2>(X).Min; }); +    break; +  case SortField::MED: +    sortByKey(Results, [](const TupleType &X) { return std::get<2>(X).Median; }); +    break; +  case SortField::PCT90: +    sortByKey(Results, [](const TupleType &X) { return std::get<2>(X).Pct90; }); +    break; +  case SortField::PCT99: +    sortByKey(Results, [](const TupleType &X) { return std::get<2>(X).Pct99; }); +    break; +  case SortField::MAX: +    sortByKey(Results, [](const TupleType &X) { return std::get<2>(X).Max; }); +    break; +  case SortField::SUM: +    sortByKey(Results, [](const TupleType &X) { return std::get<2>(X).Sum; });      break; +  case SortField::FUNC: +    llvm_unreachable("Not implemented");    }    if (AccountTop > 0) { | 

