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" 15c20d1f90SCyndy Ishida #include "llvm/Object/Error.h" 16c20d1f90SCyndy Ishida #include "llvm/Support/MemoryBuffer.h" 17*56709b86SCyndy Ishida #include "llvm/TextAPI/Symbol.h" 18c20d1f90SCyndy Ishida 19c20d1f90SCyndy Ishida using namespace llvm; 20c20d1f90SCyndy Ishida using namespace MachO; 21c20d1f90SCyndy Ishida using namespace object; 22c20d1f90SCyndy Ishida 23c20d1f90SCyndy Ishida static uint32_t getFlags(const Symbol *Sym) { 24c20d1f90SCyndy Ishida uint32_t Flags = BasicSymbolRef::SF_Global; 25c20d1f90SCyndy Ishida if (Sym->isUndefined()) 26c20d1f90SCyndy Ishida Flags |= BasicSymbolRef::SF_Undefined; 27c20d1f90SCyndy Ishida else 28c20d1f90SCyndy Ishida Flags |= BasicSymbolRef::SF_Exported; 29c20d1f90SCyndy Ishida 30c20d1f90SCyndy Ishida if (Sym->isWeakDefined() || Sym->isWeakReferenced()) 31c20d1f90SCyndy Ishida Flags |= BasicSymbolRef::SF_Weak; 32c20d1f90SCyndy Ishida 33c20d1f90SCyndy Ishida return Flags; 34c20d1f90SCyndy Ishida } 35c20d1f90SCyndy Ishida 36c20d1f90SCyndy Ishida TapiFile::TapiFile(MemoryBufferRef Source, const InterfaceFile &interface, 37c20d1f90SCyndy Ishida Architecture Arch) 3828fefcc8SCyndy Ishida : SymbolicFile(ID_TapiFile, Source), Arch(Arch) { 39c20d1f90SCyndy Ishida for (const auto *Symbol : interface.symbols()) { 40c20d1f90SCyndy Ishida if (!Symbol->getArchitectures().has(Arch)) 41c20d1f90SCyndy Ishida continue; 42c20d1f90SCyndy Ishida 43c20d1f90SCyndy Ishida switch (Symbol->getKind()) { 44c20d1f90SCyndy Ishida case SymbolKind::GlobalSymbol: 45c20d1f90SCyndy Ishida Symbols.emplace_back(StringRef(), Symbol->getName(), getFlags(Symbol)); 46c20d1f90SCyndy Ishida break; 47c20d1f90SCyndy Ishida case SymbolKind::ObjectiveCClass: 4881669d5eSCyndy Ishida if (interface.getPlatforms().count(PlatformKind::macOS) && 4981669d5eSCyndy Ishida Arch == AK_i386) { 50c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC1ClassNamePrefix, Symbol->getName(), 51c20d1f90SCyndy Ishida getFlags(Symbol)); 52c20d1f90SCyndy Ishida } else { 53c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2ClassNamePrefix, Symbol->getName(), 54c20d1f90SCyndy Ishida getFlags(Symbol)); 55c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2MetaClassNamePrefix, Symbol->getName(), 56c20d1f90SCyndy Ishida getFlags(Symbol)); 57c20d1f90SCyndy Ishida } 58c20d1f90SCyndy Ishida break; 59c20d1f90SCyndy Ishida case SymbolKind::ObjectiveCClassEHType: 60c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2EHTypePrefix, Symbol->getName(), 61c20d1f90SCyndy Ishida getFlags(Symbol)); 62c20d1f90SCyndy Ishida break; 63c20d1f90SCyndy Ishida case SymbolKind::ObjectiveCInstanceVariable: 64c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2IVarPrefix, Symbol->getName(), 65c20d1f90SCyndy Ishida getFlags(Symbol)); 66c20d1f90SCyndy Ishida break; 67c20d1f90SCyndy Ishida } 68c20d1f90SCyndy Ishida } 69c20d1f90SCyndy Ishida } 70c20d1f90SCyndy Ishida 71c20d1f90SCyndy Ishida TapiFile::~TapiFile() = default; 72c20d1f90SCyndy Ishida 73425c6f07SJonas Devlieghere void TapiFile::moveSymbolNext(DataRefImpl &DRI) const { DRI.d.a++; } 74c20d1f90SCyndy Ishida 75c20d1f90SCyndy Ishida Error TapiFile::printSymbolName(raw_ostream &OS, DataRefImpl DRI) const { 76425c6f07SJonas Devlieghere assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds"); 77425c6f07SJonas Devlieghere const Symbol &Sym = Symbols[DRI.d.a]; 78425c6f07SJonas Devlieghere OS << Sym.Prefix << Sym.Name; 79c20d1f90SCyndy Ishida return Error::success(); 80c20d1f90SCyndy Ishida } 81c20d1f90SCyndy Ishida 82ac00376aSvgxbj Expected<uint32_t> TapiFile::getSymbolFlags(DataRefImpl DRI) const { 83425c6f07SJonas Devlieghere assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds"); 84425c6f07SJonas Devlieghere return Symbols[DRI.d.a].Flags; 85c20d1f90SCyndy Ishida } 86c20d1f90SCyndy Ishida 87c20d1f90SCyndy Ishida basic_symbol_iterator TapiFile::symbol_begin() const { 88c20d1f90SCyndy Ishida DataRefImpl DRI; 89425c6f07SJonas Devlieghere DRI.d.a = 0; 90c20d1f90SCyndy Ishida return BasicSymbolRef{DRI, this}; 91c20d1f90SCyndy Ishida } 92c20d1f90SCyndy Ishida 93c20d1f90SCyndy Ishida basic_symbol_iterator TapiFile::symbol_end() const { 94c20d1f90SCyndy Ishida DataRefImpl DRI; 95425c6f07SJonas Devlieghere DRI.d.a = Symbols.size(); 96c20d1f90SCyndy Ishida return BasicSymbolRef{DRI, this}; 97c20d1f90SCyndy Ishida } 98