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" 1756709b86SCyndy 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: 48*3025c3edSJuergen Ributzka if (interface.getPlatforms().count(PLATFORM_MACOS) && Arch == AK_i386) { 49c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC1ClassNamePrefix, Symbol->getName(), 50c20d1f90SCyndy Ishida getFlags(Symbol)); 51c20d1f90SCyndy Ishida } else { 52c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2ClassNamePrefix, Symbol->getName(), 53c20d1f90SCyndy Ishida getFlags(Symbol)); 54c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2MetaClassNamePrefix, Symbol->getName(), 55c20d1f90SCyndy Ishida getFlags(Symbol)); 56c20d1f90SCyndy Ishida } 57c20d1f90SCyndy Ishida break; 58c20d1f90SCyndy Ishida case SymbolKind::ObjectiveCClassEHType: 59c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2EHTypePrefix, Symbol->getName(), 60c20d1f90SCyndy Ishida getFlags(Symbol)); 61c20d1f90SCyndy Ishida break; 62c20d1f90SCyndy Ishida case SymbolKind::ObjectiveCInstanceVariable: 63c20d1f90SCyndy Ishida Symbols.emplace_back(ObjC2IVarPrefix, Symbol->getName(), 64c20d1f90SCyndy Ishida getFlags(Symbol)); 65c20d1f90SCyndy Ishida break; 66c20d1f90SCyndy Ishida } 67c20d1f90SCyndy Ishida } 68c20d1f90SCyndy Ishida } 69c20d1f90SCyndy Ishida 70c20d1f90SCyndy Ishida TapiFile::~TapiFile() = default; 71c20d1f90SCyndy Ishida 72425c6f07SJonas Devlieghere void TapiFile::moveSymbolNext(DataRefImpl &DRI) const { DRI.d.a++; } 73c20d1f90SCyndy Ishida 74c20d1f90SCyndy Ishida Error TapiFile::printSymbolName(raw_ostream &OS, DataRefImpl DRI) const { 75425c6f07SJonas Devlieghere assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds"); 76425c6f07SJonas Devlieghere const Symbol &Sym = Symbols[DRI.d.a]; 77425c6f07SJonas Devlieghere OS << Sym.Prefix << Sym.Name; 78c20d1f90SCyndy Ishida return Error::success(); 79c20d1f90SCyndy Ishida } 80c20d1f90SCyndy Ishida 81ac00376aSvgxbj Expected<uint32_t> TapiFile::getSymbolFlags(DataRefImpl DRI) const { 82425c6f07SJonas Devlieghere assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds"); 83425c6f07SJonas Devlieghere return Symbols[DRI.d.a].Flags; 84c20d1f90SCyndy Ishida } 85c20d1f90SCyndy Ishida 86c20d1f90SCyndy Ishida basic_symbol_iterator TapiFile::symbol_begin() const { 87c20d1f90SCyndy Ishida DataRefImpl DRI; 88425c6f07SJonas Devlieghere DRI.d.a = 0; 89c20d1f90SCyndy Ishida return BasicSymbolRef{DRI, this}; 90c20d1f90SCyndy Ishida } 91c20d1f90SCyndy Ishida 92c20d1f90SCyndy Ishida basic_symbol_iterator TapiFile::symbol_end() const { 93c20d1f90SCyndy Ishida DataRefImpl DRI; 94425c6f07SJonas Devlieghere DRI.d.a = Symbols.size(); 95c20d1f90SCyndy Ishida return BasicSymbolRef{DRI, this}; 96c20d1f90SCyndy Ishida } 97