136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- llvm/CodeGen/ByteStreamer.h - ByteStreamer class --------*- C++ -*-===//
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details.
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file contains a class that can take bytes that would normally be
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// streamed via the AsmPrinter.
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_BYTESTREAMER_H
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_CODEGEN_ASMPRINTER_BYTESTREAMER_H
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "DIEHash.h"
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/AsmPrinter.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCStreamer.h"
214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/LEB128.h"
224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include <string>
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm {
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass ByteStreamer {
26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar protected:
27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ~ByteStreamer() = default;
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ByteStreamer(const ByteStreamer&) = default;
29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ByteStreamer() = default;
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar public:
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // For now we're just handling the calls we need for dwarf emission/hashing.
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void EmitInt8(uint8_t Byte, const Twine &Comment = "") = 0;
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void EmitSLEB128(uint64_t DWord, const Twine &Comment = "") = 0;
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void EmitULEB128(uint64_t DWord, const Twine &Comment = "") = 0;
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass APByteStreamer final : public ByteStreamer {
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate:
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  AsmPrinter &AP;
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  APByteStreamer(AsmPrinter &Asm) : AP(Asm) {}
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitInt8(uint8_t Byte, const Twine &Comment) override {
456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    AP.OutStreamer->AddComment(Comment);
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AP.EmitInt8(Byte);
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitSLEB128(uint64_t DWord, const Twine &Comment) override {
496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    AP.OutStreamer->AddComment(Comment);
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AP.EmitSLEB128(DWord);
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitULEB128(uint64_t DWord, const Twine &Comment) override {
536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    AP.OutStreamer->AddComment(Comment);
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AP.EmitULEB128(DWord);
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
58f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass HashingByteStreamer final : public ByteStreamer {
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines private:
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIEHash &Hash;
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines public:
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines HashingByteStreamer(DIEHash &H) : Hash(H) {}
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitInt8(uint8_t Byte, const Twine &Comment) override {
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Hash.update(Byte);
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitSLEB128(uint64_t DWord, const Twine &Comment) override {
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Hash.addSLEB128(DWord);
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitULEB128(uint64_t DWord, const Twine &Comment) override {
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Hash.addULEB128(DWord);
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass BufferByteStreamer final : public ByteStreamer {
754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarprivate:
764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  SmallVectorImpl<char> &Buffer;
774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  SmallVectorImpl<std::string> &Comments;
784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// \brief Only verbose textual output needs comments.  This will be set to
806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// true for that case, and false otherwise.  If false, comments passed in to
816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// the emit methods will be ignored.
826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool GenerateComments;
836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarpublic:
854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  BufferByteStreamer(SmallVectorImpl<char> &Buffer,
866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                     SmallVectorImpl<std::string> &Comments,
876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                     bool GenerateComments)
886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  : Buffer(Buffer), Comments(Comments), GenerateComments(GenerateComments) {}
894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void EmitInt8(uint8_t Byte, const Twine &Comment) override {
904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Buffer.push_back(Byte);
916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (GenerateComments)
926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Comments.push_back(Comment.str());
934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void EmitSLEB128(uint64_t DWord, const Twine &Comment) override {
954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    raw_svector_ostream OSE(Buffer);
964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    encodeSLEB128(DWord, OSE);
976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (GenerateComments)
986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Comments.push_back(Comment.str());
994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
1004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void EmitULEB128(uint64_t DWord, const Twine &Comment) override {
1014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    raw_svector_ostream OSE(Buffer);
1024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    encodeULEB128(DWord, OSE);
1036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (GenerateComments)
1046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Comments.push_back(Comment.str());
1054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
1064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar};
1074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif
111