xref: /freebsd-src/contrib/llvm-project/llvm/lib/DebugInfo/GSYM/FileWriter.cpp (revision 8bcb0991864975618c09697b1aca10683346d9f0)
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