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