[InstCombine] Signed saturation patterns
[llvm-core.git] / include / llvm / DebugInfo / DWARF / DWARFUnitIndex.h
blob684103aac2fce60b7b47779fa9a75d7f352aa002
1 //===- DWARFUnitIndex.h -----------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H
10 #define LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H
12 #include "llvm/ADT/ArrayRef.h"
13 #include "llvm/ADT/StringRef.h"
14 #include "llvm/Support/DataExtractor.h"
15 #include <cstdint>
16 #include <memory>
18 namespace llvm {
20 class raw_ostream;
22 enum DWARFSectionKind {
23 DW_SECT_INFO = 1,
24 DW_SECT_TYPES,
25 DW_SECT_ABBREV,
26 DW_SECT_LINE,
27 DW_SECT_LOC,
28 DW_SECT_STR_OFFSETS,
29 DW_SECT_MACINFO,
30 DW_SECT_MACRO,
33 class DWARFUnitIndex {
34 struct Header {
35 uint32_t Version;
36 uint32_t NumColumns;
37 uint32_t NumUnits;
38 uint32_t NumBuckets = 0;
40 bool parse(DataExtractor IndexData, uint64_t *OffsetPtr);
41 void dump(raw_ostream &OS) const;
44 public:
45 class Entry {
46 public:
47 struct SectionContribution {
48 uint32_t Offset;
49 uint32_t Length;
52 private:
53 const DWARFUnitIndex *Index;
54 uint64_t Signature;
55 std::unique_ptr<SectionContribution[]> Contributions;
56 friend class DWARFUnitIndex;
58 public:
59 const SectionContribution *getOffset(DWARFSectionKind Sec) const;
60 const SectionContribution *getOffset() const;
62 const SectionContribution *getOffsets() const {
63 return Contributions.get();
66 uint64_t getSignature() const { return Signature; }
69 private:
70 struct Header Header;
72 DWARFSectionKind InfoColumnKind;
73 int InfoColumn = -1;
74 std::unique_ptr<DWARFSectionKind[]> ColumnKinds;
75 std::unique_ptr<Entry[]> Rows;
76 mutable std::vector<Entry *> OffsetLookup;
78 static StringRef getColumnHeader(DWARFSectionKind DS);
80 bool parseImpl(DataExtractor IndexData);
82 public:
83 DWARFUnitIndex(DWARFSectionKind InfoColumnKind)
84 : InfoColumnKind(InfoColumnKind) {}
86 explicit operator bool() const { return Header.NumBuckets; }
88 bool parse(DataExtractor IndexData);
89 void dump(raw_ostream &OS) const;
91 const Entry *getFromOffset(uint32_t Offset) const;
92 const Entry *getFromHash(uint64_t Offset) const;
94 ArrayRef<DWARFSectionKind> getColumnKinds() const {
95 return makeArrayRef(ColumnKinds.get(), Header.NumColumns);
98 ArrayRef<Entry> getRows() const {
99 return makeArrayRef(Rows.get(), Header.NumBuckets);
103 } // end namespace llvm
105 #endif // LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H