1 //===- DebugString.h ------------------------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #ifndef MCLD_LD_DEBUGSTRING_H_
10 #define MCLD_LD_DEBUGSTRING_H_
11 
12 #include "mcld/LD/MergedStringTable.h"
13 
14 #include <vector>
15 
16 namespace mcld {
17 
18 class LDSection;
19 class Relocation;
20 class TargetLDBackend;
21 
22 /** \class DebugString
23  *  \brief DebugString represents the output debug section .debug_str
24  */
25 class DebugString {
26  public:
DebugString()27   DebugString()
28       : m_pSection(NULL) {}
29 
30   static DebugString* Create(LDSection& pSection);
31 
32   /// merge - process the strings in the given input .debug_str section and add
33   /// those strings into merged string map
34   void merge(LDSection& pSection);
35 
36   /// computeOffsetSize - set up the output offset of each strings and the
37   /// section size
38   /// @return string table size
39   size_t computeOffsetSize();
40 
41   /// applyOffset - apply the relocation which refer to debug string. This
42   /// should be called after finalizeStringsOffset()
43   void applyOffset(Relocation& pReloc, TargetLDBackend& pBackend);
44 
45   /// emit - emit the section .debug_str
46   void emit(MemoryRegion& pRegion);
47 
setOutputSection(LDSection & pSection)48   void setOutputSection(LDSection& pSection)
49   { m_pSection = &pSection; }
50 
51   /// ---- observers ----- ///
getSection()52   const LDSection* getSection() const { return m_pSection; }
getSection()53   LDSection*       getSection()       { return m_pSection; }
54 
55  private:
56   /// m_Section - the output LDSection of this .debug_str
57   LDSection* m_pSection;
58 
59   MergedStringTable m_StringTable;
60 };
61 
62 }  // namespace mcld
63 
64 #endif  // MCLD_LD_DEBUGSTRING_H_
65 
66