//===-- LVSort.cpp --------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Support for LVObject sorting. // //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/LogicalView/Core/LVSort.h" #include "llvm/DebugInfo/LogicalView/Core/LVElement.h" #include "llvm/DebugInfo/LogicalView/Core/LVReader.h" #include using namespace llvm; using namespace llvm::logicalview; #define DEBUG_TYPE "Sort" //===----------------------------------------------------------------------===// // Callback functions to sort objects. //===----------------------------------------------------------------------===// // Callback comparator based on kind. LVSortValue llvm::logicalview::compareKind(const LVObject *LHS, const LVObject *RHS) { return std::string(LHS->kind()) < std::string(RHS->kind()); } // Callback comparator based on line. LVSortValue llvm::logicalview::compareLine(const LVObject *LHS, const LVObject *RHS) { return LHS->getLineNumber() < RHS->getLineNumber(); } // Callback comparator based on name. LVSortValue llvm::logicalview::compareName(const LVObject *LHS, const LVObject *RHS) { return LHS->getName() < RHS->getName(); } // Callback comparator based on DIE offset. LVSortValue llvm::logicalview::compareOffset(const LVObject *LHS, const LVObject *RHS) { return LHS->getOffset() < RHS->getOffset(); } // Callback comparator for Range compare. LVSortValue llvm::logicalview::compareRange(const LVObject *LHS, const LVObject *RHS) { if (LHS->getLowerAddress() < RHS->getLowerAddress()) return true; // If the lower address is the same, use the upper address value in // order to put first the smallest interval. if (LHS->getLowerAddress() == RHS->getLowerAddress()) return LHS->getUpperAddress() < RHS->getUpperAddress(); return false; } // Callback comparator based on multiple keys (First: Kind). LVSortValue llvm::logicalview::sortByKind(const LVObject *LHS, const LVObject *RHS) { // Order in which the object attributes are used for comparison: // kind, name, line number, offset. std::tuple Left( LHS->kind(), LHS->getName(), LHS->getLineNumber(), LHS->getOffset()); std::tuple Right( RHS->kind(), RHS->getName(), RHS->getLineNumber(), RHS->getOffset()); return Left < Right; } // Callback comparator based on multiple keys (First: Line). LVSortValue llvm::logicalview::sortByLine(const LVObject *LHS, const LVObject *RHS) { // Order in which the object attributes are used for comparison: // line number, name, kind, offset. std::tuple Left( LHS->getLineNumber(), LHS->getName(), LHS->kind(), LHS->getOffset()); std::tuple Right( RHS->getLineNumber(), RHS->getName(), RHS->kind(), RHS->getOffset()); return Left < Right; } // Callback comparator based on multiple keys (First: Name). LVSortValue llvm::logicalview::sortByName(const LVObject *LHS, const LVObject *RHS) { // Order in which the object attributes are used for comparison: // name, line number, kind, offset. std::tuple Left( LHS->getName(), LHS->getLineNumber(), LHS->kind(), LHS->getOffset()); std::tuple Right( RHS->getName(), RHS->getLineNumber(), RHS->kind(), RHS->getOffset()); return Left < Right; } LVSortFunction llvm::logicalview::getSortFunction() { using LVSortInfo = std::map; static LVSortInfo SortInfo = { {LVSortMode::None, nullptr}, {LVSortMode::Kind, sortByKind}, {LVSortMode::Line, sortByLine}, {LVSortMode::Name, sortByName}, {LVSortMode::Offset, compareOffset}, }; LVSortFunction SortFunction = nullptr; LVSortInfo::iterator Iter = SortInfo.find(options().getSortMode()); if (Iter != SortInfo.end()) SortFunction = Iter->second; return SortFunction; }