summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lib/DebugInfo/PDB/Native/GlobalsStream.cpp
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-03 15:06:44 +0000
committerpatrick <patrick@openbsd.org>2020-08-03 15:06:44 +0000
commitb64793999546ed8adebaeebd9d8345d18db8927d (patch)
tree4357c27b561d73b0e089727c6ed659f2ceff5f47 /gnu/llvm/lib/DebugInfo/PDB/Native/GlobalsStream.cpp
parentAdd support for UTF-8 DISPLAY-HINTs with octet length. For now only (diff)
downloadwireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.tar.xz
wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.zip
Remove LLVM 8.0.1 files.
Diffstat (limited to 'gnu/llvm/lib/DebugInfo/PDB/Native/GlobalsStream.cpp')
-rw-r--r--gnu/llvm/lib/DebugInfo/PDB/Native/GlobalsStream.cpp182
1 files changed, 0 insertions, 182 deletions
diff --git a/gnu/llvm/lib/DebugInfo/PDB/Native/GlobalsStream.cpp b/gnu/llvm/lib/DebugInfo/PDB/Native/GlobalsStream.cpp
deleted file mode 100644
index e3631956682..00000000000
--- a/gnu/llvm/lib/DebugInfo/PDB/Native/GlobalsStream.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-//===- GlobalsStream.cpp - PDB Index of Symbols by Name ---------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// The on-disk structores used in this file are based on the reference
-// implementation which is available at
-// https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h
-//
-// When you are reading the reference source code, you'd find the
-// information below useful.
-//
-// - ppdb1->m_fMinimalDbgInfo seems to be always true.
-// - SMALLBUCKETS macro is defined.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/PDB/Native/GlobalsStream.h"
-
-#include "llvm/DebugInfo/CodeView/RecordName.h"
-#include "llvm/DebugInfo/PDB/Native/Hash.h"
-#include "llvm/DebugInfo/PDB/Native/RawError.h"
-#include "llvm/DebugInfo/PDB/Native/SymbolStream.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/Error.h"
-#include <algorithm>
-
-using namespace llvm;
-using namespace llvm::msf;
-using namespace llvm::pdb;
-
-GlobalsStream::GlobalsStream(std::unique_ptr<MappedBlockStream> Stream)
- : Stream(std::move(Stream)) {}
-
-GlobalsStream::~GlobalsStream() = default;
-
-Error GlobalsStream::reload() {
- BinaryStreamReader Reader(*Stream);
- if (auto E = GlobalsTable.read(Reader))
- return E;
- return Error::success();
-}
-
-std::vector<std::pair<uint32_t, codeview::CVSymbol>>
-GlobalsStream::findRecordsByName(StringRef Name,
- const SymbolStream &Symbols) const {
- std::vector<std::pair<uint32_t, codeview::CVSymbol>> Result;
-
- // Hash the name to figure out which bucket this goes into.
- size_t ExpandedBucketIndex = hashStringV1(Name) % IPHR_HASH;
- int32_t CompressedBucketIndex = GlobalsTable.BucketMap[ExpandedBucketIndex];
- if (CompressedBucketIndex == -1)
- return Result;
-
- uint32_t LastBucketIndex = GlobalsTable.HashBuckets.size() - 1;
- uint32_t StartRecordIndex =
- GlobalsTable.HashBuckets[CompressedBucketIndex] / 12;
- uint32_t EndRecordIndex = 0;
- if (LLVM_LIKELY(uint32_t(CompressedBucketIndex) < LastBucketIndex)) {
- EndRecordIndex = GlobalsTable.HashBuckets[CompressedBucketIndex + 1];
- } else {
- // If this is the last bucket, it consists of all hash records until the end
- // of the HashRecords array.
- EndRecordIndex = GlobalsTable.HashRecords.size() * 12;
- }
-
- EndRecordIndex /= 12;
-
- assert(EndRecordIndex <= GlobalsTable.HashRecords.size());
- while (StartRecordIndex < EndRecordIndex) {
- PSHashRecord PSH = GlobalsTable.HashRecords[StartRecordIndex];
- uint32_t Off = PSH.Off - 1;
- codeview::CVSymbol Record = Symbols.readRecord(Off);
- if (codeview::getSymbolName(Record) == Name)
- Result.push_back(std::make_pair(Off, std::move(Record)));
- ++StartRecordIndex;
- }
- return Result;
-}
-
-static Error checkHashHdrVersion(const GSIHashHeader *HashHdr) {
- if (HashHdr->VerHdr != GSIHashHeader::HdrVersion)
- return make_error<RawError>(
- raw_error_code::feature_unsupported,
- "Encountered unsupported globals stream version.");
-
- return Error::success();
-}
-
-static Error readGSIHashHeader(const GSIHashHeader *&HashHdr,
- BinaryStreamReader &Reader) {
- if (Reader.readObject(HashHdr))
- return make_error<RawError>(raw_error_code::corrupt_file,
- "Stream does not contain a GSIHashHeader.");
-
- if (HashHdr->VerSignature != GSIHashHeader::HdrSignature)
- return make_error<RawError>(
- raw_error_code::feature_unsupported,
- "GSIHashHeader signature (0xffffffff) not found.");
-
- return Error::success();
-}
-
-static Error readGSIHashRecords(FixedStreamArray<PSHashRecord> &HashRecords,
- const GSIHashHeader *HashHdr,
- BinaryStreamReader &Reader) {
- if (auto EC = checkHashHdrVersion(HashHdr))
- return EC;
-
- // HashHdr->HrSize specifies the number of bytes of PSHashRecords we have.
- // Verify that we can read them all.
- if (HashHdr->HrSize % sizeof(PSHashRecord))
- return make_error<RawError>(raw_error_code::corrupt_file,
- "Invalid HR array size.");
- uint32_t NumHashRecords = HashHdr->HrSize / sizeof(PSHashRecord);
- if (auto EC = Reader.readArray(HashRecords, NumHashRecords))
- return joinErrors(std::move(EC),
- make_error<RawError>(raw_error_code::corrupt_file,
- "Error reading hash records."));
-
- return Error::success();
-}
-
-static Error
-readGSIHashBuckets(FixedStreamArray<support::ulittle32_t> &HashBuckets,
- FixedStreamArray<support::ulittle32_t> &HashBitmap,
- const GSIHashHeader *HashHdr,
- MutableArrayRef<int32_t> BucketMap,
- BinaryStreamReader &Reader) {
- if (auto EC = checkHashHdrVersion(HashHdr))
- return EC;
-
- // Before the actual hash buckets, there is a bitmap of length determined by
- // IPHR_HASH.
- size_t BitmapSizeInBits = alignTo(IPHR_HASH + 1, 32);
- uint32_t NumBitmapEntries = BitmapSizeInBits / 32;
- if (auto EC = Reader.readArray(HashBitmap, NumBitmapEntries))
- return joinErrors(std::move(EC),
- make_error<RawError>(raw_error_code::corrupt_file,
- "Could not read a bitmap."));
- uint32_t NumBuckets1 = 0;
- uint32_t CompressedBucketIdx = 0;
- for (uint32_t I = 0; I <= IPHR_HASH; ++I) {
- uint8_t WordIdx = I / 32;
- uint8_t BitIdx = I % 32;
- bool IsSet = HashBitmap[WordIdx] & (1U << BitIdx);
- if (IsSet) {
- ++NumBuckets1;
- BucketMap[I] = CompressedBucketIdx++;
- } else {
- BucketMap[I] = -1;
- }
- }
-
- uint32_t NumBuckets = 0;
- for (uint32_t B : HashBitmap)
- NumBuckets += countPopulation(B);
-
- // Hash buckets follow.
- if (auto EC = Reader.readArray(HashBuckets, NumBuckets))
- return joinErrors(std::move(EC),
- make_error<RawError>(raw_error_code::corrupt_file,
- "Hash buckets corrupted."));
-
- return Error::success();
-}
-
-Error GSIHashTable::read(BinaryStreamReader &Reader) {
- if (auto EC = readGSIHashHeader(HashHdr, Reader))
- return EC;
- if (auto EC = readGSIHashRecords(HashRecords, HashHdr, Reader))
- return EC;
- if (HashHdr->HrSize > 0)
- if (auto EC = readGSIHashBuckets(HashBuckets, HashBitmap, HashHdr,
- BucketMap, Reader))
- return EC;
- return Error::success();
-}