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