1 //===-- StringTableBuilder.cpp - String table building utility ------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/MC/StringTableBuilder.h"
11 #include "llvm/ADT/SmallVector.h"
15 void StringTableBuilder::finalize() {
16 SmallVector<StringRef, 8> Strings;
17 for (auto i = StringIndexMap.begin(), e = StringIndexMap.end(); i != e; ++i)
18 Strings.push_back(i->getKey());
20 // Sort the vector so a string is sorted above its suffixes.
21 std::sort(Strings.begin(), Strings.end(), [](StringRef A, StringRef B) {
22 typedef std::reverse_iterator<StringRef::iterator> Reverse;
23 return !std::lexicographical_compare(Reverse(A.end()), Reverse(A.begin()),
24 Reverse(B.end()), Reverse(B.begin()));
27 // FIXME: Starting with a null byte is ELF specific. Generalize this so we
28 // can use the class with other object formats.
29 StringTable += '\x00';
32 for (StringRef s : Strings) {
33 if (Previous.endswith(s)) {
34 StringIndexMap[s] = StringTable.size() - 1 - s.size();
38 StringIndexMap[s] = StringTable.size();
40 StringTable += '\x00';