#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. /// 2. By pointer - StringMapEntry. /// /// 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 *; /// Pointer type for "By pointer" string entry. using ByPtrStringEntryPtr = const StringMapEntry *; /// Pointer to the dwarf string pool Entry. PointerUnion MapEntry = nullptr; public: DwarfStringPoolEntryRef() = default; /// ASSUMPTION: DwarfStringPoolEntryRef keeps pointer to \p Entry, /// thus specified entry mustn`t be reallocated. DwarfStringPoolEntryRef(const StringMapEntry &Entry) : MapEntry(&Entry) {} /// ASSUMPTION: DwarfStringPoolEntryRef keeps pointer to \p Entry, /// thus specified entry mustn`t be reallocated. DwarfStringPoolEntryRef(const StringMapEntry &Entry) : MapEntry(&Entry) { assert(MapEntry.get()->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()) return MapEntry.get()->first(); return MapEntry.get()->first(); } /// \returns the entire string pool entry for convenience. const DwarfStringPoolEntry &getEntry() const { if (MapEntry.is()) return MapEntry.get()->second; return *MapEntry.get()->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