1*1db9f3b2SDimitry Andric //===- StringEntryToDwarfStringPoolEntryMap.h -------------------*- C++ -*-===// 2*1db9f3b2SDimitry Andric // 3*1db9f3b2SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*1db9f3b2SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*1db9f3b2SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*1db9f3b2SDimitry Andric // 7*1db9f3b2SDimitry Andric //===----------------------------------------------------------------------===// 8*1db9f3b2SDimitry Andric 9*1db9f3b2SDimitry Andric #ifndef LLVM_LIB_DWARFLINKER_PARALLEL_STRINGENTRYTODWARFSTRINGPOOLENTRYMAP_H 10*1db9f3b2SDimitry Andric #define LLVM_LIB_DWARFLINKER_PARALLEL_STRINGENTRYTODWARFSTRINGPOOLENTRYMAP_H 11*1db9f3b2SDimitry Andric 12*1db9f3b2SDimitry Andric #include "DWARFLinkerGlobalData.h" 13*1db9f3b2SDimitry Andric #include "llvm/ADT/SmallVector.h" 14*1db9f3b2SDimitry Andric #include "llvm/DWARFLinker/StringPool.h" 15*1db9f3b2SDimitry Andric 16*1db9f3b2SDimitry Andric namespace llvm { 17*1db9f3b2SDimitry Andric namespace dwarf_linker { 18*1db9f3b2SDimitry Andric namespace parallel { 19*1db9f3b2SDimitry Andric 20*1db9f3b2SDimitry Andric /// This class creates a DwarfStringPoolEntry for the corresponding StringEntry. 21*1db9f3b2SDimitry Andric class StringEntryToDwarfStringPoolEntryMap { 22*1db9f3b2SDimitry Andric public: 23*1db9f3b2SDimitry Andric StringEntryToDwarfStringPoolEntryMap(LinkingGlobalData &GlobalData) 24*1db9f3b2SDimitry Andric : GlobalData(GlobalData) {} 25*1db9f3b2SDimitry Andric ~StringEntryToDwarfStringPoolEntryMap() {} 26*1db9f3b2SDimitry Andric 27*1db9f3b2SDimitry Andric /// Create DwarfStringPoolEntry for specified StringEntry if necessary. 28*1db9f3b2SDimitry Andric /// Initialize DwarfStringPoolEntry with initial values. 29*1db9f3b2SDimitry Andric DwarfStringPoolEntryWithExtString *add(const StringEntry *String) { 30*1db9f3b2SDimitry Andric DwarfStringPoolEntriesTy::iterator it = DwarfStringPoolEntries.find(String); 31*1db9f3b2SDimitry Andric 32*1db9f3b2SDimitry Andric if (it == DwarfStringPoolEntries.end()) { 33*1db9f3b2SDimitry Andric DwarfStringPoolEntryWithExtString *DataPtr = 34*1db9f3b2SDimitry Andric GlobalData.getAllocator() 35*1db9f3b2SDimitry Andric .Allocate<DwarfStringPoolEntryWithExtString>(); 36*1db9f3b2SDimitry Andric DataPtr->String = GlobalData.translateString(String->getKey()); 37*1db9f3b2SDimitry Andric DataPtr->Index = DwarfStringPoolEntry::NotIndexed; 38*1db9f3b2SDimitry Andric DataPtr->Offset = 0; 39*1db9f3b2SDimitry Andric DataPtr->Symbol = nullptr; 40*1db9f3b2SDimitry Andric it = DwarfStringPoolEntries.insert(std::make_pair(String, DataPtr)).first; 41*1db9f3b2SDimitry Andric } 42*1db9f3b2SDimitry Andric 43*1db9f3b2SDimitry Andric assert(it->second != nullptr); 44*1db9f3b2SDimitry Andric return it->second; 45*1db9f3b2SDimitry Andric } 46*1db9f3b2SDimitry Andric 47*1db9f3b2SDimitry Andric /// Returns already existed DwarfStringPoolEntry for the specified 48*1db9f3b2SDimitry Andric /// StringEntry. 49*1db9f3b2SDimitry Andric DwarfStringPoolEntryWithExtString * 50*1db9f3b2SDimitry Andric getExistingEntry(const StringEntry *String) const { 51*1db9f3b2SDimitry Andric DwarfStringPoolEntriesTy::const_iterator it = 52*1db9f3b2SDimitry Andric DwarfStringPoolEntries.find(String); 53*1db9f3b2SDimitry Andric 54*1db9f3b2SDimitry Andric assert(it != DwarfStringPoolEntries.end()); 55*1db9f3b2SDimitry Andric assert(it->second != nullptr); 56*1db9f3b2SDimitry Andric return it->second; 57*1db9f3b2SDimitry Andric } 58*1db9f3b2SDimitry Andric 59*1db9f3b2SDimitry Andric /// Erase contents of StringsForEmission. 60*1db9f3b2SDimitry Andric void clear() { DwarfStringPoolEntries.clear(); } 61*1db9f3b2SDimitry Andric 62*1db9f3b2SDimitry Andric protected: 63*1db9f3b2SDimitry Andric using DwarfStringPoolEntriesTy = 64*1db9f3b2SDimitry Andric DenseMap<const StringEntry *, DwarfStringPoolEntryWithExtString *>; 65*1db9f3b2SDimitry Andric DwarfStringPoolEntriesTy DwarfStringPoolEntries; 66*1db9f3b2SDimitry Andric 67*1db9f3b2SDimitry Andric LinkingGlobalData &GlobalData; 68*1db9f3b2SDimitry Andric }; 69*1db9f3b2SDimitry Andric 70*1db9f3b2SDimitry Andric } // end of namespace parallel 71*1db9f3b2SDimitry Andric } // end of namespace dwarf_linker 72*1db9f3b2SDimitry Andric } // end of namespace llvm 73*1db9f3b2SDimitry Andric 74*1db9f3b2SDimitry Andric #endif // LLVM_LIB_DWARFLINKER_PARALLEL_STRINGENTRYTODWARFSTRINGPOOLENTRYMAP_H 75