xref: /freebsd-src/contrib/llvm-project/llvm/lib/DebugInfo/GSYM/FileWriter.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
18bcb0991SDimitry Andric //===- FileWriter.cpp -------------------------------------------*- C++ -*-===//
28bcb0991SDimitry Andric //
3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68bcb0991SDimitry Andric //
78bcb0991SDimitry Andric //===----------------------------------------------------------------------===//
88bcb0991SDimitry Andric 
98bcb0991SDimitry Andric #include "llvm/DebugInfo/GSYM/FileWriter.h"
108bcb0991SDimitry Andric #include "llvm/Support/LEB128.h"
118bcb0991SDimitry Andric #include "llvm/Support/raw_ostream.h"
128bcb0991SDimitry Andric #include <cassert>
138bcb0991SDimitry Andric 
148bcb0991SDimitry Andric using namespace llvm;
158bcb0991SDimitry Andric using namespace gsym;
168bcb0991SDimitry Andric 
~FileWriter()178bcb0991SDimitry Andric FileWriter::~FileWriter() { OS.flush(); }
188bcb0991SDimitry Andric 
writeSLEB(int64_t S)198bcb0991SDimitry Andric void FileWriter::writeSLEB(int64_t S) {
208bcb0991SDimitry Andric   uint8_t Bytes[32];
218bcb0991SDimitry Andric   auto Length = encodeSLEB128(S, Bytes);
228bcb0991SDimitry Andric   assert(Length < sizeof(Bytes));
238bcb0991SDimitry Andric   OS.write(reinterpret_cast<const char *>(Bytes), Length);
248bcb0991SDimitry Andric }
258bcb0991SDimitry Andric 
writeULEB(uint64_t U)268bcb0991SDimitry Andric void FileWriter::writeULEB(uint64_t U) {
278bcb0991SDimitry Andric   uint8_t Bytes[32];
288bcb0991SDimitry Andric   auto Length = encodeULEB128(U, Bytes);
298bcb0991SDimitry Andric   assert(Length < sizeof(Bytes));
308bcb0991SDimitry Andric   OS.write(reinterpret_cast<const char *>(Bytes), Length);
318bcb0991SDimitry Andric }
328bcb0991SDimitry Andric 
writeU8(uint8_t U)338bcb0991SDimitry Andric void FileWriter::writeU8(uint8_t U) {
348bcb0991SDimitry Andric   OS.write(reinterpret_cast<const char *>(&U), sizeof(U));
358bcb0991SDimitry Andric }
368bcb0991SDimitry Andric 
writeU16(uint16_t U)378bcb0991SDimitry Andric void FileWriter::writeU16(uint16_t U) {
388bcb0991SDimitry Andric   const uint16_t Swapped = support::endian::byte_swap(U, ByteOrder);
398bcb0991SDimitry Andric   OS.write(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped));
408bcb0991SDimitry Andric }
418bcb0991SDimitry Andric 
writeU32(uint32_t U)428bcb0991SDimitry Andric void FileWriter::writeU32(uint32_t U) {
438bcb0991SDimitry Andric   const uint32_t Swapped = support::endian::byte_swap(U, ByteOrder);
448bcb0991SDimitry Andric   OS.write(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped));
458bcb0991SDimitry Andric }
468bcb0991SDimitry Andric 
writeU64(uint64_t U)478bcb0991SDimitry Andric void FileWriter::writeU64(uint64_t U) {
488bcb0991SDimitry Andric   const uint64_t Swapped = support::endian::byte_swap(U, ByteOrder);
498bcb0991SDimitry Andric   OS.write(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped));
508bcb0991SDimitry Andric }
518bcb0991SDimitry Andric 
fixup32(uint32_t U,uint64_t Offset)528bcb0991SDimitry Andric void FileWriter::fixup32(uint32_t U, uint64_t Offset) {
538bcb0991SDimitry Andric   const uint32_t Swapped = support::endian::byte_swap(U, ByteOrder);
548bcb0991SDimitry Andric   OS.pwrite(reinterpret_cast<const char *>(&Swapped), sizeof(Swapped),
558bcb0991SDimitry Andric             Offset);
568bcb0991SDimitry Andric }
578bcb0991SDimitry Andric 
writeData(llvm::ArrayRef<uint8_t> Data)588bcb0991SDimitry Andric void FileWriter::writeData(llvm::ArrayRef<uint8_t> Data) {
598bcb0991SDimitry Andric   OS.write(reinterpret_cast<const char *>(Data.data()), Data.size());
608bcb0991SDimitry Andric }
618bcb0991SDimitry Andric 
writeNullTerminated(llvm::StringRef Str)628bcb0991SDimitry Andric void FileWriter::writeNullTerminated(llvm::StringRef Str) {
638bcb0991SDimitry Andric   OS << Str << '\0';
648bcb0991SDimitry Andric }
658bcb0991SDimitry Andric 
tell()668bcb0991SDimitry Andric uint64_t FileWriter::tell() {
678bcb0991SDimitry Andric   return OS.tell();
688bcb0991SDimitry Andric }
698bcb0991SDimitry Andric 
alignTo(size_t Align)708bcb0991SDimitry Andric void FileWriter::alignTo(size_t Align) {
718bcb0991SDimitry Andric   off_t Offset = OS.tell();
728bcb0991SDimitry Andric   off_t AlignedOffset = (Offset + Align - 1) / Align * Align;
738bcb0991SDimitry Andric   if (AlignedOffset == Offset)
748bcb0991SDimitry Andric     return;
758bcb0991SDimitry Andric   off_t PadCount = AlignedOffset - Offset;
768bcb0991SDimitry Andric   OS.write_zeros(PadCount);
778bcb0991SDimitry Andric }
78