18bcb0991SDimitry Andric //===- TapiUniversal.cpp --------------------------------------------------===//
28bcb0991SDimitry Andric //
38bcb0991SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48bcb0991SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
58bcb0991SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68bcb0991SDimitry Andric //
78bcb0991SDimitry Andric //===----------------------------------------------------------------------===//
88bcb0991SDimitry Andric //
98bcb0991SDimitry Andric // This file defines the Text-based Dynamic Library Stub format.
108bcb0991SDimitry Andric //
118bcb0991SDimitry Andric //===----------------------------------------------------------------------===//
128bcb0991SDimitry Andric 
138bcb0991SDimitry Andric #include "llvm/Object/TapiUniversal.h"
148bcb0991SDimitry Andric #include "llvm/ADT/StringRef.h"
158bcb0991SDimitry Andric #include "llvm/Object/Error.h"
16*81ad6265SDimitry Andric #include "llvm/Object/TapiFile.h"
17*81ad6265SDimitry Andric #include "llvm/TextAPI/ArchitectureSet.h"
18fe6060f1SDimitry Andric #include "llvm/TextAPI/TextAPIReader.h"
198bcb0991SDimitry Andric 
208bcb0991SDimitry Andric using namespace llvm;
218bcb0991SDimitry Andric using namespace MachO;
228bcb0991SDimitry Andric using namespace object;
238bcb0991SDimitry Andric 
TapiUniversal(MemoryBufferRef Source,Error & Err)248bcb0991SDimitry Andric TapiUniversal::TapiUniversal(MemoryBufferRef Source, Error &Err)
258bcb0991SDimitry Andric     : Binary(ID_TapiUniversal, Source) {
265ffd83dbSDimitry Andric   Expected<std::unique_ptr<InterfaceFile>> Result = TextAPIReader::get(Source);
278bcb0991SDimitry Andric   ErrorAsOutParameter ErrAsOuParam(&Err);
288bcb0991SDimitry Andric   if (!Result) {
298bcb0991SDimitry Andric     Err = Result.takeError();
308bcb0991SDimitry Andric     return;
318bcb0991SDimitry Andric   }
328bcb0991SDimitry Andric   ParsedFile = std::move(Result.get());
338bcb0991SDimitry Andric 
345ffd83dbSDimitry Andric   auto FlattenObjectInfo = [this](const auto &File) {
355ffd83dbSDimitry Andric     StringRef Name = File->getInstallName();
365ffd83dbSDimitry Andric     for (const Architecture Arch : File->getArchitectures())
375ffd83dbSDimitry Andric       Libraries.emplace_back(Library({Name, Arch}));
385ffd83dbSDimitry Andric   };
395ffd83dbSDimitry Andric 
405ffd83dbSDimitry Andric   FlattenObjectInfo(ParsedFile);
415ffd83dbSDimitry Andric   // Get inlined documents from tapi file.
425ffd83dbSDimitry Andric   for (const std::shared_ptr<InterfaceFile> &File : ParsedFile->documents())
435ffd83dbSDimitry Andric     FlattenObjectInfo(File);
448bcb0991SDimitry Andric }
458bcb0991SDimitry Andric 
468bcb0991SDimitry Andric TapiUniversal::~TapiUniversal() = default;
478bcb0991SDimitry Andric 
488bcb0991SDimitry Andric Expected<std::unique_ptr<TapiFile>>
getAsObjectFile() const498bcb0991SDimitry Andric TapiUniversal::ObjectForArch::getAsObjectFile() const {
508bcb0991SDimitry Andric   return std::unique_ptr<TapiFile>(new TapiFile(Parent->getMemoryBufferRef(),
51*81ad6265SDimitry Andric                                                 *Parent->ParsedFile,
525ffd83dbSDimitry Andric                                                 Parent->Libraries[Index].Arch));
538bcb0991SDimitry Andric }
548bcb0991SDimitry Andric 
558bcb0991SDimitry Andric Expected<std::unique_ptr<TapiUniversal>>
create(MemoryBufferRef Source)568bcb0991SDimitry Andric TapiUniversal::create(MemoryBufferRef Source) {
578bcb0991SDimitry Andric   Error Err = Error::success();
588bcb0991SDimitry Andric   std::unique_ptr<TapiUniversal> Ret(new TapiUniversal(Source, Err));
598bcb0991SDimitry Andric   if (Err)
608bcb0991SDimitry Andric     return std::move(Err);
618bcb0991SDimitry Andric   return std::move(Ret);
628bcb0991SDimitry Andric }
63