blob: 82cebd9465387f1e04bc602bea0c6af2a297736c [file] [log] [blame]
Bob Haarman653baa22016-10-21 19:43:19 +00001//===- GSI.h - Common Declarations for GlobalsStream and PublicsStream ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// The data structures defined in this file are based on the reference
11// implementation which is available at
12// https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h
13//
14// When you are reading the reference source code, you'd find the
15// information below useful.
16//
17// - ppdb1->m_fMinimalDbgInfo seems to be always true.
18// - SMALLBUCKETS macro is defined.
19//
20// The reference doesn't compile, so I learned just by reading code.
21// It's not guaranteed to be correct.
22//
23//===----------------------------------------------------------------------===//
24
25#ifndef LLVM_LIB_DEBUGINFO_PDB_RAW_GSI_H
26#define LLVM_LIB_DEBUGINFO_PDB_RAW_GSI_H
27
28#include "llvm/DebugInfo/MSF/StreamArray.h"
29#include "llvm/DebugInfo/PDB/Raw/RawTypes.h"
30
31#include "llvm/Support/Endian.h"
32#include "llvm/Support/Error.h"
33
34namespace llvm {
35
36namespace msf {
37class StreamReader;
38}
39
40namespace pdb {
41
42/// From https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.cpp
43static const unsigned IPHR_HASH = 4096;
44
45/// Header of the hash tables found in the globals and publics sections.
46/// Based on GSIHashHeader in
47/// https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h
48struct GSIHashHeader {
49 enum : unsigned {
50 HdrSignature = ~0U,
51 HdrVersion = 0xeffe0000 + 19990810,
52 };
53 support::ulittle32_t VerSignature;
54 support::ulittle32_t VerHdr;
55 support::ulittle32_t HrSize;
56 support::ulittle32_t NumBuckets;
57};
58
59Error readGSIHashBuckets(
60 msf::FixedStreamArray<support::ulittle32_t> &HashBuckets,
61 const GSIHashHeader *HashHdr, msf::StreamReader &Reader);
62Error readGSIHashHeader(const GSIHashHeader *&HashHdr,
63 msf::StreamReader &Reader);
64Error readGSIHashRecords(msf::FixedStreamArray<PSHashRecord> &HashRecords,
65 const GSIHashHeader *HashHdr,
66 msf::StreamReader &Reader);
67}
68}
69
70#endif