LLVM 24.0.0git
GOFF.h
Go to the documentation of this file.
1//===- GOFF.h - GOFF object file implementation -----------------*- 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//
9// This file declares the GOFFObjectFile class.
10// Record classes and derivatives are also declared and implemented.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_OBJECT_GOFF_H
15#define LLVM_OBJECT_GOFF_H
16
20#include "llvm/Support/Debug.h"
21#include "llvm/Support/Endian.h"
23
24namespace llvm {
25namespace object {
26
27/// \brief Represents a GOFF physical record.
28///
29/// Specifies protected member functions to manipulate the record. These should
30/// be called from deriving classes to change values as that record specifies.
31class Record {
32public:
33 static bool isContinued(const uint8_t *Record) {
34 uint8_t IsContinued;
35 getBits(Record, 1, 7, 1, IsContinued);
36 return IsContinued;
37 }
38
39 static bool isContinuation(const uint8_t *Record) {
40 uint8_t IsContinuation;
41 getBits(Record, 1, 6, 1, IsContinuation);
42 return IsContinuation;
43 }
44
45protected:
46 /// \brief Get bit field of specified byte.
47 ///
48 /// Used to pack bit fields into one byte. Fields are packed left to right.
49 /// Bit index zero is the most significant bit of the byte.
50 ///
51 /// \param ByteIndex index of byte the field is in.
52 /// \param BitIndex index of first bit of field.
53 /// \param Length length of bit field.
54 /// \param Value value of bit field.
55 static void getBits(const uint8_t *Bytes, uint8_t ByteIndex, uint8_t BitIndex,
57 assert(ByteIndex < GOFF::RecordLength && "Byte index out of bounds!");
58 assert(BitIndex < 8 && "Bit index out of bounds!");
59 assert(Length + BitIndex <= 8 && "Bit length too long!");
60
61 get<uint8_t>(Bytes, ByteIndex, Value);
62 Value = (Value >> (8 - BitIndex - Length)) & ((1 << Length) - 1);
63 }
64
65 template <class T>
66 static void get(const uint8_t *Bytes, uint8_t ByteIndex, T &Value) {
67 assert(ByteIndex + sizeof(T) <= GOFF::RecordLength &&
68 "Byte index out of bounds!");
70 }
71};
72
73class TXTRecord : public Record {
74public:
75 /// \brief Maximum length of data; any more must go in continuation.
76 static const uint8_t TXTMaxDataLength = 56;
77
78 static void getElementEsdId(const uint8_t *Record, uint32_t &EsdId) {
79 get<uint32_t>(Record, 4, EsdId);
80 }
81
82 static void getOffset(const uint8_t *Record, uint32_t &Offset) {
84 }
85
86 static void getDataLength(const uint8_t *Record, uint16_t &Length) {
88 }
89};
90
91class HDRRecord : public Record {
92public:
98};
99
100class ESDRecord : public Record {
101public:
102 /// \brief Number of bytes for name; any more must go in continuation.
103 /// This is the number of bytes that can fit into the data field of an ESD
104 /// record.
106
107 /// \brief Maximum name length for ESD records and continuations.
108 /// This is the number of bytes that can fit into the data field of an ESD
109 /// record AND following continuations. This is limited fundamentally by the
110 /// 16 bit SIGNED length field.
111 static const uint16_t MaxNameLength = 32 * 1024;
112
113public:
114 // ESD Get routines.
121
122 static void getEsdId(const uint8_t *Record, uint32_t &EsdId) {
123 get<uint32_t>(Record, 4, EsdId);
124 }
125
126 static void getParentEsdId(const uint8_t *Record, uint32_t &EsdId) {
127 get<uint32_t>(Record, 8, EsdId);
128 }
129
130 static void getOffset(const uint8_t *Record, uint32_t &Offset) {
132 }
133
134 static void getLength(const uint8_t *Record, uint32_t &Length) {
136 }
137
143
144 static void getFillBytePresent(const uint8_t *Record, bool &Present) {
146 getBits(Record, 41, 0, 1, Value);
147 Present = (bool)Value;
148 }
149
150 static void getNameMangled(const uint8_t *Record, bool &Mangled) {
152 getBits(Record, 41, 1, 1, Value);
153 Mangled = (bool)Value;
154 }
155
156 static void getRenamable(const uint8_t *Record, bool &Renamable) {
158 getBits(Record, 41, 2, 1, Value);
160 }
161
162 static void getRemovable(const uint8_t *Record, bool &Removable) {
164 getBits(Record, 41, 3, 1, Value);
165 Removable = (bool)Value;
166 }
167
168 static void getFillByteValue(const uint8_t *Record, uint8_t &Fill) {
169 get<uint8_t>(Record, 42, Fill);
170 }
171
172 static void getAdaEsdId(const uint8_t *Record, uint32_t &EsdId) {
173 get<uint32_t>(Record, 44, EsdId);
174 }
175
176 static void getSortPriority(const uint8_t *Record, uint32_t &Priority) {
177 get<uint32_t>(Record, 48, Priority);
178 }
179
180 static void getAmode(const uint8_t *Record, GOFF::ESDAmode &Amode) {
183 Amode = (GOFF::ESDAmode)Value;
184 }
185
186 static void getRmode(const uint8_t *Record, GOFF::ESDRmode &Rmode) {
189 Rmode = (GOFF::ESDRmode)Value;
190 }
191
192 static void getTextStyle(const uint8_t *Record, GOFF::ESDTextStyle &Style) {
194 getBits(Record, 62, 0, 4, Value);
195 Style = (GOFF::ESDTextStyle)Value;
196 }
197
199 GOFF::ESDBindingAlgorithm &Algorithm) {
201 getBits(Record, 62, 4, 4, Value);
202 Algorithm = (GOFF::ESDBindingAlgorithm)Value;
203 }
204
206 GOFF::ESDTaskingBehavior &TaskingBehavior) {
208 getBits(Record, 63, 0, 3, Value);
209 TaskingBehavior = (GOFF::ESDTaskingBehavior)Value;
210 }
211
212 static void getReadOnly(const uint8_t *Record, bool &ReadOnly) {
214 getBits(Record, 63, 4, 1, Value);
216 }
217
218 static void getExecutable(const uint8_t *Record,
219 GOFF::ESDExecutable &Executable) {
221 getBits(Record, 63, 5, 3, Value);
222 Executable = (GOFF::ESDExecutable)Value;
223 }
224
231
233 GOFF::ESDBindingStrength &Strength) {
235 getBits(Record, 64, 4, 4, Value);
237 }
238
240 GOFF::ESDLoadingBehavior &Behavior) {
242 getBits(Record, 65, 0, 2, Value);
244 }
245
246 static void getIndirectReference(const uint8_t *Record, bool &Indirect) {
248 getBits(Record, 65, 3, 1, Value);
249 Indirect = (bool)Value;
250 }
251
252 static void getBindingScope(const uint8_t *Record,
253 GOFF::ESDBindingScope &Scope) {
255 getBits(Record, 65, 4, 4, Value);
257 }
258
259 static void getLinkageType(const uint8_t *Record,
262 getBits(Record, 66, 2, 1, Value);
264 }
265
266 static void getAlignment(const uint8_t *Record,
267 GOFF::ESDAlignment &Alignment) {
269 getBits(Record, 66, 3, 5, Value);
270 Alignment = (GOFF::ESDAlignment)Value;
271 }
272
276 return Length;
277 }
278};
279
280class RLDRecord : public Record {
281public:
284 }
285};
286
287class ENDRecord : public Record {
288public:
292 return Length;
293 }
294};
295
296} // end namespace object
297} // end namespace llvm
298
299#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define T
This file defines the SmallString class.
This file defines the SmallVector class.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM Value Representation.
Definition Value.h:75
static uint16_t getNameLength(const uint8_t *Record)
Definition GOFF.h:289
static void getIndirectReference(const uint8_t *Record, bool &Indirect)
Definition GOFF.h:246
static void getBindingStrength(const uint8_t *Record, GOFF::ESDBindingStrength &Strength)
Definition GOFF.h:232
static void getOffset(const uint8_t *Record, uint32_t &Offset)
Definition GOFF.h:130
static void getDuplicateSeverity(const uint8_t *Record, GOFF::ESDDuplicateSymbolSeverity &DSS)
Definition GOFF.h:225
static void getEsdId(const uint8_t *Record, uint32_t &EsdId)
Definition GOFF.h:122
static void getLoadingBehavior(const uint8_t *Record, GOFF::ESDLoadingBehavior &Behavior)
Definition GOFF.h:239
static void getNameMangled(const uint8_t *Record, bool &Mangled)
Definition GOFF.h:150
static void getTaskingBehavior(const uint8_t *Record, GOFF::ESDTaskingBehavior &TaskingBehavior)
Definition GOFF.h:205
static void getFillBytePresent(const uint8_t *Record, bool &Present)
Definition GOFF.h:144
static void getLength(const uint8_t *Record, uint32_t &Length)
Definition GOFF.h:134
static void getAdaEsdId(const uint8_t *Record, uint32_t &EsdId)
Definition GOFF.h:172
static void getBindingAlgorithm(const uint8_t *Record, GOFF::ESDBindingAlgorithm &Algorithm)
Definition GOFF.h:198
static void getAmode(const uint8_t *Record, GOFF::ESDAmode &Amode)
Definition GOFF.h:180
static const uint16_t MaxNameLength
Maximum name length for ESD records and continuations.
Definition GOFF.h:111
static void getReadOnly(const uint8_t *Record, bool &ReadOnly)
Definition GOFF.h:212
static void getRmode(const uint8_t *Record, GOFF::ESDRmode &Rmode)
Definition GOFF.h:186
static void getSortPriority(const uint8_t *Record, uint32_t &Priority)
Definition GOFF.h:176
static void getParentEsdId(const uint8_t *Record, uint32_t &EsdId)
Definition GOFF.h:126
static void getFillByteValue(const uint8_t *Record, uint8_t &Fill)
Definition GOFF.h:168
static void getSymbolType(const uint8_t *Record, GOFF::ESDSymbolType &SymbolType)
Definition GOFF.h:115
static void getTextStyle(const uint8_t *Record, GOFF::ESDTextStyle &Style)
Definition GOFF.h:192
static void getAlignment(const uint8_t *Record, GOFF::ESDAlignment &Alignment)
Definition GOFF.h:266
static void getLinkageType(const uint8_t *Record, GOFF::ESDLinkageType &Type)
Definition GOFF.h:259
static const uint8_t ESDMaxUncontinuedNameLength
Number of bytes for name; any more must go in continuation.
Definition GOFF.h:105
static uint16_t getNameLength(const uint8_t *Record)
Definition GOFF.h:273
static void getExecutable(const uint8_t *Record, GOFF::ESDExecutable &Executable)
Definition GOFF.h:218
static void getBindingScope(const uint8_t *Record, GOFF::ESDBindingScope &Scope)
Definition GOFF.h:252
static void getNameSpaceId(const uint8_t *Record, GOFF::ESDNameSpaceId &Id)
Definition GOFF.h:138
static void getRemovable(const uint8_t *Record, bool &Removable)
Definition GOFF.h:162
static void getRenamable(const uint8_t *Record, bool &Renamable)
Definition GOFF.h:156
static uint16_t getPropertyModuleLength(const uint8_t *Record)
Definition GOFF.h:93
static void getDataLength(const uint8_t *Record, uint16_t &Length)
Definition GOFF.h:282
Represents a GOFF physical record.
Definition GOFF.h:31
static void getBits(const uint8_t *Bytes, uint8_t ByteIndex, uint8_t BitIndex, uint8_t Length, uint8_t &Value)
Get bit field of specified byte.
Definition GOFF.h:55
static bool isContinued(const uint8_t *Record)
Definition GOFF.h:33
static void get(const uint8_t *Bytes, uint8_t ByteIndex, T &Value)
Definition GOFF.h:66
static bool isContinuation(const uint8_t *Record)
Definition GOFF.h:39
static void getElementEsdId(const uint8_t *Record, uint32_t &EsdId)
Definition GOFF.h:78
static const uint8_t TXTMaxDataLength
Maximum length of data; any more must go in continuation.
Definition GOFF.h:76
static void getDataLength(const uint8_t *Record, uint16_t &Length)
Definition GOFF.h:86
static void getOffset(const uint8_t *Record, uint32_t &Offset)
Definition GOFF.h:82
ESDLoadingBehavior
Definition GOFF.h:127
ESDBindingAlgorithm
Definition GOFF.h:97
ESDDuplicateSymbolSeverity
Definition GOFF.h:115
ESDTextStyle
Definition GOFF.h:91
ESDExecutable
Definition GOFF.h:109
ESDAlignment
Definition GOFF.h:144
ESDBindingScope
Definition GOFF.h:134
ESDLinkageType
Definition GOFF.h:142
constexpr uint8_t RecordLength
Length of the parts of a physical GOFF record.
Definition GOFF.h:28
ESDNameSpaceId
Definition GOFF.h:61
ESDSymbolType
Definition GOFF.h:53
ESDTaskingBehavior
Definition GOFF.h:102
ESDBindingStrength
Definition GOFF.h:122
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
Definition Endian.h:53
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
@ Length
Definition DWP.cpp:577
@ Renamable
Register that may be renamed.