//===- MergedStringTable.cpp ----------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "mcld/LD/MergedStringTable.h"
namespace mcld {
bool MergedStringTable::insertString(llvm::StringRef pString) {
return m_StringMap.insert(std::make_pair(pString, 0)).second;
}
uint64_t MergedStringTable::finalizeOffset() {
// trverse the string table and set the offset
string_map_iterator it, end = m_StringMap.end();
size_t offset = 0;
for (it = m_StringMap.begin(); it != end; ++it) {
it->setValue(offset);
offset += it->getKey().size() + 1;
}
return offset;
}
void MergedStringTable::emit(MemoryRegion& pRegion) {
char* ptr = reinterpret_cast<char*>(pRegion.begin());
string_map_iterator it, end = m_StringMap.end();
for (it = m_StringMap.begin(); it != end; ++it) {
::memcpy(ptr, it->getKey().data(), it->getKey().size());
ptr += it->getKey().size() + 1;
}
}
size_t MergedStringTable::getOutputOffset(llvm::StringRef pStr) {
assert(m_StringMap.find(pStr) != m_StringMap.end());
return m_StringMap[pStr];
}
} // namespace mcld