diff options
author | Alexey Lapshin <a.v.lapshin@mail.ru> | 2019-12-05 13:11:32 +0300 |
---|---|---|
committer | Alexey Lapshin <a.v.lapshin@mail.ru> | 2019-12-06 10:02:27 +0300 |
commit | 9e8c799e2b0dc3e3b20f5044309fa8e48e8e3e32 (patch) | |
tree | 2a81ec27e98950aaea1a061b2fdaa884a35d0882 /llvm/lib/CodeGen | |
parent | c4d8c6319f576a7540017168db2f0440691914f4 (diff) | |
download | bcm5719-llvm-9e8c799e2b0dc3e3b20f5044309fa8e48e8e3e32.tar.gz bcm5719-llvm-9e8c799e2b0dc3e3b20f5044309fa8e48e8e3e32.zip |
[Dsymutil][NFC] Move NonRelocatableStringpool into common CodeGen folder.
That refactoring moves NonRelocatableStringpool into common CodeGen folder.
So that NonRelocatableStringpool could be used not only inside dsymutil.
Differential Revision: https://reviews.llvm.org/D71068
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/NonRelocatableStringpool.cpp | 54 |
2 files changed, 55 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index c10c3f4d786..470b027e38c 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -102,6 +102,7 @@ add_llvm_component_library(LLVMCodeGen MIRPrinter.cpp MIRPrintingPass.cpp MacroFusion.cpp + NonRelocatableStringpool.cpp OptimizePHIs.cpp ParallelCG.cpp PeepholeOptimizer.cpp diff --git a/llvm/lib/CodeGen/NonRelocatableStringpool.cpp b/llvm/lib/CodeGen/NonRelocatableStringpool.cpp new file mode 100644 index 00000000000..d28399f239c --- /dev/null +++ b/llvm/lib/CodeGen/NonRelocatableStringpool.cpp @@ -0,0 +1,54 @@ +//===-- llvm/CodeGen/NonRelocatableStringpool.cpp - A simple stringpool --===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "llvm/CodeGen/NonRelocatableStringpool.h" + +namespace llvm { + +DwarfStringPoolEntryRef NonRelocatableStringpool::getEntry(StringRef S) { + if (S.empty() && !Strings.empty()) + return EmptyString; + + if (Translator) + S = Translator(S); + auto I = Strings.insert({S, DwarfStringPoolEntry()}); + auto &Entry = I.first->second; + if (I.second || !Entry.isIndexed()) { + Entry.Index = NumEntries++; + Entry.Offset = CurrentEndOffset; + Entry.Symbol = nullptr; + CurrentEndOffset += S.size() + 1; + } + return DwarfStringPoolEntryRef(*I.first, true); +} + +StringRef NonRelocatableStringpool::internString(StringRef S) { + DwarfStringPoolEntry Entry{nullptr, 0, DwarfStringPoolEntry::NotIndexed}; + + if (Translator) + S = Translator(S); + + auto InsertResult = Strings.insert({S, Entry}); + return InsertResult.first->getKey(); +} + +std::vector<DwarfStringPoolEntryRef> +NonRelocatableStringpool::getEntriesForEmission() const { + std::vector<DwarfStringPoolEntryRef> Result; + Result.reserve(Strings.size()); + for (const auto &E : Strings) + if (E.getValue().isIndexed()) + Result.emplace_back(E, true); + llvm::sort(Result, [](const DwarfStringPoolEntryRef A, + const DwarfStringPoolEntryRef B) { + return A.getIndex() < B.getIndex(); + }); + return Result; +} + +} // namespace llvm |