xref: /freebsd/contrib/llvm-project/llvm/lib/Object/TapiUniversal.cpp (revision 20917cac7bcf216225a7b66f7b3a56f3764c5acc)
1  //===- TapiUniversal.cpp --------------------------------------------------===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  //
9  // This file defines the Text-based Dynamic Library Stub format.
10  //
11  //===----------------------------------------------------------------------===//
12  
13  #include "llvm/Object/TapiUniversal.h"
14  #include "llvm/ADT/StringRef.h"
15  #include "llvm/Object/Error.h"
16  #include "llvm/Support/MemoryBuffer.h"
17  #include "llvm/TextAPI/TextAPIReader.h"
18  
19  using namespace llvm;
20  using namespace MachO;
21  using namespace object;
22  
23  TapiUniversal::TapiUniversal(MemoryBufferRef Source, Error &Err)
24      : Binary(ID_TapiUniversal, Source) {
25    Expected<std::unique_ptr<InterfaceFile>> Result = TextAPIReader::get(Source);
26    ErrorAsOutParameter ErrAsOuParam(&Err);
27    if (!Result) {
28      Err = Result.takeError();
29      return;
30    }
31    ParsedFile = std::move(Result.get());
32  
33    auto FlattenObjectInfo = [this](const auto &File) {
34      StringRef Name = File->getInstallName();
35      for (const Architecture Arch : File->getArchitectures())
36        Libraries.emplace_back(Library({Name, Arch}));
37    };
38  
39    FlattenObjectInfo(ParsedFile);
40    // Get inlined documents from tapi file.
41    for (const std::shared_ptr<InterfaceFile> &File : ParsedFile->documents())
42      FlattenObjectInfo(File);
43  }
44  
45  TapiUniversal::~TapiUniversal() = default;
46  
47  Expected<std::unique_ptr<TapiFile>>
48  TapiUniversal::ObjectForArch::getAsObjectFile() const {
49    return std::unique_ptr<TapiFile>(new TapiFile(Parent->getMemoryBufferRef(),
50                                                  *Parent->ParsedFile.get(),
51                                                  Parent->Libraries[Index].Arch));
52  }
53  
54  Expected<std::unique_ptr<TapiUniversal>>
55  TapiUniversal::create(MemoryBufferRef Source) {
56    Error Err = Error::success();
57    std::unique_ptr<TapiUniversal> Ret(new TapiUniversal(Source, Err));
58    if (Err)
59      return std::move(Err);
60    return std::move(Ret);
61  }
62