2343845ee326bcf20cc53ea8f95aab22d58e58aa
[oota-llvm.git] / lib / MC / StringTableBuilder.cpp
1 //===-- StringTableBuilder.cpp - String table building utility ------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "llvm/MC/StringTableBuilder.h"
11 #include "llvm/ADT/SmallVector.h"
12
13 using namespace llvm;
14
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());
19
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()));
25   });
26
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';
30
31   StringRef Previous;
32   for (StringRef s : Strings) {
33     if (Previous.endswith(s)) {
34       StringIndexMap[s] = StringTable.size() - 1 - s.size();
35       continue;
36     }
37
38     StringIndexMap[s] = StringTable.size();
39     StringTable += s;
40     StringTable += '\x00';
41     Previous = s;
42   }
43 }