xref: /src/contrib/llvm-project/llvm/lib/Object/TapiUniversal.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
11d5ae102SDimitry Andric //===- TapiUniversal.cpp --------------------------------------------------===//
21d5ae102SDimitry Andric //
31d5ae102SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41d5ae102SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
51d5ae102SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61d5ae102SDimitry Andric //
71d5ae102SDimitry Andric //===----------------------------------------------------------------------===//
81d5ae102SDimitry Andric //
91d5ae102SDimitry Andric // This file defines the Text-based Dynamic Library Stub format.
101d5ae102SDimitry Andric //
111d5ae102SDimitry Andric //===----------------------------------------------------------------------===//
121d5ae102SDimitry Andric 
131d5ae102SDimitry Andric #include "llvm/Object/TapiUniversal.h"
141d5ae102SDimitry Andric #include "llvm/ADT/StringRef.h"
151d5ae102SDimitry Andric #include "llvm/Object/Error.h"
16145449b1SDimitry Andric #include "llvm/Object/TapiFile.h"
17145449b1SDimitry Andric #include "llvm/TextAPI/ArchitectureSet.h"
18344a3780SDimitry Andric #include "llvm/TextAPI/TextAPIReader.h"
191d5ae102SDimitry Andric 
201d5ae102SDimitry Andric using namespace llvm;
211d5ae102SDimitry Andric using namespace MachO;
221d5ae102SDimitry Andric using namespace object;
231d5ae102SDimitry Andric 
TapiUniversal(MemoryBufferRef Source,Error & Err)241d5ae102SDimitry Andric TapiUniversal::TapiUniversal(MemoryBufferRef Source, Error &Err)
251d5ae102SDimitry Andric     : Binary(ID_TapiUniversal, Source) {
26cfca06d7SDimitry Andric   Expected<std::unique_ptr<InterfaceFile>> Result = TextAPIReader::get(Source);
271d5ae102SDimitry Andric   ErrorAsOutParameter ErrAsOuParam(&Err);
281d5ae102SDimitry Andric   if (!Result) {
291d5ae102SDimitry Andric     Err = Result.takeError();
301d5ae102SDimitry Andric     return;
311d5ae102SDimitry Andric   }
321d5ae102SDimitry Andric   ParsedFile = std::move(Result.get());
331d5ae102SDimitry Andric 
34cfca06d7SDimitry Andric   auto FlattenObjectInfo = [this](const auto &File) {
35cfca06d7SDimitry Andric     StringRef Name = File->getInstallName();
36cfca06d7SDimitry Andric     for (const Architecture Arch : File->getArchitectures())
37cfca06d7SDimitry Andric       Libraries.emplace_back(Library({Name, Arch}));
38cfca06d7SDimitry Andric   };
39cfca06d7SDimitry Andric 
40cfca06d7SDimitry Andric   FlattenObjectInfo(ParsedFile);
41cfca06d7SDimitry Andric   // Get inlined documents from tapi file.
42cfca06d7SDimitry Andric   for (const std::shared_ptr<InterfaceFile> &File : ParsedFile->documents())
43cfca06d7SDimitry Andric     FlattenObjectInfo(File);
441d5ae102SDimitry Andric }
451d5ae102SDimitry Andric 
461d5ae102SDimitry Andric TapiUniversal::~TapiUniversal() = default;
471d5ae102SDimitry Andric 
481d5ae102SDimitry Andric Expected<std::unique_ptr<TapiFile>>
getAsObjectFile() const491d5ae102SDimitry Andric TapiUniversal::ObjectForArch::getAsObjectFile() const {
50ac9a064cSDimitry Andric   return std::make_unique<TapiFile>(Parent->getMemoryBufferRef(),
51145449b1SDimitry Andric                                     *Parent->ParsedFile,
52ac9a064cSDimitry Andric                                     Parent->Libraries[Index].Arch);
531d5ae102SDimitry Andric }
541d5ae102SDimitry Andric 
551d5ae102SDimitry Andric Expected<std::unique_ptr<TapiUniversal>>
create(MemoryBufferRef Source)561d5ae102SDimitry Andric TapiUniversal::create(MemoryBufferRef Source) {
571d5ae102SDimitry Andric   Error Err = Error::success();
581d5ae102SDimitry Andric   std::unique_ptr<TapiUniversal> Ret(new TapiUniversal(Source, Err));
591d5ae102SDimitry Andric   if (Err)
601d5ae102SDimitry Andric     return std::move(Err);
611d5ae102SDimitry Andric   return std::move(Ret);
621d5ae102SDimitry Andric }
63