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 AndricTapiUniversal::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 AndricTapiUniversal::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 AndricTapiUniversal::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