LLVM: include/llvm/Object/Archive.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef LLVM_OBJECT_ARCHIVE_H
14#define LLVM_OBJECT_ARCHIVE_H
15
25#include
26#include
27#include
28#include
29#include
30
31namespace llvm {
33
37
39
41protected:
43
44public:
46 virtual std::unique_ptr clone() const = 0;
48
49
55
56
60
61
64
70
71
72
74
76};
77
78template
80public:
83 StringRef getRawAccessMode() const override;
84 StringRef getRawLastModified() const override;
85 StringRef getRawUID() const override;
86 StringRef getRawGID() const override;
87
90
92};
93
103
106public:
109
110 std::unique_ptr clone() const override {
111 return std::make_unique(*this);
112 }
113
115
120};
121
122
137
138
141
142public:
145 std::unique_ptr clone() const override {
146 return std::make_unique(*this);
147 }
148
151
157};
158
160 virtual void anchor();
161
162public:
164 friend Archive;
165 friend AbstractArchiveMemberHeader;
166
167 const Archive *Parent;
168 std::unique_ptr Header;
169
171
173
175
176 public:
177 LLVM_ABI Child(const Archive *Parent, const char *Start, Error *Err);
179
181 : Parent(C.Parent), Data(C.Data), StartOfFile(C.StartOfFile) {
182 if (C.Header)
183 Header = C.Header->clone();
184 }
185
187 Parent = std::move(C.Parent);
188 Header = std::move(C.Header);
189 Data = C.Data;
190 StartOfFile = C.StartOfFile;
191 }
192
194 if (&C == this)
195 return *this;
196
197 Parent = std::move(C.Parent);
198 Header = std::move(C.Header);
199 Data = C.Data;
200 StartOfFile = C.StartOfFile;
201
202 return *this;
203 }
204
206 if (&C == this)
207 return *this;
208
209 Parent = C.Parent;
210 if (C.Header)
211 Header = C.Header->clone();
212 Data = C.Data;
213 StartOfFile = C.StartOfFile;
214
215 return *this;
216 }
217
219 assert(!Parent || !other.Parent || Parent == other.Parent);
220 return Data.begin() == other.Data.begin();
221 }
222
223 const Archive *getParent() const { return Parent; }
225
229
231 return Header->getLastModified();
232 }
233
235 return Header->getRawLastModified();
236 }
237
240
242 return Header->getAccessMode();
243 }
244
245
247
249
253
255
257 getAsBinary(LLVMContext *Context = nullptr) const;
258 };
259
262
263 public:
266
269
271
272
273
274 return C == other.C;
275 }
276
278 return !(*this == other);
279 }
280
282 auto NextChild = C.getNext();
283 if (!NextChild)
284 return NextChild.takeError();
285 C = std::move(*NextChild);
287 }
288 };
289
291
295 uint32_t StringIndex;
296
297 public:
299 : Parent(p), SymbolIndex(symi), StringIndex(stri) {}
300
302 return (Parent == other.Parent) && (SymbolIndex == other.SymbolIndex);
303 }
304
308 LLVM_ABI bool isECSymbol() const;
309 };
310
313
314 public:
316
319
321 return symbol == other.symbol;
322 }
323
325 return !(*this == other);
326 }
327
329 symbol = symbol.getNext();
330 return *this;
331 }
332 };
333
336
337
340
341
343
345
347 bool isThin() const { return IsThin; }
350
351 child_iterator child_begin(Error &Err, bool SkipInternal = true) const;
352 child_iterator child_end() const;
354 bool SkipInternal = true) const {
356 }
357
363
365
366 static bool classof(Binary const *v) { return v->isArchive(); }
367
368
370
371 virtual bool isEmpty() const;
372 bool hasSymbolTable() const;
375 uint32_t getNumberOfSymbols() const;
376 uint32_t getNumberOfECSymbols() const;
378
380 return std::move(ThinBuffers);
381 }
382
383 std::unique_ptr
384 createArchiveMemberHeader(const char *RawHeaderPtr, uint64_t Size,
385 Error *Err) const;
386
387protected:
388 uint64_t getArchiveMagicLen() const;
389 void setFirstRegular(const Child &C);
390
394
395private:
397 uint16_t FirstRegularStartOfFile = -1;
398
399 unsigned Format : 3;
400 unsigned IsThin : 1;
401 mutable std::vector<std::unique_ptr> ThinBuffers;
402};
403
405public:
406
417
424
425public:
430
433};
434
435}
436}
437
438#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static StringRef getName(Value *V)
static std::optional< int32_t > getOffset(ArrayRef< int32_t > Offsets, size_t Idx)
static unsigned getSize(unsigned Kind)
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
This is an important class for using LLVM in a threaded context.
StringRef - Represent a constant reference to a string, i.e.
Triple - Helper class for working with autoconf configuration names.
A wrapper class for fallible iterators.
A range adaptor for a pair of iterators.
ChildFallibleIterator()
Definition Archive.h:264
Error inc()
Definition Archive.h:281
const Child * operator->() const
Definition Archive.h:267
bool operator==(const ChildFallibleIterator &other) const
Definition Archive.h:270
const Child & operator*() const
Definition Archive.h:268
bool operator!=(const ChildFallibleIterator &other) const
Definition Archive.h:277
ChildFallibleIterator(const Child &C)
Definition Archive.h:265
StringRef getRawLastModified() const
Definition Archive.h:234
bool operator==(const Child &other) const
Definition Archive.h:218
LLVM_ABI uint64_t getChildOffset() const
Child & operator=(const Child &C)
Definition Archive.h:205
Expected< unsigned > getGID() const
Definition Archive.h:239
uint64_t getDataOffset() const
Definition Archive.h:252
Expected< StringRef > getRawName() const
Definition Archive.h:228
Expected< unsigned > getUID() const
Definition Archive.h:238
LLVM_ABI Child(const Archive *Parent, const char *Start, Error *Err)
Child & operator=(Child &&C) noexcept
Definition Archive.h:193
Expected< sys::fs::perms > getAccessMode() const
Definition Archive.h:241
Expected< sys::TimePoint< std::chrono::seconds > > getLastModified() const
Definition Archive.h:230
const Archive * getParent() const
Definition Archive.h:223
Child(Child &&C)
Definition Archive.h:186
Child(const Child &C)
Definition Archive.h:180
Symbol(const Archive *p, uint32_t symi, uint32_t stri)
Definition Archive.h:298
bool operator==(const Symbol &other) const
Definition Archive.h:301
symbol_iterator & operator++()
Definition Archive.h:328
const Symbol & operator*() const
Definition Archive.h:318
bool operator!=(const symbol_iterator &other) const
Definition Archive.h:324
const Symbol * operator->() const
Definition Archive.h:317
symbol_iterator(const Symbol &s)
Definition Archive.h:315
bool operator==(const symbol_iterator &other) const
Definition Archive.h:320
symbol_iterator symbol_begin() const
iterator_range< symbol_iterator > symbols() const
Definition Archive.h:360
virtual uint64_t getFirstChildOffset() const
Definition Archive.h:377
bool isThin() const
Definition Archive.h:347
Archive & operator=(Archive const &)=delete
StringRef getStringTable() const
Definition Archive.h:374
fallible_iterator< ChildFallibleIterator > child_iterator
Definition Archive.h:290
uint64_t getArchiveMagicLen() const
StringRef getSymbolTable() const
Definition Archive.h:373
StringRef ECSymbolTable
Definition Archive.h:392
symbol_iterator symbol_end() const
iterator_range< child_iterator > children(Error &Err, bool SkipInternal=true) const
Definition Archive.h:353
child_iterator child_end() const
Archive(Archive const &)=delete
static bool classof(Binary const *v)
Definition Archive.h:366
StringRef StringTable
Definition Archive.h:393
Archive(MemoryBufferRef Source, Error &Err)
Kind kind() const
Definition Archive.h:346
StringRef SymbolTable
Definition Archive.h:391
Kind
Definition Archive.h:344
@ K_AIXBIG
Definition Archive.h:344
@ K_DARWIN
Definition Archive.h:344
@ K_GNU
Definition Archive.h:344
@ K_BSD
Definition Archive.h:344
@ K_COFF
Definition Archive.h:344
@ K_DARWIN64
Definition Archive.h:344
@ K_GNU64
Definition Archive.h:344
child_iterator child_begin(Error &Err, bool SkipInternal=true) const
static const uint64_t MaxMemberSize
Size field is 10 decimal digits long.
Definition Archive.h:342
std::vector< std::unique_ptr< MemoryBuffer > > takeThinBuffers()
Definition Archive.h:379
bool isEmpty() const override
Definition Archive.h:429
bool Has32BitGlobalSymtab
Definition Archive.h:422
uint64_t getLastChildOffset() const
Definition Archive.h:428
std::string MergedGlobalSymtabBuf
Definition Archive.h:421
bool Has64BitGlobalSymtab
Definition Archive.h:423
const FixLenHdr * ArFixLenHdr
Definition Archive.h:418
uint64_t FirstChildOffset
Definition Archive.h:419
uint64_t LastChildOffset
Definition Archive.h:420
bool has32BitGlobalSymtab()
Definition Archive.h:431
uint64_t getFirstChildOffset() const override
Definition Archive.h:427
bool has64BitGlobalSymtab()
Definition Archive.h:432
LLVM_ABI BigArchive(MemoryBufferRef Source, Error &Err)
Binary(unsigned int Type, MemoryBufferRef Source)
MemoryBufferRef getMemoryBufferRef() const
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
@ C
The default llvm calling convention, compatible with C.
const char ArchiveMagic[]
Definition Archive.h:34
const char ThinArchiveMagic[]
Definition Archive.h:35
const char BigArchiveMagic[]
Definition Archive.h:36
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
char AccessMode[12]
Definition Archive.h:130
char Terminator[2]
Definition Archive.h:134
char NextOffset[20]
Definition Archive.h:125
char LastModified[12]
Definition Archive.h:127
char PrevOffset[20]
Definition Archive.h:126
char Size[20]
Definition Archive.h:124
char UID[12]
Definition Archive.h:128
char NameLen[4]
Definition Archive.h:131
char GID[12]
Definition Archive.h:129
char Name[2]
Definition Archive.h:133
Fixed-Length Header.
Definition Archive.h:407
char Magic[sizeof(BigArchiveMagic) - 1]
Big archive magic string.
Definition Archive.h:408
char FirstChildOffset[20]
Offset to first archive member.
Definition Archive.h:413
char LastChildOffset[20]
Offset to last archive member.
Definition Archive.h:414
char FreeOffset[20]
Offset to first mem on free list.
Definition Archive.h:415
char GlobSym64Offset[20]
Offset global symbol table for 64-bit objects.
Definition Archive.h:412
char MemOffset[20]
Offset to member table.
Definition Archive.h:409
char GlobSymOffset[20]
Offset to global symbol table.
Definition Archive.h:410
char Terminator[2]
Definition Archive.h:101
char UID[6]
Definition Archive.h:97
char AccessMode[8]
Definition Archive.h:99
char LastModified[12]
Definition Archive.h:96
char GID[6]
Definition Archive.h:98
char Size[10]
Size of data, not including header or padding.
Definition Archive.h:100
char Name[16]
Definition Archive.h:95