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