153 {
154 auto *Binary = OwningBinary.getBinary();
155 llvm::Error E = llvm::Error::success();
156
157 if (auto *Obj = llvm::dyn_cast<llvm::object::ObjectFile>(Binary)) {
158 const auto Triple = Obj->makeTriple();
159 if (!objectFormatMatches(Triple)) {
161 .
Constraint = std::get<ObjectFormat>(ObjFormat), .Found = {Triple}});
162 }
163 ObjFormat = Triple;
164 ProcessObjectFile(Obj, Symbols);
165 auto &Entry = Objects.emplace_back(ObjectFile{.Handle = Obj});
166 (llvm::Twine(llvm::utostr(Objects.size())) + ".o")
167 .toNullTerminatedStringRef(Entry.Name);
168 } else if (auto *Archive = llvm::dyn_cast<llvm::object::Archive>(Binary)) {
169 llvm::Error E = llvm::Error::success();
170 for (const auto &Ch : Archive->children(E)) {
171 auto BinOrErr = Ch.getAsBinary();
172 if (!BinOrErr) {
173 return BinOrErr.takeError();
174 }
175 if (auto *Obj =
176 llvm::dyn_cast<llvm::object::ObjectFile>(BinOrErr.get().get())) {
177 const auto Triple = Obj->makeTriple();
178 if (!objectFormatMatches(Triple)) {
180 .
Constraint = std::get<ObjectFormat>(ObjFormat),
181 .Found = {Triple}});
182 }
183 ObjFormat = Triple;
184
185 ProcessObjectFile(Obj, Symbols);
186 auto &Entry = Objects.emplace_back(ObjectFile{
187 .Owner = std::move(BinOrErr.get()),
188 });
189 Entry.Handle = Obj;
190 if (auto NameOrErr = Ch.getName()) {
191 Entry.Name = *NameOrErr;
192 } else {
193 (llvm::Twine(llvm::utostr(Objects.size())) + ".o")
194 .toNullTerminatedStringRef(Entry.Name);
195 }
196 } else {
198 llvm::raw_svector_ostream OS(Reason.
Msg);
199 OS << "unsupported binary '" << Binary->getType()
200 << "' (triple: " << Binary->getTripleObjectFormat() << ')';
201 return llvm::make_error<Error>(std::move(Reason));
202 }
203 }
204 } else if (Binary->isMachOUniversalBinary()) {
205 return addMachOUniversalBinary(std::move(OwningBinary));
206 } else {
208 llvm::raw_svector_ostream OS(Reason.
Msg);
209 OS << "unsupported binary '" << Binary->getType()
210 << "' (triple: " << Binary->getTripleObjectFormat() << ')';
211 return llvm::make_error<Error>(std::move(Reason));
212 }
213 OwnedBinaries.push_back(std::move(OwningBinary));
214 return llvm::Error::success();
215}
Error from std::error_code.
Definition: Error.h:40
llvm::SmallString< 32 > Msg
Error message.
Definition: Error.h:42