Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
#ifndef LLVM_DWP_DWPSTRINGPOOL_H
2
#define LLVM_DWP_DWPSTRINGPOOL_H
3
 
4
#include "llvm/ADT/DenseMap.h"
5
#include "llvm/MC/MCSection.h"
6
#include "llvm/MC/MCStreamer.h"
7
#include <cassert>
8
 
9
namespace llvm {
10
class DWPStringPool {
11
 
12
  struct CStrDenseMapInfo {
13
    static inline const char *getEmptyKey() {
14
      return reinterpret_cast<const char *>(~static_cast<uintptr_t>(0));
15
    }
16
    static inline const char *getTombstoneKey() {
17
      return reinterpret_cast<const char *>(~static_cast<uintptr_t>(1));
18
    }
19
    static unsigned getHashValue(const char *Val) {
20
      assert(Val != getEmptyKey() && "Cannot hash the empty key!");
21
      assert(Val != getTombstoneKey() && "Cannot hash the tombstone key!");
22
      return (unsigned)hash_value(StringRef(Val));
23
    }
24
    static bool isEqual(const char *LHS, const char *RHS) {
25
      if (RHS == getEmptyKey())
26
        return LHS == getEmptyKey();
27
      if (RHS == getTombstoneKey())
28
        return LHS == getTombstoneKey();
29
      return strcmp(LHS, RHS) == 0;
30
    }
31
  };
32
 
33
  MCStreamer &Out;
34
  MCSection *Sec;
35
  DenseMap<const char *, uint32_t, CStrDenseMapInfo> Pool;
36
  uint32_t Offset = 0;
37
 
38
public:
39
  DWPStringPool(MCStreamer &Out, MCSection *Sec) : Out(Out), Sec(Sec) {}
40
 
41
  uint32_t getOffset(const char *Str, unsigned Length) {
42
    assert(strlen(Str) + 1 == Length && "Ensure length hint is correct");
43
 
44
    auto Pair = Pool.insert(std::make_pair(Str, Offset));
45
    if (Pair.second) {
46
      Out.switchSection(Sec);
47
      Out.emitBytes(StringRef(Str, Length));
48
      Offset += Length;
49
    }
50
 
51
    return Pair.first->second;
52
  }
53
};
54
} // namespace llvm
55
 
56
#endif // LLVM_DWP_DWPSTRINGPOOL_H