13#ifndef LLVM_OBJECT_ARCHIVE_H
14#define LLVM_OBJECT_ARCHIVE_H
46 virtual std::unique_ptr<AbstractArchiveMemberHeader>
clone()
const = 0;
83 StringRef getRawAccessMode()
const override;
84 StringRef getRawLastModified()
const override;
110 std::unique_ptr<AbstractArchiveMemberHeader>
clone()
const override {
111 return std::make_unique<ArchiveMemberHeader>(*
this);
145 std::unique_ptr<AbstractArchiveMemberHeader>
clone()
const override {
146 return std::make_unique<BigArchiveMemberHeader>(*
this);
160 virtual void anchor();
168 std::unique_ptr<AbstractArchiveMemberHeader> Header;
181 : Parent(
C.Parent), Data(
C.Data), StartOfFile(
C.StartOfFile) {
183 Header =
C.Header->clone();
187 Parent = std::move(
C.Parent);
188 Header = std::move(
C.Header);
190 StartOfFile =
C.StartOfFile;
197 Parent = std::move(
C.Parent);
198 Header = std::move(
C.Header);
200 StartOfFile =
C.StartOfFile;
211 Header =
C.Header->clone();
213 StartOfFile =
C.StartOfFile;
219 assert(!Parent || !other.Parent || Parent == other.Parent);
220 return Data.begin() == other.Data.
begin();
231 return Header->getLastModified();
235 return Header->getRawLastModified();
242 return Header->getAccessMode();
278 return !(*
this == other);
282 auto NextChild =
C.getNext();
284 return NextChild.takeError();
285 C = std::move(*NextChild);
286 return Error::success();
299 : Parent(p), SymbolIndex(symi), StringIndex(stri) {}
302 return (Parent == other.Parent) && (SymbolIndex == other.SymbolIndex);
321 return symbol == other.symbol;
325 return !(*
this == other);
344 enum Kind { K_GNU, K_GNU64, K_BSD, K_DARWIN, K_DARWIN64, K_COFF, K_AIXBIG };
351 child_iterator child_begin(
Error &Err,
bool SkipInternal =
true)
const;
352 child_iterator child_end()
const;
354 bool SkipInternal =
true)
const {
355 return make_range(child_begin(Err, SkipInternal), child_end());
361 return make_range(symbol_begin(), symbol_end());
371 virtual bool isEmpty()
const;
372 bool hasSymbolTable()
const;
375 uint32_t getNumberOfSymbols()
const;
376 uint32_t getNumberOfECSymbols()
const;
380 return std::move(ThinBuffers);
383 std::unique_ptr<AbstractArchiveMemberHeader>
384 createArchiveMemberHeader(
const char *RawHeaderPtr,
uint64_t Size,
388 uint64_t getArchiveMagicLen()
const;
389 void setFirstRegular(
const Child &
C);
397 uint16_t FirstRegularStartOfFile = -1;
401 mutable std::vector<std::unique_ptr<MemoryBuffer>> ThinBuffers;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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.
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.
A table of densely packed, null-terminated strings indexed by offset.
Triple - Helper class for working with autoconf configuration names.
A wrapper class for fallible iterators.
A range adaptor for a pair of iterators.
const Child * operator->() const
bool operator==(const ChildFallibleIterator &other) const
const Child & operator*() const
bool operator!=(const ChildFallibleIterator &other) const
ChildFallibleIterator(const Child &C)
StringRef getRawLastModified() const
bool operator==(const Child &other) const
Child & operator=(const Child &C)
Expected< unsigned > getGID() const
uint64_t getDataOffset() const
Expected< StringRef > getRawName() const
Expected< unsigned > getUID() const
Child & operator=(Child &&C) noexcept
Expected< sys::fs::perms > getAccessMode() const
Expected< sys::TimePoint< std::chrono::seconds > > getLastModified() const
const Archive * getParent() const
LLVM_ABI Symbol getNext() const
Symbol(const Archive *p, uint32_t symi, uint32_t stri)
bool operator==(const Symbol &other) const
symbol_iterator & operator++()
const Symbol & operator*() const
bool operator!=(const symbol_iterator &other) const
const Symbol * operator->() const
symbol_iterator(const Symbol &s)
bool operator==(const symbol_iterator &other) const
iterator_range< symbol_iterator > symbols() const
virtual uint64_t getFirstChildOffset() const
Archive & operator=(Archive const &)=delete
StringRef getStringTable() const
StringRef getSymbolTable() const
iterator_range< child_iterator > children(Error &Err, bool SkipInternal=true) const
Archive(Archive const &)=delete
static bool classof(Binary const *v)
std::vector< std::unique_ptr< MemoryBuffer > > takeThinBuffers()
bool isEmpty() const override
bool Has32BitGlobalSymtab
uint64_t getLastChildOffset() const
std::string MergedGlobalSymtabBuf
bool Has64BitGlobalSymtab
const FixLenHdr * ArFixLenHdr
uint64_t FirstChildOffset
bool has32BitGlobalSymtab()
uint64_t getFirstChildOffset() const override
bool has64BitGlobalSymtab()
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
const char ArchiveMagic[]
const char ThinArchiveMagic[]
const char BigArchiveMagic[]
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 Magic[sizeof(BigArchiveMagic) - 1]
Big archive magic string.
char FirstChildOffset[20]
Offset to first archive member.
char LastChildOffset[20]
Offset to last archive member.
char FreeOffset[20]
Offset to first mem on free list.
char GlobSym64Offset[20]
Offset global symbol table for 64-bit objects.
char MemOffset[20]
Offset to member table.
char GlobSymOffset[20]
Offset to global symbol table.
char Size[10]
Size of data, not including header or padding.