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