FileWriter.cpp revision 360784
11558Srgrimes//===- FileWriter.cpp -------------------------------------------*- C++ -*-===// 21558Srgrimes// 31558Srgrimes// The LLVM Compiler Infrastructure 41558Srgrimes// 51558Srgrimes// This file is distributed under the University of Illinois Open Source 61558Srgrimes// License. See LICENSE.TXT for details. 71558Srgrimes// 81558Srgrimes//===----------------------------------------------------------------------===// 91558Srgrimes 101558Srgrimes#include "llvm/DebugInfo/GSYM/FileWriter.h" 111558Srgrimes#include "llvm/Support/LEB128.h" 121558Srgrimes#include "llvm/Support/raw_ostream.h" 131558Srgrimes#include <cassert> 141558Srgrimes 151558Srgrimesusing namespace llvm; 161558Srgrimesusing namespace gsym; 171558Srgrimes 181558SrgrimesFileWriter::~FileWriter() { OS.flush(); } 191558Srgrimes 201558Srgrimesvoid FileWriter::writeSLEB(int64_t S) { 211558Srgrimes uint8_t Bytes[32]; 221558Srgrimes auto Length = encodeSLEB128(S, Bytes); 231558Srgrimes assert(Length < sizeof(Bytes)); 241558Srgrimes OS.write(reinterpret_cast<const char *>(Bytes), Length); 251558Srgrimes} 261558Srgrimes 271558Srgrimesvoid FileWriter::writeULEB(uint64_t U) { 281558Srgrimes uint8_t Bytes[32]; 291558Srgrimes auto Length = encodeULEB128(U, Bytes); 301558Srgrimes assert(Length < sizeof(Bytes)); 311558Srgrimes OS.write(reinterpret_cast<const char *>(Bytes), Length); 321558Srgrimes} 331558Srgrimes 341558Srgrimesvoid FileWriter::writeU8(uint8_t U) { 351558Srgrimes OS.write(reinterpret_cast<const char *>(&U), sizeof(U)); 361558Srgrimes} 371558Srgrimes 3837663Scharniervoid FileWriter::writeU16(uint16_t U) { 391558Srgrimes const uint16_t Swapped = support::endian::byte_swap(U, ByteOrder); 401558Srgrimes OS.write(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped)); 412999Swollman} 421558Srgrimes 431558Srgrimesvoid FileWriter::writeU32(uint32_t U) { 4437663Scharnier const uint32_t Swapped = support::endian::byte_swap(U, ByteOrder); 4537663Scharnier OS.write(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped)); 4637663Scharnier} 472999Swollman 4850476Spetervoid FileWriter::writeU64(uint64_t U) { 492999Swollman const uint64_t Swapped = support::endian::byte_swap(U, ByteOrder); 501558Srgrimes OS.write(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped)); 511558Srgrimes} 521558Srgrimes 5374462Salfredvoid FileWriter::fixup32(uint32_t U, uint64_t Offset) { 541558Srgrimes const uint32_t Swapped = support::endian::byte_swap(U, ByteOrder); 551558Srgrimes OS.pwrite(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped), 5624330Sguido Offset); 571558Srgrimes} 581558Srgrimes 591558Srgrimesvoid FileWriter::writeData(llvm::ArrayRef<uint8_t> Data) { 6074462Salfred OS.write(reinterpret_cast<const char *>(Data.data()), Data.size()); 6174462Salfred} 621558Srgrimes 639336Sdfrvoid FileWriter::writeNullTerminated(llvm::StringRef Str) { 6424330Sguido OS << Str << '\0'; 6523681Speter} 6623681Speter 6754093Ssemenuuint64_t FileWriter::tell() { 6823681Speter return OS.tell(); 691558Srgrimes} 701558Srgrimes 711558Srgrimesvoid FileWriter::alignTo(size_t Align) { 721558Srgrimes off_t Offset = OS.tell(); 7337663Scharnier off_t AlignedOffset = (Offset + Align - 1) / Align * Align; 741558Srgrimes if (AlignedOffset == Offset) 751558Srgrimes return; 761558Srgrimes off_t PadCount = AlignedOffset - Offset; 771558Srgrimes OS.write_zeros(PadCount); 781558Srgrimes} 791558Srgrimes