1351278Sdim//===- FileEntry.h ----------------------------------------------*- C++ -*-===// 2351278Sdim// 3360784Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4360784Sdim// See https://llvm.org/LICENSE.txt for license information. 5360784Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6351278Sdim// 7351278Sdim//===----------------------------------------------------------------------===// 8351278Sdim 9351278Sdim#ifndef LLVM_DEBUGINFO_GSYM_FILEENTRY_H 10351278Sdim#define LLVM_DEBUGINFO_GSYM_FILEENTRY_H 11351278Sdim 12351278Sdim#include "llvm/ADT/DenseMapInfo.h" 13351278Sdim#include "llvm/ADT/Hashing.h" 14351278Sdim#include <functional> 15351278Sdim#include <stdint.h> 16351278Sdim#include <utility> 17351278Sdim 18351278Sdimnamespace llvm { 19351278Sdimnamespace gsym { 20351278Sdim 21351278Sdim/// Files in GSYM are contained in FileEntry structs where we split the 22351278Sdim/// directory and basename into two different strings in the string 23351278Sdim/// table. This allows paths to shared commont directory and filename 24351278Sdim/// strings and saves space. 25351278Sdimstruct FileEntry { 26351278Sdim 27351278Sdim /// Offsets in the string table. 28351278Sdim /// @{ 29351278Sdim uint32_t Dir = 0; 30351278Sdim uint32_t Base = 0; 31351278Sdim /// @} 32351278Sdim 33351278Sdim FileEntry() = default; 34351278Sdim FileEntry(uint32_t D, uint32_t B) : Dir(D), Base(B) {} 35351278Sdim 36351278Sdim // Implement operator== so that FileEntry can be used as key in 37351278Sdim // unordered containers. 38351278Sdim bool operator==(const FileEntry &RHS) const { 39351278Sdim return Base == RHS.Base && Dir == RHS.Dir; 40351278Sdim }; 41351278Sdim bool operator!=(const FileEntry &RHS) const { 42351278Sdim return Base != RHS.Base || Dir != RHS.Dir; 43351278Sdim }; 44351278Sdim}; 45351278Sdim 46351278Sdim} // namespace gsym 47351278Sdim 48351278Sdimtemplate <> struct DenseMapInfo<gsym::FileEntry> { 49351278Sdim static inline gsym::FileEntry getEmptyKey() { 50351278Sdim uint32_t key = DenseMapInfo<uint32_t>::getEmptyKey(); 51351278Sdim return gsym::FileEntry(key, key); 52351278Sdim } 53351278Sdim static inline gsym::FileEntry getTombstoneKey() { 54351278Sdim uint32_t key = DenseMapInfo<uint32_t>::getTombstoneKey(); 55351278Sdim return gsym::FileEntry(key, key); 56351278Sdim } 57351278Sdim static unsigned getHashValue(const gsym::FileEntry &Val) { 58351278Sdim return llvm::hash_combine(DenseMapInfo<uint32_t>::getHashValue(Val.Dir), 59351278Sdim DenseMapInfo<uint32_t>::getHashValue(Val.Base)); 60351278Sdim } 61351278Sdim static bool isEqual(const gsym::FileEntry &LHS, const gsym::FileEntry &RHS) { 62351278Sdim return LHS == RHS; 63351278Sdim } 64351278Sdim}; 65351278Sdim 66351278Sdim} // namespace llvm 67351278Sdim#endif // #ifndef LLVM_DEBUGINFO_GSYM_FILEENTRY_H 68