Coverage Report

Created: 2017-10-03 07:32

/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/lib/CodeGen/AsmPrinter/ByteStreamer.h
Line
Count
Source (jump to first uncovered line)
1
//===-- llvm/CodeGen/ByteStreamer.h - ByteStreamer class --------*- C++ -*-===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
//
10
// This file contains a class that can take bytes that would normally be
11
// streamed via the AsmPrinter.
12
//
13
//===----------------------------------------------------------------------===//
14
15
#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_BYTESTREAMER_H
16
#define LLVM_LIB_CODEGEN_ASMPRINTER_BYTESTREAMER_H
17
18
#include "DIEHash.h"
19
#include "llvm/CodeGen/AsmPrinter.h"
20
#include "llvm/MC/MCStreamer.h"
21
#include "llvm/Support/LEB128.h"
22
#include <string>
23
24
namespace llvm {
25
class ByteStreamer {
26
 protected:
27
  ~ByteStreamer() = default;
28
  ByteStreamer(const ByteStreamer&) = default;
29
1.00k
  ByteStreamer() = default;
30
31
 public:
32
  // For now we're just handling the calls we need for dwarf emission/hashing.
33
  virtual void EmitInt8(uint8_t Byte, const Twine &Comment = "") = 0;
34
  virtual void EmitSLEB128(uint64_t DWord, const Twine &Comment = "") = 0;
35
  virtual void EmitULEB128(uint64_t DWord, const Twine &Comment = "") = 0;
36
};
37
38
class APByteStreamer final : public ByteStreamer {
39
private:
40
  AsmPrinter &AP;
41
42
public:
43
496
  APByteStreamer(AsmPrinter &Asm) : AP(Asm) {}
44
1.13k
  void EmitInt8(uint8_t Byte, const Twine &Comment) override {
45
1.13k
    AP.OutStreamer->AddComment(Comment);
46
1.13k
    AP.EmitInt8(Byte);
47
1.13k
  }
48
0
  void EmitSLEB128(uint64_t DWord, const Twine &Comment) override {
49
0
    AP.OutStreamer->AddComment(Comment);
50
0
    AP.EmitSLEB128(DWord);
51
0
  }
52
0
  void EmitULEB128(uint64_t DWord, const Twine &Comment) override {
53
0
    AP.OutStreamer->AddComment(Comment);
54
0
    AP.EmitULEB128(DWord);
55
0
  }
56
};
57
58
class HashingByteStreamer final : public ByteStreamer {
59
 private:
60
  DIEHash &Hash;
61
 public:
62
3
 HashingByteStreamer(DIEHash &H) : Hash(H) {}
63
7
  void EmitInt8(uint8_t Byte, const Twine &Comment) override {
64
7
    Hash.update(Byte);
65
7
  }
66
0
  void EmitSLEB128(uint64_t DWord, const Twine &Comment) override {
67
0
    Hash.addSLEB128(DWord);
68
0
  }
69
0
  void EmitULEB128(uint64_t DWord, const Twine &Comment) override {
70
0
    Hash.addULEB128(DWord);
71
0
  }
72
};
73
74
class BufferByteStreamer final : public ByteStreamer {
75
private:
76
  SmallVectorImpl<char> &Buffer;
77
  SmallVectorImpl<std::string> &Comments;
78
79
  /// \brief Only verbose textual output needs comments.  This will be set to
80
  /// true for that case, and false otherwise.  If false, comments passed in to
81
  /// the emit methods will be ignored.
82
  bool GenerateComments;
83
84
public:
85
  BufferByteStreamer(SmallVectorImpl<char> &Buffer,
86
                     SmallVectorImpl<std::string> &Comments,
87
                     bool GenerateComments)
88
502
  : Buffer(Buffer), Comments(Comments), GenerateComments(GenerateComments) {}
89
741
  void EmitInt8(uint8_t Byte, const Twine &Comment) override {
90
741
    Buffer.push_back(Byte);
91
741
    if (GenerateComments)
92
299
      Comments.push_back(Comment.str());
93
741
  }
94
171
  void EmitSLEB128(uint64_t DWord, const Twine &Comment) override {
95
171
    raw_svector_ostream OSE(Buffer);
96
171
    encodeSLEB128(DWord, OSE);
97
171
    if (GenerateComments)
98
57
      Comments.push_back(Comment.str());
99
171
  }
100
143
  void EmitULEB128(uint64_t DWord, const Twine &Comment) override {
101
143
    raw_svector_ostream OSE(Buffer);
102
143
    encodeULEB128(DWord, OSE);
103
143
    if (GenerateComments)
104
31
      Comments.push_back(Comment.str());
105
143
  }
106
};
107
108
}
109
110
#endif