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