1*8bcb0991SDimitry Andric //===- FileWriter.cpp -------------------------------------------*- C++ -*-===// 2*8bcb0991SDimitry Andric // 3*8bcb0991SDimitry Andric // The LLVM Compiler Infrastructure 4*8bcb0991SDimitry Andric // 5*8bcb0991SDimitry Andric // This file is distributed under the University of Illinois Open Source 6*8bcb0991SDimitry Andric // License. See LICENSE.TXT for details. 7*8bcb0991SDimitry Andric // 8*8bcb0991SDimitry Andric //===----------------------------------------------------------------------===// 9*8bcb0991SDimitry Andric 10*8bcb0991SDimitry Andric #include "llvm/DebugInfo/GSYM/FileWriter.h" 11*8bcb0991SDimitry Andric #include "llvm/Support/LEB128.h" 12*8bcb0991SDimitry Andric #include "llvm/Support/raw_ostream.h" 13*8bcb0991SDimitry Andric #include <cassert> 14*8bcb0991SDimitry Andric 15*8bcb0991SDimitry Andric using namespace llvm; 16*8bcb0991SDimitry Andric using namespace gsym; 17*8bcb0991SDimitry Andric 18*8bcb0991SDimitry Andric FileWriter::~FileWriter() { OS.flush(); } 19*8bcb0991SDimitry Andric 20*8bcb0991SDimitry Andric void FileWriter::writeSLEB(int64_t S) { 21*8bcb0991SDimitry Andric uint8_t Bytes[32]; 22*8bcb0991SDimitry Andric auto Length = encodeSLEB128(S, Bytes); 23*8bcb0991SDimitry Andric assert(Length < sizeof(Bytes)); 24*8bcb0991SDimitry Andric OS.write(reinterpret_cast<const char *>(Bytes), Length); 25*8bcb0991SDimitry Andric } 26*8bcb0991SDimitry Andric 27*8bcb0991SDimitry Andric void FileWriter::writeULEB(uint64_t U) { 28*8bcb0991SDimitry Andric uint8_t Bytes[32]; 29*8bcb0991SDimitry Andric auto Length = encodeULEB128(U, Bytes); 30*8bcb0991SDimitry Andric assert(Length < sizeof(Bytes)); 31*8bcb0991SDimitry Andric OS.write(reinterpret_cast<const char *>(Bytes), Length); 32*8bcb0991SDimitry Andric } 33*8bcb0991SDimitry Andric 34*8bcb0991SDimitry Andric void FileWriter::writeU8(uint8_t U) { 35*8bcb0991SDimitry Andric OS.write(reinterpret_cast<const char *>(&U), sizeof(U)); 36*8bcb0991SDimitry Andric } 37*8bcb0991SDimitry Andric 38*8bcb0991SDimitry Andric void FileWriter::writeU16(uint16_t U) { 39*8bcb0991SDimitry Andric const uint16_t Swapped = support::endian::byte_swap(U, ByteOrder); 40*8bcb0991SDimitry Andric OS.write(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped)); 41*8bcb0991SDimitry Andric } 42*8bcb0991SDimitry Andric 43*8bcb0991SDimitry Andric void FileWriter::writeU32(uint32_t U) { 44*8bcb0991SDimitry Andric const uint32_t Swapped = support::endian::byte_swap(U, ByteOrder); 45*8bcb0991SDimitry Andric OS.write(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped)); 46*8bcb0991SDimitry Andric } 47*8bcb0991SDimitry Andric 48*8bcb0991SDimitry Andric void FileWriter::writeU64(uint64_t U) { 49*8bcb0991SDimitry Andric const uint64_t Swapped = support::endian::byte_swap(U, ByteOrder); 50*8bcb0991SDimitry Andric OS.write(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped)); 51*8bcb0991SDimitry Andric } 52*8bcb0991SDimitry Andric 53*8bcb0991SDimitry Andric void FileWriter::fixup32(uint32_t U, uint64_t Offset) { 54*8bcb0991SDimitry Andric const uint32_t Swapped = support::endian::byte_swap(U, ByteOrder); 55*8bcb0991SDimitry Andric OS.pwrite(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped), 56*8bcb0991SDimitry Andric Offset); 57*8bcb0991SDimitry Andric } 58*8bcb0991SDimitry Andric 59*8bcb0991SDimitry Andric void FileWriter::writeData(llvm::ArrayRef<uint8_t> Data) { 60*8bcb0991SDimitry Andric OS.write(reinterpret_cast<const char *>(Data.data()), Data.size()); 61*8bcb0991SDimitry Andric } 62*8bcb0991SDimitry Andric 63*8bcb0991SDimitry Andric void FileWriter::writeNullTerminated(llvm::StringRef Str) { 64*8bcb0991SDimitry Andric OS << Str << '\0'; 65*8bcb0991SDimitry Andric } 66*8bcb0991SDimitry Andric 67*8bcb0991SDimitry Andric uint64_t FileWriter::tell() { 68*8bcb0991SDimitry Andric return OS.tell(); 69*8bcb0991SDimitry Andric } 70*8bcb0991SDimitry Andric 71*8bcb0991SDimitry Andric void FileWriter::alignTo(size_t Align) { 72*8bcb0991SDimitry Andric off_t Offset = OS.tell(); 73*8bcb0991SDimitry Andric off_t AlignedOffset = (Offset + Align - 1) / Align * Align; 74*8bcb0991SDimitry Andric if (AlignedOffset == Offset) 75*8bcb0991SDimitry Andric return; 76*8bcb0991SDimitry Andric off_t PadCount = AlignedOffset - Offset; 77*8bcb0991SDimitry Andric OS.write_zeros(PadCount); 78*8bcb0991SDimitry Andric } 79