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