blob: ca185949b26ea6e076be925f4c1d41bbb5f91eae [file] [log] [blame]
//===- MergedStringTable.h ------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_LD_MERGEDSTRINGTABLE_H_
#define MCLD_LD_MERGEDSTRINGTABLE_H_
#include "mcld/Support/MemoryRegion.h"
#include <llvm/ADT/StringMap.h>
#include <llvm/ADT/StringRef.h>
namespace mcld {
/** \class MergedStringTable
* \brief MergedStringTable represents the mergeable string table. The sections
* with flag SHF_MERGED and SHF_STRING are mergeable. Every string in
* MergedStringTable is unique.
*/
class MergedStringTable {
public:
typedef llvm::StringMap<size_t> StringMapTy;
public:
MergedStringTable() {}
/// insertString - insert a string to the string table
/// @return false if the string already exists in the map.
bool insertString(llvm::StringRef pString);
/// finalizeOffset - finalize the output offset of strings. After this
/// function been called, any string should not be added to this table
/// @return the section size
uint64_t finalizeOffset();
/// emit - emit the string table
void emit(MemoryRegion& pRegion);
/// ----- observers -----///
/// getOutputOffset - get the output offset of the string. This should be
/// called after finalizeOffset.
size_t getOutputOffset(llvm::StringRef pStr);
private:
typedef StringMapTy::iterator string_map_iterator;
typedef StringMapTy::const_iterator const_string_map_iterator;
private:
/// m_StringMap - the string pool of this section. It maps the string to the
/// output offset. The key of this map is the string, and the value is output
/// offset
StringMapTy m_StringMap;
};
} // namespace mcld
#endif // MCLD_LD_MERGEDSTRINGTABLE_H_