Bartleby 0.1.0
A symbol renaming toolkit
Loading...
Searching...
No Matches
Public Member Functions | List of all members
saq::bartleby::Bartleby::ArchiveWriter Class Reference

Archive builder that implements our multi format config. More...

Inheritance diagram for saq::bartleby::Bartleby::ArchiveWriter:

Public Member Functions

 ArchiveWriter (Bartleby &&B) noexcept
 Constructs an ArchiveWriter using a Bartleby handle.
 
llvm::Error buildMachOUniversalBinarySlices (llvm::SmallVectorImpl< llvm::object::Slice > &Slices, ArchiveMap &Archives) noexcept
 Constructs the slices needed for a fat Mach-O.
 
llvm::Error buildMachOUniversalBinary (llvm::StringRef OutFilepath) noexcept
 Builds a fat Mach-O file and writes the output to a file.
 
llvm::Expected< std::unique_ptr< llvm::MemoryBuffer > > buildMachOUniversalBinary () noexcept
 Builds a fat Mach-O file and returns its content.
 
llvm::Error build (llvm::StringRef OutFilepath) noexcept
 Builds the final archive and writes the content to a file.
 
llvm::Expected< std::unique_ptr< llvm::MemoryBuffer > > build () noexcept
 Builds the final archive and returns its content.
 
const llvm::objcopy::CommonConfig & getCommonConfig () const noexcept override
 
llvm::Expected< const llvm::objcopy::ELFConfig & > getELFConfig () const noexcept override
 
llvm::Expected< const llvm::objcopy::COFFConfig & > getCOFFConfig () const noexcept override
 
llvm::Expected< const llvm::objcopy::MachOConfig & > getMachOConfig () const noexcept override
 
llvm::Expected< const llvm::objcopy::WasmConfig & > getWasmConfig () const noexcept override
 
llvm::Expected< const llvm::objcopy::XCOFFConfig & > getXCOFFConfig () const noexcept override
 

Detailed Description

Archive builder that implements our multi format config.

See https://llvm.org/doxygen/classllvm_1_1objcopy_1_1MultiFormatConfig.html.

Constructor & Destructor Documentation

◆ ArchiveWriter()

saq::bartleby::Bartleby::ArchiveWriter::ArchiveWriter ( Bartleby &&  B)
inlinenoexcept

Constructs an ArchiveWriter using a Bartleby handle.

Parameters
[in]BBartleby handle.
67 : Handle(std::move(B)) {
68 const auto End = Handle.Symbols.end();
69 for (auto Entry = Handle.Symbols.begin(); Entry != End; ++Entry) {
70 const auto &Name = Entry->first();
71 const auto &Sym = Entry->getValue();
72 if (const auto OName = Sym.getOverwriteName(); OName) {
73 LLVM_DEBUG(llvm::dbgs() << "bartleby is going to rename '" << Name
74 << "' into '" << *OName << "'\n");
75 CommonConfig.SymbolsToRename[Name] = *OName;
76 }
77 }
78 }

Member Function Documentation

◆ build() [1/2]

llvm::Expected< std::unique_ptr< llvm::MemoryBuffer > > saq::bartleby::Bartleby::ArchiveWriter::build ( )
inlinenoexcept

Builds the final archive and returns its content.

Returns
A memory buffer or an error.
217 {
218 if (Handle.isMachOUniversalBinary()) {
220 }
221
222 if (auto Err = executeObjCopyOnObjects()) {
223 return Err;
224 }
225
226 return llvm::writeArchiveToBuffer(ArMembers,
227 /* WriteSymtab= */ true,
228 ArMembers[0].detectKindFromObject(),
229 /* Deterministic= */ true,
230 /* Thin= */ false);
231 }
llvm::Expected< std::unique_ptr< llvm::MemoryBuffer > > buildMachOUniversalBinary() noexcept
Builds a fat Mach-O file and returns its content.
Definition: ArchiveWriter.cpp:173

◆ build() [2/2]

llvm::Error saq::bartleby::Bartleby::ArchiveWriter::build ( llvm::StringRef  OutFilepath)
inlinenoexcept

Builds the final archive and writes the content to a file.

Parameters
OutFilepathPath to out file.
Returns
An error.
197 {
198 if (Handle.isMachOUniversalBinary()) {
199 return buildMachOUniversalBinary(OutFilepath);
200 }
201
202 if (auto Err = executeObjCopyOnObjects()) {
203 return Err;
204 }
205
206 return llvm::writeArchive(OutFilepath, ArMembers,
207 /* WriteSymtab= */ true,
208 ArMembers[0].detectKindFromObject(),
209 /* Deterministic= */ true,
210 /* Thin= */ false);
211 }

◆ buildMachOUniversalBinary() [1/2]

llvm::Expected< std::unique_ptr< llvm::MemoryBuffer > > saq::bartleby::Bartleby::ArchiveWriter::buildMachOUniversalBinary ( )
inlinenoexcept

Builds a fat Mach-O file and returns its content.

Returns
A memory buffer, or an error.
173 {
174 llvm::SmallVector<llvm::object::Slice, 3> Slices;
175 ArchiveMap Archives;
176
177 if (auto Err = buildMachOUniversalBinarySlices(Slices, Archives)) {
178 return Err;
179 }
180
181 llvm::SmallVector<char, 8192> Content;
182 llvm::raw_svector_ostream OS(Content);
183
184 if (auto Err = llvm::object::writeUniversalBinaryToStream(Slices, OS)) {
185 return Err;
186 }
187
188 return std::make_unique<llvm::SmallVectorMemoryBuffer>(std::move(Content),
189 false);
190 }
llvm::Error buildMachOUniversalBinarySlices(llvm::SmallVectorImpl< llvm::object::Slice > &Slices, ArchiveMap &Archives) noexcept
Constructs the slices needed for a fat Mach-O.
Definition: ArchiveWriter.cpp:86

◆ buildMachOUniversalBinary() [2/2]

llvm::Error saq::bartleby::Bartleby::ArchiveWriter::buildMachOUniversalBinary ( llvm::StringRef  OutFilepath)
inlinenoexcept

Builds a fat Mach-O file and writes the output to a file.

Parameters
OutFilepathPath to out file.
Returns
An error.
158 {
159 llvm::SmallVector<llvm::object::Slice, 3> Slices;
160 ArchiveMap Archives;
161
162 if (auto Err = buildMachOUniversalBinarySlices(Slices, Archives)) {
163 return Err;
164 }
165
166 return llvm::object::writeUniversalBinary(Slices, OutFilepath);
167 }

◆ buildMachOUniversalBinarySlices()

llvm::Error saq::bartleby::Bartleby::ArchiveWriter::buildMachOUniversalBinarySlices ( llvm::SmallVectorImpl< llvm::object::Slice > &  Slices,
ArchiveMap &  Archives 
)
inlinenoexcept

Constructs the slices needed for a fat Mach-O.

Parameters
[out]SlicesVector where to store slices.
[out]ArchivesVector where to write archives.
Returns
An error.
88 {
89 assert(Handle.isMachOUniversalBinary());
90
91 const auto &ObjFmtSet = std::get<ObjectFormatSet>(Handle.ObjFormat);
92
93 LLVM_DEBUG(for (const auto &Fmt
94 : ObjFmtSet) {
95 llvm::dbgs() << "object format in fat Mach-O: " << Fmt << '\n';
96 });
97
98 Archives.reserve(ObjFmtSet.size());
99 Slices.reserve(ObjFmtSet.size());
100
101 for (const auto &Obj : Handle.Objects) {
102 const auto Triple = Obj.Handle->makeTriple();
103 LLVM_DEBUG(llvm::dbgs()
104 << "got object, triple is " << Triple.str()
105 << ", object format is " << ObjectFormat{Triple} << '\n');
106 assert(ObjFmtSet.count(Triple) == 1);
107 auto FinalObjOrErr = executeObjCopyOnObject(Obj);
108 if (!FinalObjOrErr) {
109 return FinalObjOrErr.takeError();
110 }
111 auto &Ar = Archives[ObjectFormat{Triple}];
112 Ar.Triple = Triple;
113 Ar.Alignment = Obj.Alignment;
114 auto &ArMember = Ar.Members.emplace_back();
115 ArMember.Buf = std::move(*FinalObjOrErr);
116 Ar.Name = std::make_unique<std::string>(Triple.str());
117 ArMember.MemberName = *Ar.Name;
118 }
119
120 for (auto &[Fmt, Ar] : Archives) {
121 if (auto BufferOrErr = llvm::writeArchiveToBuffer(
122 Ar.Members,
123 /* WriteSymtab= */ true, Ar.Members[0].detectKindFromObject(),
124 /* Deterministic=*/true, /*Thin=*/false)) {
125 Ar.OutBuffer = std::move(*BufferOrErr);
126 } else {
127 return BufferOrErr.takeError();
128 }
129
130 auto NewArOrErr = llvm::object::Archive::create(*Ar.OutBuffer);
131 if (!NewArOrErr) {
132 return NewArOrErr.takeError();
133 }
134
135 auto CPUTypeOrErr = llvm::MachO::getCPUType(Ar.Triple);
136 if (!CPUTypeOrErr) {
137 return CPUTypeOrErr.takeError();
138 }
139
140 auto CPUSubTypeOrErr = llvm::MachO::getCPUSubType(Ar.Triple);
141 if (!CPUSubTypeOrErr) {
142 return CPUSubTypeOrErr.takeError();
143 }
144 Ar.OutArchive = std::move(*NewArOrErr);
145 Slices.emplace_back(*Ar.OutArchive, *CPUTypeOrErr, *CPUSubTypeOrErr,
146 Ar.Triple.str(), Ar.Alignment);
147 }
148
149 return llvm::Error::success();
150 }
Object format.
Definition: Bartleby.h:40

◆ getCOFFConfig()

llvm::Expected< const llvm::objcopy::COFFConfig & > saq::bartleby::Bartleby::ArchiveWriter::getCOFFConfig ( ) const
inlineoverridenoexcept
245 {
246 return COFFConfig;
247 }

◆ getCommonConfig()

const llvm::objcopy::CommonConfig & saq::bartleby::Bartleby::ArchiveWriter::getCommonConfig ( ) const
inlineoverridenoexcept
235 {
236 return CommonConfig;
237 }

◆ getELFConfig()

llvm::Expected< const llvm::objcopy::ELFConfig & > saq::bartleby::Bartleby::ArchiveWriter::getELFConfig ( ) const
inlineoverridenoexcept
240 {
241 return ELFConfig;
242 }

◆ getMachOConfig()

llvm::Expected< const llvm::objcopy::MachOConfig & > saq::bartleby::Bartleby::ArchiveWriter::getMachOConfig ( ) const
inlineoverridenoexcept
250 {
251 return MachOConfig;
252 }

◆ getWasmConfig()

llvm::Expected< const llvm::objcopy::WasmConfig & > saq::bartleby::Bartleby::ArchiveWriter::getWasmConfig ( ) const
inlineoverridenoexcept
255 {
256 return WasmConfig;
257 }

◆ getXCOFFConfig()

llvm::Expected< const llvm::objcopy::XCOFFConfig & > saq::bartleby::Bartleby::ArchiveWriter::getXCOFFConfig ( ) const
inlineoverridenoexcept
260 {
261 return XCOFFConfig;
262 }

The documentation for this class was generated from the following file: