MergedStringTable.cpp revision 37b74a387bb3993387029859c2d9d051c41c724e
137b74a387bb3993387029859c2d9d051c41c724eStephen Hines//===- MergedStringTable.cpp ----------------------------------------------===//
237b74a387bb3993387029859c2d9d051c41c724eStephen Hines//
337b74a387bb3993387029859c2d9d051c41c724eStephen Hines//                     The MCLinker Project
437b74a387bb3993387029859c2d9d051c41c724eStephen Hines//
537b74a387bb3993387029859c2d9d051c41c724eStephen Hines// This file is distributed under the University of Illinois Open Source
637b74a387bb3993387029859c2d9d051c41c724eStephen Hines// License. See LICENSE.TXT for details.
737b74a387bb3993387029859c2d9d051c41c724eStephen Hines//
837b74a387bb3993387029859c2d9d051c41c724eStephen Hines//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/MergedStringTable.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool MergedStringTable::insertString(llvm::StringRef pString) {
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return m_StringMap.insert(std::make_pair(pString, 0)).second;
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines}
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesuint64_t MergedStringTable::finalizeOffset() {
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // trverse the string table and set the offset
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  string_map_iterator it, end = m_StringMap.end();
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  size_t offset = 0;
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (it = m_StringMap.begin(); it != end; ++it) {
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    it->setValue(offset);
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    offset += it->getKey().size() + 1;
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return offset;
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines}
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid MergedStringTable::emit(MemoryRegion& pRegion) {
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  char* ptr = reinterpret_cast<char*>(pRegion.begin());
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  string_map_iterator it, end = m_StringMap.end();
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (it = m_StringMap.begin(); it != end; ++it) {
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ::memcpy(ptr, it->getKey().data(), it->getKey().size());
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ptr += it->getKey().size() + 1;
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines}
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hinessize_t MergedStringTable::getOutputOffset(llvm::StringRef pStr) {
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_StringMap.find(pStr) != m_StringMap.end());
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return m_StringMap[pStr];
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines}
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
43