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