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_CODEGEN_BYTESTREAMER_H 16 #define LLVM_CODEGEN_BYTESTREAMER_H 17 18 #include "llvm/ADT/ArrayRef.h" 19 #include "llvm/CodeGen/AsmPrinter.h" 20 #include "llvm/MC/MCStreamer.h" 21 #include "DIEHash.h" 22 23 namespace llvm { 24 class ByteStreamer { 25 public: ~ByteStreamer()26 virtual ~ByteStreamer() {} 27 28 // For now we're just handling the calls we need for dwarf emission/hashing. 29 virtual void EmitInt8(uint8_t Byte, const Twine &Comment = "") = 0; 30 virtual void EmitSLEB128(uint64_t DWord, const Twine &Comment = "") = 0; 31 virtual void EmitULEB128(uint64_t DWord, const Twine &Comment = "") = 0; 32 }; 33 34 class APByteStreamer : public ByteStreamer { 35 private: 36 AsmPrinter ≈ 37 38 public: APByteStreamer(AsmPrinter & Asm)39 APByteStreamer(AsmPrinter &Asm) : AP(Asm) {} EmitInt8(uint8_t Byte,const Twine & Comment)40 void EmitInt8(uint8_t Byte, const Twine &Comment) override { 41 AP.OutStreamer.AddComment(Comment); 42 AP.EmitInt8(Byte); 43 } EmitSLEB128(uint64_t DWord,const Twine & Comment)44 void EmitSLEB128(uint64_t DWord, const Twine &Comment) override { 45 AP.OutStreamer.AddComment(Comment); 46 AP.EmitSLEB128(DWord); 47 } EmitULEB128(uint64_t DWord,const Twine & Comment)48 void EmitULEB128(uint64_t DWord, const Twine &Comment) override { 49 AP.OutStreamer.AddComment(Comment); 50 AP.EmitULEB128(DWord); 51 } 52 }; 53 54 class HashingByteStreamer : public ByteStreamer { 55 private: 56 DIEHash &Hash; 57 public: HashingByteStreamer(DIEHash & H)58 HashingByteStreamer(DIEHash &H) : Hash(H) {} EmitInt8(uint8_t Byte,const Twine & Comment)59 void EmitInt8(uint8_t Byte, const Twine &Comment) override { 60 Hash.update(Byte); 61 } EmitSLEB128(uint64_t DWord,const Twine & Comment)62 void EmitSLEB128(uint64_t DWord, const Twine &Comment) override { 63 Hash.addSLEB128(DWord); 64 } EmitULEB128(uint64_t DWord,const Twine & Comment)65 void EmitULEB128(uint64_t DWord, const Twine &Comment) override { 66 Hash.addULEB128(DWord); 67 } 68 }; 69 } 70 71 #endif 72