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