blob: ea01671d0eb1e958757f4f1de58d0aa3b9bb6f24 [file] [log] [blame]
//===-- 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 <string>
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<std::string, StringRef, uint32_t, LVOffset> Left(
LHS->kind(), LHS->getName(), LHS->getLineNumber(), LHS->getOffset());
std::tuple<std::string, StringRef, uint32_t, LVOffset> 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<uint32_t, StringRef, std::string, LVOffset> Left(
LHS->getLineNumber(), LHS->getName(), LHS->kind(), LHS->getOffset());
std::tuple<uint32_t, StringRef, std::string, LVOffset> 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<StringRef, uint32_t, std::string, LVOffset> Left(
LHS->getName(), LHS->getLineNumber(), LHS->kind(), LHS->getOffset());
std::tuple<StringRef, uint32_t, std::string, LVOffset> Right(
RHS->getName(), RHS->getLineNumber(), RHS->kind(), RHS->getOffset());
return Left < Right;
}
LVSortFunction llvm::logicalview::getSortFunction() {
using LVSortInfo = std::map<LVSortMode, LVSortFunction>;
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;
}