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