LLVM 22.0.0git
TapiFile.cpp
Go to the documentation of this file.
1//===- TapiFile.cpp -------------------------------------------------------===//
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 defines the Text-based Dynamcic Library Stub format.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/StringRef.h"
20#include "llvm/TextAPI/Symbol.h"
21
22using namespace llvm;
23using namespace MachO;
24using namespace object;
25
26static uint32_t getFlags(const Symbol *Sym) {
28 if (Sym->isUndefined())
30 else
32
33 if (Sym->isWeakDefined() || Sym->isWeakReferenced())
35
36 return Flags;
37}
38
39static SymbolRef::Type getType(const Symbol *Sym) {
41 if (Sym->isData())
43 else if (Sym->isText())
45
46 return Type;
47}
48
50 Architecture Arch)
51 : SymbolicFile(ID_TapiFile, Source), Arch(Arch),
52 FileKind(Interface.getFileType()) {
53 for (const auto *Symbol : Interface.symbols()) {
54 if (!Symbol->getArchitectures().has(Arch))
55 continue;
56
57 switch (Symbol->getKind()) {
58 case EncodeKind::GlobalSymbol:
59 Symbols.emplace_back(StringRef(), Symbol->getName(), getFlags(Symbol),
60 ::getType(Symbol));
61 break;
62 case EncodeKind::ObjectiveCClass:
63 if (Interface.getPlatforms().count(PLATFORM_MACOS) && Arch == AK_i386) {
64 Symbols.emplace_back(ObjC1ClassNamePrefix, Symbol->getName(),
65 getFlags(Symbol), ::getType(Symbol));
66 } else {
67 Symbols.emplace_back(ObjC2ClassNamePrefix, Symbol->getName(),
68 getFlags(Symbol), ::getType(Symbol));
69 Symbols.emplace_back(ObjC2MetaClassNamePrefix, Symbol->getName(),
70 getFlags(Symbol), ::getType(Symbol));
71 }
72 break;
73 case EncodeKind::ObjectiveCClassEHType:
74 Symbols.emplace_back(ObjC2EHTypePrefix, Symbol->getName(),
75 getFlags(Symbol), ::getType(Symbol));
76 break;
77 case EncodeKind::ObjectiveCInstanceVariable:
78 Symbols.emplace_back(ObjC2IVarPrefix, Symbol->getName(), getFlags(Symbol),
79 ::getType(Symbol));
80 break;
81 }
82 }
83}
84
85TapiFile::~TapiFile() = default;
86
87void TapiFile::moveSymbolNext(DataRefImpl &DRI) const { DRI.d.a++; }
88
90 assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds");
91 const Symbol &Sym = Symbols[DRI.d.a];
92 OS << Sym.Prefix << Sym.Name;
93 return Error::success();
94}
95
97 assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds");
98 return Symbols[DRI.d.a].Type;
99}
100
102 assert(DRI.d.a < Symbols.size() && "Attempt to access symbol out of bounds");
103 return Symbols[DRI.d.a].Flags;
104}
105
107 DataRefImpl DRI;
108 DRI.d.a = 0;
109 return BasicSymbolRef{DRI, this};
110}
111
113 DataRefImpl DRI;
114 DRI.d.a = Symbols.size();
115 return BasicSymbolRef{DRI, this};
116}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static uint32_t getFlags(const Symbol *Sym)
Definition TapiFile.cpp:26
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
Defines the interface file.
bool isData() const
Definition Symbol.h:131
bool isWeakDefined() const
Definition Symbol.h:110
bool isUndefined() const
Definition Symbol.h:123
bool isText() const
Definition Symbol.h:135
bool isWeakReferenced() const
Definition Symbol.h:114
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
This is a value type class that represents a single symbol in the list of symbols in the object file.
SymbolicFile(unsigned int Type, MemoryBufferRef Source)
Expected< SymbolRef::Type > getSymbolType(DataRefImpl DRI) const
Definition TapiFile.cpp:96
void moveSymbolNext(DataRefImpl &DRI) const override
Definition TapiFile.cpp:87
Expected< uint32_t > getSymbolFlags(DataRefImpl DRI) const override
Definition TapiFile.cpp:101
basic_symbol_iterator symbol_end() const override
Definition TapiFile.cpp:112
TapiFile(MemoryBufferRef Source, const MachO::InterfaceFile &Interface, MachO::Architecture Arch)
Definition TapiFile.cpp:49
Error printSymbolName(raw_ostream &OS, DataRefImpl DRI) const override
Definition TapiFile.cpp:89
basic_symbol_iterator symbol_begin() const override
Definition TapiFile.cpp:106
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
Architecture
Defines the architecture slices that are supported by Text-based Stub files.
content_iterator< BasicSymbolRef > basic_symbol_iterator
This is an optimization pass for GlobalISel generic memory operations.
struct llvm::object::DataRefImpl::@005117267142344013370254144343227032034000327225 d