1 //===- TapiFile.h - Text-based Dynamic Library Stub -------------*- C++ -*-===// 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 declares the TapiFile interface. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_OBJECT_TAPIFILE_H 14 #define LLVM_OBJECT_TAPIFILE_H 15 16 #include "llvm/ADT/StringRef.h" 17 #include "llvm/Object/Binary.h" 18 #include "llvm/Object/ObjectFile.h" 19 #include "llvm/Object/SymbolicFile.h" 20 #include "llvm/Support/Error.h" 21 #include "llvm/Support/MemoryBufferRef.h" 22 #include "llvm/TextAPI/Architecture.h" 23 #include "llvm/TextAPI/InterfaceFile.h" 24 25 namespace llvm { 26 27 class raw_ostream; 28 29 namespace object { 30 31 class TapiFile : public SymbolicFile { 32 public: 33 TapiFile(MemoryBufferRef Source, const MachO::InterfaceFile &Interface, 34 MachO::Architecture Arch); 35 ~TapiFile() override; 36 37 void moveSymbolNext(DataRefImpl &DRI) const override; 38 39 Error printSymbolName(raw_ostream &OS, DataRefImpl DRI) const override; 40 41 Expected<uint32_t> getSymbolFlags(DataRefImpl DRI) const override; 42 43 basic_symbol_iterator symbol_begin() const override; 44 45 basic_symbol_iterator symbol_end() const override; 46 47 Expected<SymbolRef::Type> getSymbolType(DataRefImpl DRI) const; 48 49 bool hasSegmentInfo() { return FileKind >= MachO::FileType::TBD_V5; } 50 51 static bool classof(const Binary *v) { return v->isTapiFile(); } 52 53 bool is64Bit() const override { return MachO::is64Bit(Arch); } 54 55 private: 56 struct Symbol { 57 StringRef Prefix; 58 StringRef Name; 59 uint32_t Flags; 60 SymbolRef::Type Type; 61 62 constexpr Symbol(StringRef Prefix, StringRef Name, uint32_t Flags, 63 SymbolRef::Type Type) 64 : Prefix(Prefix), Name(Name), Flags(Flags), Type(Type) {} 65 }; 66 67 std::vector<Symbol> Symbols; 68 MachO::Architecture Arch; 69 MachO::FileType FileKind; 70 }; 71 72 } // end namespace object. 73 } // end namespace llvm. 74 75 #endif // LLVM_OBJECT_TAPIFILE_H 76