mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2026-01-31 01:35:20 +01:00
The full GSYM patch started with: https://reviews.llvm.org/D53379 This patch add the ability to encode data using the new llvm::gsym::FileWriter class. FileWriter is a simplified binary data writer class that doesn't require targets, target definitions, architectures, or require any other optional compile time libraries to be enabled via the build process. This class needs the ability to seek to different spots in the binary data that it produces to fix up offsets and sizes in GSYM data. It currently uses std::ostream over llvm::raw_ostream because llvm::raw_ostream doesn't support seeking which is required when encoding and decoding GSYM data. AddressRange objects are encoded and decoded to be relative to a base address. This will be the FunctionInfo's start address if the AddressRange is directly contained in a FunctionInfo, or a base address of the containing parent AddressRange or AddressRanges. This allows address ranges to be efficiently encoded using ULEB128 encodings as we encode the offset and size of each range instead of full addresses. This also makes encoded addresses easy to relocate as we just need to relocate one base address. Differential Revision: https://reviews.llvm.org/D63828 llvm-svn: 369587
68 lines
2.1 KiB
C++
68 lines
2.1 KiB
C++
//===- FileEntry.h ----------------------------------------------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_DEBUGINFO_GSYM_FILEENTRY_H
|
|
#define LLVM_DEBUGINFO_GSYM_FILEENTRY_H
|
|
|
|
#include "llvm/ADT/DenseMapInfo.h"
|
|
#include "llvm/ADT/Hashing.h"
|
|
#include <functional>
|
|
#include <stdint.h>
|
|
#include <utility>
|
|
|
|
namespace llvm {
|
|
namespace gsym {
|
|
|
|
/// Files in GSYM are contained in FileEntry structs where we split the
|
|
/// directory and basename into two different strings in the string
|
|
/// table. This allows paths to shared commont directory and filename
|
|
/// strings and saves space.
|
|
struct FileEntry {
|
|
|
|
/// Offsets in the string table.
|
|
/// @{
|
|
uint32_t Dir = 0;
|
|
uint32_t Base = 0;
|
|
/// @}
|
|
|
|
FileEntry() = default;
|
|
FileEntry(uint32_t D, uint32_t B) : Dir(D), Base(B) {}
|
|
|
|
// Implement operator== so that FileEntry can be used as key in
|
|
// unordered containers.
|
|
bool operator==(const FileEntry &RHS) const {
|
|
return Base == RHS.Base && Dir == RHS.Dir;
|
|
};
|
|
bool operator!=(const FileEntry &RHS) const {
|
|
return Base != RHS.Base || Dir != RHS.Dir;
|
|
};
|
|
};
|
|
|
|
} // namespace gsym
|
|
|
|
template <> struct DenseMapInfo<gsym::FileEntry> {
|
|
static inline gsym::FileEntry getEmptyKey() {
|
|
uint32_t key = DenseMapInfo<uint32_t>::getEmptyKey();
|
|
return gsym::FileEntry(key, key);
|
|
}
|
|
static inline gsym::FileEntry getTombstoneKey() {
|
|
uint32_t key = DenseMapInfo<uint32_t>::getTombstoneKey();
|
|
return gsym::FileEntry(key, key);
|
|
}
|
|
static unsigned getHashValue(const gsym::FileEntry &Val) {
|
|
return llvm::hash_combine(DenseMapInfo<uint32_t>::getHashValue(Val.Dir),
|
|
DenseMapInfo<uint32_t>::getHashValue(Val.Base));
|
|
}
|
|
static bool isEqual(const gsym::FileEntry &LHS, const gsym::FileEntry &RHS) {
|
|
return LHS == RHS;
|
|
}
|
|
};
|
|
|
|
} // namespace llvm
|
|
#endif // #ifndef LLVM_DEBUGINFO_GSYM_FILEENTRY_H
|