123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- llvm/CodeGen/DwarfStringPoolEntry.h - String pool entry --*- 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_CODEGEN_DWARFSTRINGPOOLENTRY_H
- #define LLVM_CODEGEN_DWARFSTRINGPOOLENTRY_H
- #include "llvm/ADT/PointerUnion.h"
- #include "llvm/ADT/StringMap.h"
- namespace llvm {
- class MCSymbol;
- /// Data for a string pool entry.
- struct DwarfStringPoolEntry {
- static constexpr unsigned NotIndexed = -1;
- MCSymbol *Symbol = nullptr;
- uint64_t Offset = 0;
- unsigned Index = 0;
- bool isIndexed() const { return Index != NotIndexed; }
- };
- /// DwarfStringPoolEntryRef: Dwarf string pool entry reference.
- ///
- /// Dwarf string pool entry keeps string value and its data.
- /// There are two variants how data are represented:
- ///
- /// 1. By value - StringMapEntry<DwarfStringPoolEntry>.
- /// 2. By pointer - StringMapEntry<DwarfStringPoolEntry *>.
- ///
- /// The "By pointer" variant allows for reducing memory usage for the case
- /// when string pool entry does not have data: it keeps the null pointer
- /// and so no need to waste space for the full DwarfStringPoolEntry.
- /// It is recommended to use "By pointer" variant if not all entries
- /// of dwarf string pool have corresponding DwarfStringPoolEntry.
- class DwarfStringPoolEntryRef {
- /// Pointer type for "By value" string entry.
- using ByValStringEntryPtr = const StringMapEntry<DwarfStringPoolEntry> *;
- /// Pointer type for "By pointer" string entry.
- using ByPtrStringEntryPtr = const StringMapEntry<DwarfStringPoolEntry *> *;
- /// Pointer to the dwarf string pool Entry.
- PointerUnion<ByValStringEntryPtr, ByPtrStringEntryPtr> MapEntry = nullptr;
- public:
- DwarfStringPoolEntryRef() = default;
- /// ASSUMPTION: DwarfStringPoolEntryRef keeps pointer to \p Entry,
- /// thus specified entry mustn`t be reallocated.
- DwarfStringPoolEntryRef(const StringMapEntry<DwarfStringPoolEntry> &Entry)
- : MapEntry(&Entry) {}
- /// ASSUMPTION: DwarfStringPoolEntryRef keeps pointer to \p Entry,
- /// thus specified entry mustn`t be reallocated.
- DwarfStringPoolEntryRef(const StringMapEntry<DwarfStringPoolEntry *> &Entry)
- : MapEntry(&Entry) {
- assert(MapEntry.get<ByPtrStringEntryPtr>()->second != nullptr);
- }
- explicit operator bool() const { return !MapEntry.isNull(); }
- /// \returns symbol for the dwarf string.
- MCSymbol *getSymbol() const {
- assert(getEntry().Symbol && "No symbol available!");
- return getEntry().Symbol;
- }
- /// \returns offset for the dwarf string.
- uint64_t getOffset() const { return getEntry().Offset; }
- /// \returns index for the dwarf string.
- unsigned getIndex() const {
- assert(getEntry().isIndexed() && "Index is not set!");
- return getEntry().Index;
- }
- /// \returns string.
- StringRef getString() const {
- if (MapEntry.is<ByValStringEntryPtr>())
- return MapEntry.get<ByValStringEntryPtr>()->first();
- return MapEntry.get<ByPtrStringEntryPtr>()->first();
- }
- /// \returns the entire string pool entry for convenience.
- const DwarfStringPoolEntry &getEntry() const {
- if (MapEntry.is<ByValStringEntryPtr>())
- return MapEntry.get<ByValStringEntryPtr>()->second;
- return *MapEntry.get<ByPtrStringEntryPtr>()->second;
- }
- bool operator==(const DwarfStringPoolEntryRef &X) const {
- return MapEntry.getOpaqueValue() == X.MapEntry.getOpaqueValue();
- }
- bool operator!=(const DwarfStringPoolEntryRef &X) const {
- return MapEntry.getOpaqueValue() != X.MapEntry.getOpaqueValue();
- }
- };
- } // end namespace llvm
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|