Constructs the slices needed for a fat Mach-O.
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 }
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 true, Ar.Members[0].detectKindFromObject(),
124 true, 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 }