Lines Matching full:archive
1 //===- Archive.cpp - ar File Format implementation ------------------------===//
13 #include "llvm/Object/Archive.h"
42 void Archive::anchor() {} in anchor()
45 std::string StringMsg = "truncated or malformed archive (" + Msg.str() + ")"; in malformedError()
53 StringRef Msg("remaining size of archive too small for next archive " in createMemberHeaderParseError()
95 ArchiveMemberHeader::ArchiveMemberHeader(const Archive *Parent, in ArchiveMemberHeader()
115 std::string Msg("terminator characters in archive member \"" + Buf + in ArchiveMemberHeader()
116 "\" not the correct \"`\\n\" values for the archive " in ArchiveMemberHeader()
130 BigArchiveMemberHeader::BigArchiveMemberHeader(const Archive *Parent, in BigArchiveMemberHeader()
141 *Err = malformedError("malformed AIX big archive: remaining buffer is " in BigArchiveMemberHeader()
142 "unable to contain next archive member"); in BigArchiveMemberHeader()
154 // valid for the kind of archive. If it is not valid it returns an Error.
158 if (Kind == Archive::K_BSD || Kind == Archive::K_DARWIN64) { in getRawName()
162 return malformedError("name contains a leading space for archive member " in getRawName()
182 const Archive *Parent, in getArchiveMemberDecField()
188 " field in archive member header are not " in getArchiveMemberDecField()
191 "' for the archive " in getArchiveMemberDecField()
200 const Archive *Parent, in getArchiveMemberOctField()
206 " field in archive member header are not " in getArchiveMemberOctField()
209 "' for the archive " in getArchiveMemberOctField()
236 "name does not have name terminator \"`\\n\" for archive member" in getRawName()
248 // archive header is truncated to produce an error message with the name. in getName()
253 return malformedError("archive header truncated before the name field " in getName()
254 "for archive member header at offset " + in getName()
290 Buf + "' for archive member header at offset " + in getName()
299 " past the end of the string table for archive " in getName()
305 if (Parent->kind() == Archive::K_GNU || in getName()
306 Parent->kind() == Archive::K_GNU64) { in getName()
329 Buf + "' for archive member header at offset " + in getName()
336 " extends past the end of the member or archive " in getName()
337 "for archive member header at offset " + in getName()
462 Archive::Child::Child(const Archive *Parent, StringRef Data, in Child()
468 Archive::Child::Child(const Archive *Parent, const char *Start, Error *Err) in Child()
523 if (Parent->kind() == Archive::K_AIXBIG) { in Child()
535 "' for archive member header at offset " + in Child()
543 Expected<uint64_t> Archive::Child::getSize() const { in getSize()
549 Expected<uint64_t> Archive::Child::getRawSize() const { in getRawSize()
553 Expected<bool> Archive::Child::isThinMember() const { return Header->isThin(); } in isThinMember()
555 Expected<std::string> Archive::Child::getFullName() const { in getFullName()
573 Expected<StringRef> Archive::Child::getBuffer() const { in getBuffer()
595 Expected<Archive::Child> Archive::Child::getNext() const { in getNext()
602 // Check to see if this is at the end of the archive. in getNext()
606 // Check to see if this is past the end of the archive. in getNext()
608 std::string Msg("offset to next archive member past the end of the archive " in getNext()
626 uint64_t Archive::Child::getChildOffset() const { in getChildOffset()
633 Expected<StringRef> Archive::Child::getName() const { in getName()
646 Expected<MemoryBufferRef> Archive::Child::getMemoryBufferRef() const { in getMemoryBufferRef()
658 Archive::Child::getAsBinary(LLVMContext *Context) const { in getAsBinary()
669 Expected<std::unique_ptr<Archive>> Archive::create(MemoryBufferRef Source) { in create()
671 std::unique_ptr<Archive> Ret; in create()
677 Ret = std::make_unique<Archive>(Source, Err); in create()
685 Archive::createArchiveMemberHeader(const char *RawHeaderPtr, uint64_t Size, in createArchiveMemberHeader()
694 uint64_t Archive::getArchiveMagicLen() const { in getArchiveMagicLen()
704 void Archive::setFirstRegular(const Child &C) { in setFirstRegular()
709 Archive::Archive(MemoryBufferRef Source, Error &Err) in Archive() function in Archive
723 Err = make_error<GenericBinaryError>("file too small to be an archive", in Archive()
730 // archive which is the same in all formats. So claiming it to be gnu to is in Archive()
741 // See if this is a valid empty archive and if so return. in Archive()
763 // Below is the pattern that is used to figure out the archive format in Archive()
764 // GNU archive format in Archive()
768 // BSD archive format in Archive()
772 // of the filename that needs to be read after the archive header in Archive()
773 // COFF archive format in Archive()
972 object::Archive::Kind Archive::getDefaultKindForTriple(Triple &T) { in getDefaultKindForTriple()
974 return object::Archive::K_DARWIN; in getDefaultKindForTriple()
976 return object::Archive::K_AIXBIG; in getDefaultKindForTriple()
978 return object::Archive::K_COFF; in getDefaultKindForTriple()
979 return object::Archive::K_GNU; in getDefaultKindForTriple()
982 object::Archive::Kind Archive::getDefaultKind() { in getDefaultKind()
987 Archive::child_iterator Archive::child_begin(Error &Err, in child_begin()
1003 Archive::child_iterator Archive::child_end() const { in child_end()
1007 bool Archive::Symbol::isECSymbol() const { in isECSymbol()
1015 StringRef Archive::Symbol::getName() const { in getName()
1021 Expected<Archive::Child> Archive::Symbol::getMember() const { in getMember()
1039 // the archive of the member that defines the symbol. Which is what in getMember()
1047 // the archive of the member that defines the symbol. Which is what in getMember()
1091 Archive::Symbol Archive::Symbol::getNext() const { in getNext()
1104 // and the second being the offset into the archive of the member that in getNext()
1133 Archive::symbol_iterator Archive::symbol_begin() const { in symbol_begin()
1149 // and the second being the offset into the archive of the member that in symbol_begin()
1165 // table offset and the second being the offset into the archive of the in symbol_begin()
1191 Archive::symbol_iterator Archive::symbol_end() const { in symbol_end()
1195 Expected<iterator_range<Archive::symbol_iterator>> Archive::ec_symbols() const { in ec_symbols()
1240 uint32_t Archive::getNumberOfSymbols() const { in getNumberOfSymbols()
1258 uint32_t Archive::getNumberOfECSymbols() const { in getNumberOfECSymbols()
1264 Expected<std::optional<Archive::Child>> Archive::findSym(StringRef name) const { in findSym()
1265 Archive::symbol_iterator bs = symbol_begin(); in findSym()
1266 Archive::symbol_iterator es = symbol_end(); in findSym()
1280 // Returns true if archive file contains no member file.
1281 bool Archive::isEmpty() const { in isEmpty()
1285 bool Archive::hasSymbolTable() const { return !SymbolTable.empty(); } in hasSymbolTable()
1328 // In a big archive, a global symbol table contains the following information: in appendGlobalSymbolTableInfo()
1330 // - The array of offsets into the archive file. The length is eight in appendGlobalSymbolTableInfo()
1347 : Archive(Source, Err) { in BigArchive()
1354 Err = malformedError("malformed AIX big archive: incomplete fixed length " in BigArchive()
1355 "header, the archive is only" + in BigArchive()
1363 Err = malformedError("malformed AIX big archive: first member offset \"" + in BigArchive()
1369 Err = malformedError("malformed AIX big archive: last member offset \"" + in BigArchive()
1427 // In order to let the Archive::Symbol::getNext() work for both 32-bit and in BigArchive()