1 //===- MergedStringTable.cpp ----------------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #include "mcld/LD/MergedStringTable.h"
10 
11 namespace mcld {
12 
insertString(llvm::StringRef pString)13 bool MergedStringTable::insertString(llvm::StringRef pString) {
14   return m_StringMap.insert(std::make_pair(pString, 0)).second;
15 }
16 
finalizeOffset()17 uint64_t MergedStringTable::finalizeOffset() {
18   // trverse the string table and set the offset
19   string_map_iterator it, end = m_StringMap.end();
20   size_t offset = 0;
21   for (it = m_StringMap.begin(); it != end; ++it) {
22     it->setValue(offset);
23     offset += it->getKey().size() + 1;
24   }
25   return offset;
26 }
27 
emit(MemoryRegion & pRegion)28 void MergedStringTable::emit(MemoryRegion& pRegion) {
29   char* ptr = reinterpret_cast<char*>(pRegion.begin());
30   string_map_iterator it, end = m_StringMap.end();
31   for (it = m_StringMap.begin(); it != end; ++it) {
32     ::memcpy(ptr, it->getKey().data(), it->getKey().size());
33     ptr += it->getKey().size() + 1;
34   }
35 }
36 
getOutputOffset(llvm::StringRef pStr)37 size_t MergedStringTable::getOutputOffset(llvm::StringRef pStr) {
38   assert(m_StringMap.find(pStr) != m_StringMap.end());
39   return m_StringMap[pStr];
40 }
41 
42 }  // namespace mcld
43