| //===- 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 |