xref: /freebsd-src/contrib/llvm-project/llvm/lib/Object/TapiFile.cpp (revision fe6060f10f634930ff71b7c50291ddc610da2475)
18bcb0991SDimitry Andric //===- TapiFile.cpp -------------------------------------------------------===//
28bcb0991SDimitry Andric //
38bcb0991SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48bcb0991SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
58bcb0991SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68bcb0991SDimitry Andric //
78bcb0991SDimitry Andric //===----------------------------------------------------------------------===//
88bcb0991SDimitry Andric //
98bcb0991SDimitry Andric // This file defines the Text-based Dynamcic Library Stub format.
108bcb0991SDimitry Andric //
118bcb0991SDimitry Andric //===----------------------------------------------------------------------===//
128bcb0991SDimitry Andric 
138bcb0991SDimitry Andric #include "llvm/Object/TapiFile.h"
148bcb0991SDimitry Andric #include "llvm/ADT/StringRef.h"
158bcb0991SDimitry Andric #include "llvm/Object/Error.h"
168bcb0991SDimitry Andric #include "llvm/Support/MemoryBuffer.h"
17*fe6060f1SDimitry Andric #include "llvm/TextAPI/Symbol.h"
188bcb0991SDimitry Andric 
198bcb0991SDimitry Andric using namespace llvm;
208bcb0991SDimitry Andric using namespace MachO;
218bcb0991SDimitry Andric using namespace object;
228bcb0991SDimitry Andric 
238bcb0991SDimitry Andric static uint32_t getFlags(const Symbol *Sym) {
248bcb0991SDimitry Andric   uint32_t Flags = BasicSymbolRef::SF_Global;
258bcb0991SDimitry Andric   if (Sym->isUndefined())
268bcb0991SDimitry Andric     Flags |= BasicSymbolRef::SF_Undefined;
278bcb0991SDimitry Andric   else
288bcb0991SDimitry Andric     Flags |= BasicSymbolRef::SF_Exported;
298bcb0991SDimitry Andric 
308bcb0991SDimitry Andric   if (Sym->isWeakDefined() || Sym->isWeakReferenced())
318bcb0991SDimitry Andric     Flags |= BasicSymbolRef::SF_Weak;
328bcb0991SDimitry Andric 
338bcb0991SDimitry Andric   return Flags;
348bcb0991SDimitry Andric }
358bcb0991SDimitry Andric 
368bcb0991SDimitry Andric TapiFile::TapiFile(MemoryBufferRef Source, const InterfaceFile &interface,
378bcb0991SDimitry Andric                    Architecture Arch)
385ffd83dbSDimitry Andric     : SymbolicFile(ID_TapiFile, Source), Arch(Arch) {
398bcb0991SDimitry Andric   for (const auto *Symbol : interface.symbols()) {
408bcb0991SDimitry Andric     if (!Symbol->getArchitectures().has(Arch))
418bcb0991SDimitry Andric       continue;
428bcb0991SDimitry Andric 
438bcb0991SDimitry Andric     switch (Symbol->getKind()) {
448bcb0991SDimitry Andric     case SymbolKind::GlobalSymbol:
458bcb0991SDimitry Andric       Symbols.emplace_back(StringRef(), Symbol->getName(), getFlags(Symbol));
468bcb0991SDimitry Andric       break;
478bcb0991SDimitry Andric     case SymbolKind::ObjectiveCClass:
488bcb0991SDimitry Andric       if (interface.getPlatforms().count(PlatformKind::macOS) &&
498bcb0991SDimitry Andric           Arch == AK_i386) {
508bcb0991SDimitry Andric         Symbols.emplace_back(ObjC1ClassNamePrefix, Symbol->getName(),
518bcb0991SDimitry Andric                              getFlags(Symbol));
528bcb0991SDimitry Andric       } else {
538bcb0991SDimitry Andric         Symbols.emplace_back(ObjC2ClassNamePrefix, Symbol->getName(),
548bcb0991SDimitry Andric                              getFlags(Symbol));
558bcb0991SDimitry Andric         Symbols.emplace_back(ObjC2MetaClassNamePrefix, Symbol->getName(),
568bcb0991SDimitry Andric                              getFlags(Symbol));
578bcb0991SDimitry Andric       }
588bcb0991SDimitry Andric       break;
598bcb0991SDimitry Andric     case SymbolKind::ObjectiveCClassEHType:
608bcb0991SDimitry Andric       Symbols.emplace_back(ObjC2EHTypePrefix, Symbol->getName(),
618bcb0991SDimitry Andric                            getFlags(Symbol));
628bcb0991SDimitry Andric       break;
638bcb0991SDimitry Andric     case SymbolKind::ObjectiveCInstanceVariable:
648bcb0991SDimitry Andric       Symbols.emplace_back(ObjC2IVarPrefix, Symbol->getName(),
658bcb0991SDimitry Andric                            getFlags(Symbol));
668bcb0991SDimitry Andric       break;
678bcb0991SDimitry Andric     }
688bcb0991SDimitry Andric   }
698bcb0991SDimitry Andric }
708bcb0991SDimitry Andric 
718bcb0991SDimitry Andric TapiFile::~TapiFile() = default;
728bcb0991SDimitry Andric 
735ffd83dbSDimitry Andric void TapiFile::moveSymbolNext(DataRefImpl &DRI) const { DRI.d.a++; }
748bcb0991SDimitry Andric 
758bcb0991SDimitry Andric Error TapiFile::printSymbolName(raw_ostream &OS, DataRefImpl DRI) const {
765ffd83dbSDimitry Andric   assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds");
775ffd83dbSDimitry Andric   const Symbol &Sym = Symbols[DRI.d.a];
785ffd83dbSDimitry Andric   OS << Sym.Prefix << Sym.Name;
798bcb0991SDimitry Andric   return Error::success();
808bcb0991SDimitry Andric }
818bcb0991SDimitry Andric 
825ffd83dbSDimitry Andric Expected<uint32_t> TapiFile::getSymbolFlags(DataRefImpl DRI) const {
835ffd83dbSDimitry Andric   assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds");
845ffd83dbSDimitry Andric   return Symbols[DRI.d.a].Flags;
858bcb0991SDimitry Andric }
868bcb0991SDimitry Andric 
878bcb0991SDimitry Andric basic_symbol_iterator TapiFile::symbol_begin() const {
888bcb0991SDimitry Andric   DataRefImpl DRI;
895ffd83dbSDimitry Andric   DRI.d.a = 0;
908bcb0991SDimitry Andric   return BasicSymbolRef{DRI, this};
918bcb0991SDimitry Andric }
928bcb0991SDimitry Andric 
938bcb0991SDimitry Andric basic_symbol_iterator TapiFile::symbol_end() const {
948bcb0991SDimitry Andric   DataRefImpl DRI;
955ffd83dbSDimitry Andric   DRI.d.a = Symbols.size();
968bcb0991SDimitry Andric   return BasicSymbolRef{DRI, this};
978bcb0991SDimitry Andric }
98