Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | //===- llvm/CodeGen/DwarfStringPoolEntry.h - String pool entry --*- 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 | //===----------------------------------------------------------------------===// |
||
| 8 | |||
| 9 | #ifndef LLVM_CODEGEN_DWARFSTRINGPOOLENTRY_H |
||
| 10 | #define LLVM_CODEGEN_DWARFSTRINGPOOLENTRY_H |
||
| 11 | |||
| 12 | #include "llvm/ADT/PointerUnion.h" |
||
| 13 | #include "llvm/ADT/StringMap.h" |
||
| 14 | |||
| 15 | namespace llvm { |
||
| 16 | |||
| 17 | class MCSymbol; |
||
| 18 | |||
| 19 | /// Data for a string pool entry. |
||
| 20 | struct DwarfStringPoolEntry { |
||
| 21 | static constexpr unsigned NotIndexed = -1; |
||
| 22 | |||
| 23 | MCSymbol *Symbol = nullptr; |
||
| 24 | uint64_t Offset = 0; |
||
| 25 | unsigned Index = 0; |
||
| 26 | |||
| 27 | bool isIndexed() const { return Index != NotIndexed; } |
||
| 28 | }; |
||
| 29 | |||
| 30 | /// DwarfStringPoolEntryRef: Dwarf string pool entry reference. |
||
| 31 | /// |
||
| 32 | /// Dwarf string pool entry keeps string value and its data. |
||
| 33 | /// There are two variants how data are represented: |
||
| 34 | /// |
||
| 35 | /// 1. By value - StringMapEntry<DwarfStringPoolEntry>. |
||
| 36 | /// 2. By pointer - StringMapEntry<DwarfStringPoolEntry *>. |
||
| 37 | /// |
||
| 38 | /// The "By pointer" variant allows for reducing memory usage for the case |
||
| 39 | /// when string pool entry does not have data: it keeps the null pointer |
||
| 40 | /// and so no need to waste space for the full DwarfStringPoolEntry. |
||
| 41 | /// It is recommended to use "By pointer" variant if not all entries |
||
| 42 | /// of dwarf string pool have corresponding DwarfStringPoolEntry. |
||
| 43 | |||
| 44 | class DwarfStringPoolEntryRef { |
||
| 45 | /// Pointer type for "By value" string entry. |
||
| 46 | using ByValStringEntryPtr = const StringMapEntry<DwarfStringPoolEntry> *; |
||
| 47 | |||
| 48 | /// Pointer type for "By pointer" string entry. |
||
| 49 | using ByPtrStringEntryPtr = const StringMapEntry<DwarfStringPoolEntry *> *; |
||
| 50 | |||
| 51 | /// Pointer to the dwarf string pool Entry. |
||
| 52 | PointerUnion<ByValStringEntryPtr, ByPtrStringEntryPtr> MapEntry = nullptr; |
||
| 53 | |||
| 54 | public: |
||
| 55 | DwarfStringPoolEntryRef() = default; |
||
| 56 | |||
| 57 | /// ASSUMPTION: DwarfStringPoolEntryRef keeps pointer to \p Entry, |
||
| 58 | /// thus specified entry mustn`t be reallocated. |
||
| 59 | DwarfStringPoolEntryRef(const StringMapEntry<DwarfStringPoolEntry> &Entry) |
||
| 60 | : MapEntry(&Entry) {} |
||
| 61 | |||
| 62 | /// ASSUMPTION: DwarfStringPoolEntryRef keeps pointer to \p Entry, |
||
| 63 | /// thus specified entry mustn`t be reallocated. |
||
| 64 | DwarfStringPoolEntryRef(const StringMapEntry<DwarfStringPoolEntry *> &Entry) |
||
| 65 | : MapEntry(&Entry) { |
||
| 66 | assert(MapEntry.get<ByPtrStringEntryPtr>()->second != nullptr); |
||
| 67 | } |
||
| 68 | |||
| 69 | explicit operator bool() const { return !MapEntry.isNull(); } |
||
| 70 | |||
| 71 | /// \returns symbol for the dwarf string. |
||
| 72 | MCSymbol *getSymbol() const { |
||
| 73 | assert(getEntry().Symbol && "No symbol available!"); |
||
| 74 | return getEntry().Symbol; |
||
| 75 | } |
||
| 76 | |||
| 77 | /// \returns offset for the dwarf string. |
||
| 78 | uint64_t getOffset() const { return getEntry().Offset; } |
||
| 79 | |||
| 80 | /// \returns index for the dwarf string. |
||
| 81 | unsigned getIndex() const { |
||
| 82 | assert(getEntry().isIndexed() && "Index is not set!"); |
||
| 83 | return getEntry().Index; |
||
| 84 | } |
||
| 85 | |||
| 86 | /// \returns string. |
||
| 87 | StringRef getString() const { |
||
| 88 | if (MapEntry.is<ByValStringEntryPtr>()) |
||
| 89 | return MapEntry.get<ByValStringEntryPtr>()->first(); |
||
| 90 | |||
| 91 | return MapEntry.get<ByPtrStringEntryPtr>()->first(); |
||
| 92 | } |
||
| 93 | |||
| 94 | /// \returns the entire string pool entry for convenience. |
||
| 95 | const DwarfStringPoolEntry &getEntry() const { |
||
| 96 | if (MapEntry.is<ByValStringEntryPtr>()) |
||
| 97 | return MapEntry.get<ByValStringEntryPtr>()->second; |
||
| 98 | |||
| 99 | return *MapEntry.get<ByPtrStringEntryPtr>()->second; |
||
| 100 | } |
||
| 101 | |||
| 102 | bool operator==(const DwarfStringPoolEntryRef &X) const { |
||
| 103 | return MapEntry.getOpaqueValue() == X.MapEntry.getOpaqueValue(); |
||
| 104 | } |
||
| 105 | |||
| 106 | bool operator!=(const DwarfStringPoolEntryRef &X) const { |
||
| 107 | return MapEntry.getOpaqueValue() != X.MapEntry.getOpaqueValue(); |
||
| 108 | } |
||
| 109 | }; |
||
| 110 | |||
| 111 | } // end namespace llvm |
||
| 112 | |||
| 113 | #endif |