10b57cec5SDimitry Andric //===- ArchiveWriter.h - ar archive file format writer ----------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // Declares the writeArchive function for writing an archive file. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #ifndef LLVM_OBJECT_ARCHIVEWRITER_H 140b57cec5SDimitry Andric #define LLVM_OBJECT_ARCHIVEWRITER_H 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "llvm/Object/Archive.h" 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric namespace llvm { 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric struct NewArchiveMember { 210b57cec5SDimitry Andric std::unique_ptr<MemoryBuffer> Buf; 220b57cec5SDimitry Andric StringRef MemberName; 230b57cec5SDimitry Andric sys::TimePoint<std::chrono::seconds> ModTime; 240b57cec5SDimitry Andric unsigned UID = 0, GID = 0, Perms = 0644; 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric NewArchiveMember() = default; 270b57cec5SDimitry Andric NewArchiveMember(MemoryBufferRef BufRef); 280b57cec5SDimitry Andric 2981ad6265SDimitry Andric // Detect the archive format from the object or bitcode file. This helps 3081ad6265SDimitry Andric // assume the archive format when creating or editing archives in the case 3181ad6265SDimitry Andric // one isn't explicitly set. 3281ad6265SDimitry Andric object::Archive::Kind detectKindFromObject() const; 3381ad6265SDimitry Andric 340b57cec5SDimitry Andric static Expected<NewArchiveMember> 350b57cec5SDimitry Andric getOldMember(const object::Archive::Child &OldMember, bool Deterministic); 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric static Expected<NewArchiveMember> getFile(StringRef FileName, 380b57cec5SDimitry Andric bool Deterministic); 390b57cec5SDimitry Andric }; 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric Expected<std::string> computeArchiveRelativePath(StringRef From, StringRef To); 420b57cec5SDimitry Andric 435f757f3fSDimitry Andric enum class SymtabWritingMode { 445f757f3fSDimitry Andric NoSymtab, // Do not write symbol table. 455f757f3fSDimitry Andric NormalSymtab, // Write symbol table. For the Big Archive format, write both 465f757f3fSDimitry Andric // 32-bit and 64-bit symbol tables. 475f757f3fSDimitry Andric BigArchive32, // Only write the 32-bit symbol table. 485f757f3fSDimitry Andric BigArchive64 // Only write the 64-bit symbol table. 495f757f3fSDimitry Andric }; 505f757f3fSDimitry Andric 510b57cec5SDimitry Andric Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, 525f757f3fSDimitry Andric SymtabWritingMode WriteSymtab, object::Archive::Kind Kind, 530b57cec5SDimitry Andric bool Deterministic, bool Thin, 5406c3fb27SDimitry Andric std::unique_ptr<MemoryBuffer> OldArchiveBuf = nullptr, 5506c3fb27SDimitry Andric bool IsEC = false); 56e8d8bef9SDimitry Andric 57e8d8bef9SDimitry Andric // writeArchiveToBuffer is similar to writeArchive but returns the Archive in a 58e8d8bef9SDimitry Andric // buffer instead of writing it out to a file. 59e8d8bef9SDimitry Andric Expected<std::unique_ptr<MemoryBuffer>> 605f757f3fSDimitry Andric writeArchiveToBuffer(ArrayRef<NewArchiveMember> NewMembers, 615f757f3fSDimitry Andric SymtabWritingMode WriteSymtab, object::Archive::Kind Kind, 625f757f3fSDimitry Andric bool Deterministic, bool Thin); 630b57cec5SDimitry Andric } 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric #endif 66