LLVM 20.0.0git
Header.cpp
Go to the documentation of this file.
1//===- Header.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-exception
6//
7//===----------------------------------------------------------------------===//
8
12#include "llvm/Support/Format.h"
14
15#define HEX8(v) llvm::format_hex(v, 4)
16#define HEX16(v) llvm::format_hex(v, 6)
17#define HEX32(v) llvm::format_hex(v, 10)
18#define HEX64(v) llvm::format_hex(v, 18)
19
20using namespace llvm;
21using namespace gsym;
22
24 OS << "Header:\n";
25 OS << " Magic = " << HEX32(H.Magic) << "\n";
26 OS << " Version = " << HEX16(H.Version) << '\n';
27 OS << " AddrOffSize = " << HEX8(H.AddrOffSize) << '\n';
28 OS << " UUIDSize = " << HEX8(H.UUIDSize) << '\n';
29 OS << " BaseAddress = " << HEX64(H.BaseAddress) << '\n';
30 OS << " NumAddresses = " << HEX32(H.NumAddresses) << '\n';
31 OS << " StrtabOffset = " << HEX32(H.StrtabOffset) << '\n';
32 OS << " StrtabSize = " << HEX32(H.StrtabSize) << '\n';
33 OS << " UUID = ";
34 for (uint8_t I = 0; I < H.UUIDSize; ++I)
35 OS << format_hex_no_prefix(H.UUID[I], 2);
36 OS << '\n';
37 return OS;
38}
39
40/// Check the header and detect any errors.
42 if (Magic != GSYM_MAGIC)
43 return createStringError(std::errc::invalid_argument,
44 "invalid GSYM magic 0x%8.8x", Magic);
45 if (Version != GSYM_VERSION)
46 return createStringError(std::errc::invalid_argument,
47 "unsupported GSYM version %u", Version);
48 switch (AddrOffSize) {
49 case 1: break;
50 case 2: break;
51 case 4: break;
52 case 8: break;
53 default:
54 return createStringError(std::errc::invalid_argument,
55 "invalid address offset size %u",
57 }
59 return createStringError(std::errc::invalid_argument,
60 "invalid UUID size %u", UUIDSize);
61 return Error::success();
62}
63
65 uint64_t Offset = 0;
66 // The header is stored as a single blob of data that has a fixed byte size.
67 if (!Data.isValidOffsetForDataOfSize(Offset, sizeof(Header)))
68 return createStringError(std::errc::invalid_argument,
69 "not enough data for a gsym::Header");
70 Header H;
71 H.Magic = Data.getU32(&Offset);
72 H.Version = Data.getU16(&Offset);
73 H.AddrOffSize = Data.getU8(&Offset);
74 H.UUIDSize = Data.getU8(&Offset);
75 H.BaseAddress = Data.getU64(&Offset);
76 H.NumAddresses = Data.getU32(&Offset);
77 H.StrtabOffset = Data.getU32(&Offset);
78 H.StrtabSize = Data.getU32(&Offset);
79 Data.getU8(&Offset, H.UUID, GSYM_MAX_UUID_SIZE);
80 if (llvm::Error Err = H.checkForError())
81 return std::move(Err);
82 return H;
83}
84
86 // Users must verify the Header is valid prior to calling this funtion.
87 if (llvm::Error Err = checkForError())
88 return Err;
89 O.writeU32(Magic);
90 O.writeU16(Version);
91 O.writeU8(AddrOffSize);
92 O.writeU8(UUIDSize);
93 O.writeU64(BaseAddress);
94 O.writeU32(NumAddresses);
95 O.writeU32(StrtabOffset);
96 O.writeU32(StrtabSize);
97 O.writeData(llvm::ArrayRef<uint8_t>(UUID));
98 return Error::success();
99}
100
101bool llvm::gsym::operator==(const Header &LHS, const Header &RHS) {
102 return LHS.Magic == RHS.Magic && LHS.Version == RHS.Version &&
103 LHS.AddrOffSize == RHS.AddrOffSize && LHS.UUIDSize == RHS.UUIDSize &&
104 LHS.BaseAddress == RHS.BaseAddress &&
105 LHS.NumAddresses == RHS.NumAddresses &&
106 LHS.StrtabOffset == RHS.StrtabOffset &&
107 LHS.StrtabSize == RHS.StrtabSize &&
108 memcmp(LHS.UUID, RHS.UUID, LHS.UUIDSize) == 0;
109}
#define HEX8(v)
Definition: Header.cpp:15
#define HEX16(v)
Definition: Header.cpp:16
#define HEX64(v)
Definition: Header.cpp:18
#define HEX32(v)
Definition: Header.cpp:17
#define I(x, y, z)
Definition: MD5.cpp:58
#define H(x, y, z)
Definition: MD5.cpp:57
Merge contiguous icmps into a memcmp
Definition: MergeICmps.cpp:911
raw_pwrite_stream & OS
std::pair< llvm::MachO::Target, std::string > UUID
Value * RHS
Value * LHS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
static ErrorSuccess success()
Create a success value.
Definition: Error.h:337
Tagged union holding either a T or a Error.
Definition: Error.h:481
A simplified binary data writer class that doesn't require targets, target definitions,...
Definition: FileWriter.h:29
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
raw_ostream & operator<<(raw_ostream &OS, const FunctionInfo &R)
constexpr size_t GSYM_MAX_UUID_SIZE
Definition: Header.h:27
bool operator==(const FunctionInfo &LHS, const FunctionInfo &RHS)
Definition: FunctionInfo.h:206
constexpr uint32_t GSYM_MAGIC
Definition: Header.h:24
constexpr uint32_t GSYM_VERSION
Definition: Header.h:26
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Definition: Error.h:1286
FormattedNumber format_hex_no_prefix(uint64_t N, unsigned Width, bool Upper=false)
format_hex_no_prefix - Output N as a fixed width hexadecimal.
Definition: Format.h:200
The GSYM header.
Definition: Header.h:45
uint16_t Version
The version can number determines how the header is decoded and how each InfoType in FunctionInfo is ...
Definition: Header.h:54
uint8_t AddrOffSize
The size in bytes of each address offset in the address offsets table.
Definition: Header.h:56
static llvm::Expected< Header > decode(DataExtractor &Data)
Decode an object from a binary data stream.
Definition: Header.cpp:64
uint32_t Magic
The magic bytes should be set to GSYM_MAGIC.
Definition: Header.h:49
llvm::Error encode(FileWriter &O) const
Encode this object into FileWriter stream.
Definition: Header.cpp:85
uint32_t StrtabOffset
The file relative offset of the start of the string table for strings contained in the GSYM file.
Definition: Header.h:72
uint32_t StrtabSize
The size in bytes of the string table.
Definition: Header.h:80
uint8_t UUIDSize
The size in bytes of the UUID encoded in the "UUID" member.
Definition: Header.h:58
llvm::Error checkForError() const
Check if a header is valid and return an error if anything is wrong.
Definition: Header.cpp:41
uint32_t NumAddresses
The number of addresses stored in the address offsets table.
Definition: Header.h:64
uint64_t BaseAddress
The 64 bit base address that all address offsets in the address offsets table are relative to.
Definition: Header.h:62