1c20d1f90SCyndy Ishida //===- TapiFile.cpp -------------------------------------------------------===//
2c20d1f90SCyndy Ishida //
3c20d1f90SCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c20d1f90SCyndy Ishida // See https://llvm.org/LICENSE.txt for license information.
5c20d1f90SCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c20d1f90SCyndy Ishida //
7c20d1f90SCyndy Ishida //===----------------------------------------------------------------------===//
8c20d1f90SCyndy Ishida //
9c20d1f90SCyndy Ishida // This file defines the Text-based Dynamcic Library Stub format.
10c20d1f90SCyndy Ishida //
11c20d1f90SCyndy Ishida //===----------------------------------------------------------------------===//
12c20d1f90SCyndy Ishida
13c20d1f90SCyndy Ishida #include "llvm/Object/TapiFile.h"
14c20d1f90SCyndy Ishida #include "llvm/ADT/StringRef.h"
15*e72c195fSserge-sans-paille #include "llvm/BinaryFormat/MachO.h"
16c20d1f90SCyndy Ishida #include "llvm/Object/Error.h"
17*e72c195fSserge-sans-paille #include "llvm/Support/MemoryBufferRef.h"
18*e72c195fSserge-sans-paille #include "llvm/TextAPI/ArchitectureSet.h"
19*e72c195fSserge-sans-paille #include "llvm/TextAPI/InterfaceFile.h"
20*e72c195fSserge-sans-paille #include "llvm/TextAPI/Platform.h"
2156709b86SCyndy Ishida #include "llvm/TextAPI/Symbol.h"
22c20d1f90SCyndy Ishida
23c20d1f90SCyndy Ishida using namespace llvm;
24c20d1f90SCyndy Ishida using namespace MachO;
25c20d1f90SCyndy Ishida using namespace object;
26c20d1f90SCyndy Ishida
getFlags(const Symbol * Sym)27c20d1f90SCyndy Ishida static uint32_t getFlags(const Symbol *Sym) {
28c20d1f90SCyndy Ishida uint32_t Flags = BasicSymbolRef::SF_Global;
29c20d1f90SCyndy Ishida if (Sym->isUndefined())
30c20d1f90SCyndy Ishida Flags |= BasicSymbolRef::SF_Undefined;
31c20d1f90SCyndy Ishida else
32c20d1f90SCyndy Ishida Flags |= BasicSymbolRef::SF_Exported;
33c20d1f90SCyndy Ishida
34c20d1f90SCyndy Ishida if (Sym->isWeakDefined() || Sym->isWeakReferenced())
35c20d1f90SCyndy Ishida Flags |= BasicSymbolRef::SF_Weak;
36c20d1f90SCyndy Ishida
37c20d1f90SCyndy Ishida return Flags;
38c20d1f90SCyndy Ishida }
39c20d1f90SCyndy Ishida
TapiFile(MemoryBufferRef Source,const InterfaceFile & interface,Architecture Arch)40c20d1f90SCyndy Ishida TapiFile::TapiFile(MemoryBufferRef Source, const InterfaceFile &interface,
41c20d1f90SCyndy Ishida Architecture Arch)
4228fefcc8SCyndy Ishida : SymbolicFile(ID_TapiFile, Source), Arch(Arch) {
43c20d1f90SCyndy Ishida for (const auto *Symbol : interface.symbols()) {
44c20d1f90SCyndy Ishida if (!Symbol->getArchitectures().has(Arch))
45c20d1f90SCyndy Ishida continue;
46c20d1f90SCyndy Ishida
47c20d1f90SCyndy Ishida switch (Symbol->getKind()) {
48c20d1f90SCyndy Ishida case SymbolKind::GlobalSymbol:
49c20d1f90SCyndy Ishida Symbols.emplace_back(StringRef(), Symbol->getName(), getFlags(Symbol));
50c20d1f90SCyndy Ishida break;
51c20d1f90SCyndy Ishida case SymbolKind::ObjectiveCClass:
523025c3edSJuergen Ributzka if (interface.getPlatforms().count(PLATFORM_MACOS) && Arch == AK_i386) {
53c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC1ClassNamePrefix, Symbol->getName(),
54c20d1f90SCyndy Ishida getFlags(Symbol));
55c20d1f90SCyndy Ishida } else {
56c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2ClassNamePrefix, Symbol->getName(),
57c20d1f90SCyndy Ishida getFlags(Symbol));
58c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2MetaClassNamePrefix, Symbol->getName(),
59c20d1f90SCyndy Ishida getFlags(Symbol));
60c20d1f90SCyndy Ishida }
61c20d1f90SCyndy Ishida break;
62c20d1f90SCyndy Ishida case SymbolKind::ObjectiveCClassEHType:
63c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2EHTypePrefix, Symbol->getName(),
64c20d1f90SCyndy Ishida getFlags(Symbol));
65c20d1f90SCyndy Ishida break;
66c20d1f90SCyndy Ishida case SymbolKind::ObjectiveCInstanceVariable:
67c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2IVarPrefix, Symbol->getName(),
68c20d1f90SCyndy Ishida getFlags(Symbol));
69c20d1f90SCyndy Ishida break;
70c20d1f90SCyndy Ishida }
71c20d1f90SCyndy Ishida }
72c20d1f90SCyndy Ishida }
73c20d1f90SCyndy Ishida
74c20d1f90SCyndy Ishida TapiFile::~TapiFile() = default;
75c20d1f90SCyndy Ishida
moveSymbolNext(DataRefImpl & DRI) const76425c6f07SJonas Devlieghere void TapiFile::moveSymbolNext(DataRefImpl &DRI) const { DRI.d.a++; }
77c20d1f90SCyndy Ishida
printSymbolName(raw_ostream & OS,DataRefImpl DRI) const78c20d1f90SCyndy Ishida Error TapiFile::printSymbolName(raw_ostream &OS, DataRefImpl DRI) const {
79425c6f07SJonas Devlieghere assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds");
80425c6f07SJonas Devlieghere const Symbol &Sym = Symbols[DRI.d.a];
81425c6f07SJonas Devlieghere OS << Sym.Prefix << Sym.Name;
82c20d1f90SCyndy Ishida return Error::success();
83c20d1f90SCyndy Ishida }
84c20d1f90SCyndy Ishida
getSymbolFlags(DataRefImpl DRI) const85ac00376aSvgxbj Expected<uint32_t> TapiFile::getSymbolFlags(DataRefImpl DRI) const {
86425c6f07SJonas Devlieghere assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds");
87425c6f07SJonas Devlieghere return Symbols[DRI.d.a].Flags;
88c20d1f90SCyndy Ishida }
89c20d1f90SCyndy Ishida
symbol_begin() const90c20d1f90SCyndy Ishida basic_symbol_iterator TapiFile::symbol_begin() const {
91c20d1f90SCyndy Ishida DataRefImpl DRI;
92425c6f07SJonas Devlieghere DRI.d.a = 0;
93c20d1f90SCyndy Ishida return BasicSymbolRef{DRI, this};
94c20d1f90SCyndy Ishida }
95c20d1f90SCyndy Ishida
symbol_end() const96c20d1f90SCyndy Ishida basic_symbol_iterator TapiFile::symbol_end() const {
97c20d1f90SCyndy Ishida DataRefImpl DRI;
98425c6f07SJonas Devlieghere DRI.d.a = Symbols.size();
99c20d1f90SCyndy Ishida return BasicSymbolRef{DRI, this};
100c20d1f90SCyndy Ishida }
101