LLVM 20.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
35
36 return Flags;
37}
38
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),
61 break;
62 case EncodeKind::ObjectiveCClass:
63 if (Interface.getPlatforms().count(PLATFORM_MACOS) && Arch == AK_i386) {
64 Symbols.emplace_back(ObjC1ClassNamePrefix, Symbol->getName(),
66 } else {
67 Symbols.emplace_back(ObjC2ClassNamePrefix, Symbol->getName(),
69 Symbols.emplace_back(ObjC2MetaClassNamePrefix, Symbol->getName(),
71 }
72 break;
73 case EncodeKind::ObjectiveCClassEHType:
74 Symbols.emplace_back(ObjC2EHTypePrefix, Symbol->getName(),
76 break;
77 case EncodeKind::ObjectiveCInstanceVariable:
78 Symbols.emplace_back(ObjC2IVarPrefix, Symbol->getName(), getFlags(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}
Symbol * Sym
Definition: ELF_riscv.cpp:479
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
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:160
static ErrorSuccess success()
Create a success value.
Definition: Error.h:337
Tagged union holding either a T or a Error.
Definition: Error.h:481
bool has(Architecture Arch) const
Defines the interface file.
bool isData() const
Definition: Symbol.h:130
bool isWeakDefined() const
Definition: Symbol.h:109
bool isUndefined() const
Definition: Symbol.h:122
ArchitectureSet getArchitectures() const
Definition: Symbol.h:104
StringRef getName() const
Definition: Symbol.h:103
bool isText() const
Definition: Symbol.h:134
EncodeKind getKind() const
Definition: Symbol.h:102
bool isWeakReferenced() const
Definition: Symbol.h:113
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
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.
Definition: SymbolicFile.h:103
unsigned int getType() const
Definition: Binary.h:104
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:52
constexpr StringLiteral ObjC2IVarPrefix
Definition: Symbol.h:66
constexpr StringLiteral ObjC1ClassNamePrefix
Definition: Symbol.h:62
constexpr StringLiteral ObjC2ClassNamePrefix
Definition: Symbol.h:63
Architecture
Defines the architecture slices that are supported by Text-based Stub files.
Definition: Architecture.h:27
constexpr StringLiteral ObjC2MetaClassNamePrefix
Definition: Symbol.h:64
constexpr StringLiteral ObjC2EHTypePrefix
Definition: Symbol.h:65
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
struct llvm::object::DataRefImpl::@371 d