You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.3 KiB
43 lines
1.3 KiB
//===- 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
|