StringTableBuilder.cpp revision 274955
1274955Ssvnmir//===-- StringTableBuilder.cpp - String table building utility ------------===//
2274955Ssvnmir//
3274955Ssvnmir//                     The LLVM Compiler Infrastructure
4274955Ssvnmir//
5274955Ssvnmir// This file is distributed under the University of Illinois Open Source
6274955Ssvnmir// License. See LICENSE.TXT for details.
7274955Ssvnmir//
8274955Ssvnmir//===----------------------------------------------------------------------===//
9274955Ssvnmir
10274955Ssvnmir#include "llvm/MC/StringTableBuilder.h"
11274955Ssvnmir#include "llvm/ADT/SmallVector.h"
12274955Ssvnmir
13274955Ssvnmirusing namespace llvm;
14274955Ssvnmir
15274955Ssvnmirstatic bool compareBySuffix(StringRef a, StringRef b) {
16274955Ssvnmir  size_t sizeA = a.size();
17274955Ssvnmir  size_t sizeB = b.size();
18274955Ssvnmir  size_t len = std::min(sizeA, sizeB);
19274955Ssvnmir  for (size_t i = 0; i < len; ++i) {
20274955Ssvnmir    char ca = a[sizeA - i - 1];
21274955Ssvnmir    char cb = b[sizeB - i - 1];
22274955Ssvnmir    if (ca != cb)
23274955Ssvnmir      return ca > cb;
24274955Ssvnmir  }
25274955Ssvnmir  return sizeA > sizeB;
26274955Ssvnmir}
27274955Ssvnmir
28274955Ssvnmirvoid StringTableBuilder::finalize() {
29274955Ssvnmir  SmallVector<StringRef, 8> Strings;
30274955Ssvnmir  for (auto i = StringIndexMap.begin(), e = StringIndexMap.end(); i != e; ++i)
31274955Ssvnmir    Strings.push_back(i->getKey());
32274955Ssvnmir
33274955Ssvnmir  std::sort(Strings.begin(), Strings.end(), compareBySuffix);
34274955Ssvnmir
35274955Ssvnmir  // FIXME: Starting with a null byte is ELF specific. Generalize this so we
36274955Ssvnmir  // can use the class with other object formats.
37274955Ssvnmir  StringTable += '\x00';
38274955Ssvnmir
39274955Ssvnmir  StringRef Previous;
40274955Ssvnmir  for (StringRef s : Strings) {
41274955Ssvnmir    if (Previous.endswith(s)) {
42274955Ssvnmir      StringIndexMap[s] = StringTable.size() - 1 - s.size();
43274955Ssvnmir      continue;
44274955Ssvnmir    }
45274955Ssvnmir
46274955Ssvnmir    StringIndexMap[s] = StringTable.size();
47274955Ssvnmir    StringTable += s;
48274955Ssvnmir    StringTable += '\x00';
49274955Ssvnmir    Previous = s;
50274955Ssvnmir  }
51274955Ssvnmir}
52