1 | //===-- TapiUniversal.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 TapiUniversal interface. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_OBJECT_TAPIUNIVERSAL_H |
14 | #define LLVM_OBJECT_TAPIUNIVERSAL_H |
15 | |
16 | #include "llvm/ADT/StringRef.h" |
17 | #include "llvm/Object/Binary.h" |
18 | #include "llvm/Support/Error.h" |
19 | #include "llvm/Support/MemoryBufferRef.h" |
20 | #include "llvm/TextAPI/Architecture.h" |
21 | #include "llvm/TextAPI/InterfaceFile.h" |
22 | |
23 | namespace llvm { |
24 | namespace object { |
25 | |
26 | class TapiFile; |
27 | |
28 | class TapiUniversal : public Binary { |
29 | public: |
30 | class ObjectForArch { |
31 | const TapiUniversal *Parent; |
32 | int Index; |
33 | |
34 | public: |
35 | ObjectForArch(const TapiUniversal *Parent, int Index) |
36 | : Parent(Parent), Index(Index) {} |
37 | |
38 | ObjectForArch getNext() const { return ObjectForArch(Parent, Index + 1); } |
39 | |
40 | bool operator==(const ObjectForArch &Other) const { |
41 | return (Parent == Other.Parent) && (Index == Other.Index); |
42 | } |
43 | |
44 | uint32_t getCPUType() const { |
45 | auto Result = |
46 | MachO::getCPUTypeFromArchitecture(Arch: Parent->Libraries[Index].Arch); |
47 | return Result.first; |
48 | } |
49 | |
50 | uint32_t getCPUSubType() const { |
51 | auto Result = |
52 | MachO::getCPUTypeFromArchitecture(Arch: Parent->Libraries[Index].Arch); |
53 | return Result.second; |
54 | } |
55 | |
56 | StringRef getArchFlagName() const { |
57 | return MachO::getArchitectureName(Arch: Parent->Libraries[Index].Arch); |
58 | } |
59 | |
60 | std::string getInstallName() const { |
61 | return std::string(Parent->Libraries[Index].InstallName); |
62 | } |
63 | |
64 | bool isTopLevelLib() const { |
65 | return Parent->ParsedFile->getInstallName() == getInstallName(); |
66 | } |
67 | |
68 | Expected<std::unique_ptr<TapiFile>> getAsObjectFile() const; |
69 | }; |
70 | |
71 | class object_iterator { |
72 | ObjectForArch Obj; |
73 | |
74 | public: |
75 | object_iterator(const ObjectForArch &Obj) : Obj(Obj) {} |
76 | const ObjectForArch *operator->() const { return &Obj; } |
77 | const ObjectForArch &operator*() const { return Obj; } |
78 | |
79 | bool operator==(const object_iterator &Other) const { |
80 | return Obj == Other.Obj; |
81 | } |
82 | bool operator!=(const object_iterator &Other) const { |
83 | return !(*this == Other); |
84 | } |
85 | |
86 | object_iterator &operator++() { // Preincrement |
87 | Obj = Obj.getNext(); |
88 | return *this; |
89 | } |
90 | }; |
91 | |
92 | TapiUniversal(MemoryBufferRef Source, Error &Err); |
93 | static Expected<std::unique_ptr<TapiUniversal>> |
94 | create(MemoryBufferRef Source); |
95 | ~TapiUniversal() override; |
96 | |
97 | object_iterator begin_objects() const { return ObjectForArch(this, 0); } |
98 | object_iterator end_objects() const { |
99 | return ObjectForArch(this, Libraries.size()); |
100 | } |
101 | |
102 | iterator_range<object_iterator> objects() const { |
103 | return make_range(x: begin_objects(), y: end_objects()); |
104 | } |
105 | |
106 | const MachO::InterfaceFile &getInterfaceFile() { return *ParsedFile; } |
107 | |
108 | uint32_t getNumberOfObjects() const { return Libraries.size(); } |
109 | |
110 | static bool classof(const Binary *v) { return v->isTapiUniversal(); } |
111 | |
112 | private: |
113 | struct Library { |
114 | StringRef InstallName; |
115 | MachO::Architecture Arch; |
116 | }; |
117 | |
118 | std::unique_ptr<MachO::InterfaceFile> ParsedFile; |
119 | std::vector<Library> Libraries; |
120 | }; |
121 | |
122 | } // end namespace object. |
123 | } // end namespace llvm. |
124 | |
125 | #endif // LLVM_OBJECT_TAPIUNIVERSAL_H |
126 |