LLVM  15.0.0git
IFSStub.h
Go to the documentation of this file.
1 //===- IFSStub.h ------------------------------------------------*- 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 /// \file
10 /// This file defines an internal representation of an InterFace Stub.
11 ///
12 //===-----------------------------------------------------------------------===/
13 
14 #ifndef LLVM_INTERFACESTUB_IFSSTUB_H
15 #define LLVM_INTERFACESTUB_IFSSTUB_H
16 
17 #include "llvm/ADT/Optional.h"
19 #include <vector>
20 
21 namespace llvm {
22 namespace ifs {
23 
24 typedef uint16_t IFSArch;
25 
26 enum class IFSSymbolType {
27  NoType,
28  Object,
29  Func,
30  TLS,
31 
32  // Type information is 4 bits, so 16 is safely out of range.
33  Unknown = 16,
34 };
35 
36 enum class IFSEndiannessType {
37  Little,
38  Big,
39 
40  // Endianness info is 1 bytes, 256 is safely out of range.
41  Unknown = 256,
42 };
43 
44 enum class IFSBitWidthType {
45  IFS32,
46  IFS64,
47 
48  // Bit width info is 1 bytes, 256 is safely out of range.
49  Unknown = 256,
50 };
51 
52 struct IFSSymbol {
53  IFSSymbol() = default;
54  explicit IFSSymbol(std::string SymbolName) : Name(std::move(SymbolName)) {}
55  std::string Name;
58  bool Undefined;
59  bool Weak;
61  bool operator<(const IFSSymbol &RHS) const { return Name < RHS.Name; }
62 };
63 
64 struct IFSTarget {
71 
72  bool empty();
73 };
74 
75 inline bool operator==(const IFSTarget &Lhs, const IFSTarget &Rhs) {
76  if (Lhs.Arch != Rhs.Arch || Lhs.BitWidth != Rhs.BitWidth ||
77  Lhs.Endianness != Rhs.Endianness ||
78  Lhs.ObjectFormat != Rhs.ObjectFormat || Lhs.Triple != Rhs.Triple)
79  return false;
80  return true;
81 }
82 
83 inline bool operator!=(const IFSTarget &Lhs, const IFSTarget &Rhs) {
84  return !(Lhs == Rhs);
85 }
86 
87 // A cumulative representation of InterFace stubs.
88 // Both textual and binary stubs will read into and write from this object.
89 struct IFSStub {
90  // TODO: Add support for symbol versioning.
94  std::vector<std::string> NeededLibs;
95  std::vector<IFSSymbol> Symbols;
96 
97  IFSStub() = default;
98  IFSStub(const IFSStub &Stub);
99  IFSStub(IFSStub &&Stub);
100 };
101 
102 // Create a alias class for IFSStub.
103 // LLVM's YAML library does not allow mapping a class with 2 traits,
104 // which prevents us using 'Target:' field with different definitions.
105 // This class makes it possible to map a second traits so the same data
106 // structure can be used for 2 different yaml schema.
108  IFSStubTriple() = default;
109  IFSStubTriple(const IFSStub &Stub);
110  IFSStubTriple(const IFSStubTriple &Stub);
112 };
113 
114 /// This function convert bit width type from IFS enum to ELF format
115 /// Currently, ELFCLASS32 and ELFCLASS64 are supported.
116 ///
117 /// @param BitWidth IFS bit width type.
119 
120 /// This function convert endianness type from IFS enum to ELF format
121 /// Currently, ELFDATA2LSB and ELFDATA2MSB are supported.
122 ///
123 /// @param Endianness IFS endianness type.
125 
126 /// This function convert symbol type from IFS enum to ELF format
127 /// Currently, STT_NOTYPE, STT_OBJECT, STT_FUNC, and STT_TLS are supported.
128 ///
129 /// @param SymbolType IFS symbol type.
131 
132 /// This function extracts ELF bit width from e_ident[EI_CLASS] of an ELF file
133 /// Currently, ELFCLASS32 and ELFCLASS64 are supported.
134 /// Other endianness types are mapped to IFSBitWidthType::Unknown.
135 ///
136 /// @param BitWidth e_ident[EI_CLASS] value to extract bit width from.
138 
139 /// This function extracts ELF endianness from e_ident[EI_DATA] of an ELF file
140 /// Currently, ELFDATA2LSB and ELFDATA2MSB are supported.
141 /// Other endianness types are mapped to IFSEndiannessType::Unknown.
142 ///
143 /// @param Endianness e_ident[EI_DATA] value to extract endianness type from.
145 
146 /// This function extracts symbol type from a symbol's st_info member and
147 /// maps it to an IFSSymbolType enum.
148 /// Currently, STT_NOTYPE, STT_OBJECT, STT_FUNC, and STT_TLS are supported.
149 /// Other symbol types are mapped to IFSSymbolType::Unknown.
150 ///
151 /// @param SymbolType Binary symbol st_info to extract symbol type from.
153 } // namespace ifs
154 } // end namespace llvm
155 
156 #endif // LLVM_INTERFACESTUB_IFSSTUB_H
llvm::ifs::IFSSymbolType::Unknown
@ Unknown
llvm::ifs::IFSStub::NeededLibs
std::vector< std::string > NeededLibs
Definition: IFSStub.h:94
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:17
llvm::msgpack::Endianness
constexpr support::endianness Endianness
The endianness of all multi-byte encoded values in MessagePack.
Definition: MsgPack.h:24
Optional.h
llvm::ifs::IFSBitWidthType
IFSBitWidthType
Definition: IFSStub.h:44
llvm::ifs::IFSSymbol
Definition: IFSStub.h:52
llvm::ifs::operator==
bool operator==(const IFSTarget &Lhs, const IFSTarget &Rhs)
Definition: IFSStub.h:75
llvm::ifs::convertIFSSymbolTypeToELF
uint8_t convertIFSSymbolTypeToELF(IFSSymbolType SymbolType)
This function convert symbol type from IFS enum to ELF format Currently, STT_NOTYPE,...
Definition: IFSStub.cpp:83
llvm::ifs::IFSTarget::Arch
Optional< IFSArch > Arch
Definition: IFSStub.h:67
VersionTuple.h
llvm::XCOFF::SymbolType
SymbolType
Definition: XCOFF.h:224
llvm::Optional< uint64_t >
RHS
Value * RHS
Definition: X86PartialReduction.cpp:76
llvm::ifs::operator!=
bool operator!=(const IFSTarget &Lhs, const IFSTarget &Rhs)
Definition: IFSStub.h:83
llvm::ifs::IFSSymbol::Name
std::string Name
Definition: IFSStub.h:55
llvm::ifs::IFSSymbol::IFSSymbol
IFSSymbol()=default
llvm::ifs::convertELFSymbolTypeToIFS
IFSSymbolType convertELFSymbolTypeToIFS(uint8_t SymbolType)
This function extracts symbol type from a symbol's st_info member and maps it to an IFSSymbolType enu...
Definition: IFSStub.cpp:119
llvm::ifs::IFSBitWidthType::Unknown
@ Unknown
llvm::ifs::IFSArch
uint16_t IFSArch
Definition: IFSStub.h:24
llvm::ifs::IFSStub::IFSStub
IFSStub()=default
llvm::ifs::IFSSymbolType
IFSSymbolType
Definition: IFSStub.h:26
llvm::ifs::convertIFSBitWidthToELF
uint8_t convertIFSBitWidthToELF(IFSBitWidthType BitWidth)
This function convert bit width type from IFS enum to ELF format Currently, ELFCLASS32 and ELFCLASS64...
Definition: IFSStub.cpp:61
llvm::ifs::IFSSymbol::IFSSymbol
IFSSymbol(std::string SymbolName)
Definition: IFSStub.h:54
llvm::ifs::IFSStub
Definition: IFSStub.h:89
llvm::ifs::IFSSymbolType::TLS
@ TLS
llvm::ifs::IFSTarget::empty
bool empty()
Definition: IFSStub.cpp:56
llvm::ifs::IFSBitWidthType::IFS32
@ IFS32
llvm::ifs::IFSSymbol::Warning
Optional< std::string > Warning
Definition: IFSStub.h:60
llvm::VersionTuple
Represents a version number in the form major[.minor[.subminor[.build]]].
Definition: VersionTuple.h:31
llvm::ifs::IFSEndiannessType::Big
@ Big
llvm::ifs::IFSStub::SoName
Optional< std::string > SoName
Definition: IFSStub.h:92
llvm::ifs::IFSStubTriple::IFSStubTriple
IFSStubTriple()=default
llvm::ifs::IFSTarget::BitWidth
Optional< IFSBitWidthType > BitWidth
Definition: IFSStub.h:70
llvm::ifs::IFSEndiannessType::Unknown
@ Unknown
llvm::ifs::convertELFEndiannessToIFS
IFSEndiannessType convertELFEndiannessToIFS(uint8_t Endianness)
This function extracts ELF endianness from e_ident[EI_DATA] of an ELF file Currently,...
Definition: IFSStub.cpp:108
llvm::ifs::IFSTarget::ArchString
Optional< std::string > ArchString
Definition: IFSStub.h:68
llvm::ifs::IFSSymbol::Undefined
bool Undefined
Definition: IFSStub.h:58
llvm::ifs::IFSSymbolType::NoType
@ NoType
llvm::ifs::IFSTarget::Triple
Optional< std::string > Triple
Definition: IFSStub.h:65
llvm::ifs::convertELFBitWidthToIFS
IFSBitWidthType convertELFBitWidthToIFS(uint8_t BitWidth)
This function extracts ELF bit width from e_ident[EI_CLASS] of an ELF file Currently,...
Definition: IFSStub.cpp:97
llvm::ifs::IFSBitWidthType::IFS64
@ IFS64
llvm::ifs::IFSEndiannessType::Little
@ Little
llvm::move
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1675
llvm::ifs::IFSStubTriple
Definition: IFSStub.h:107
llvm::ifs::IFSSymbol::Size
Optional< uint64_t > Size
Definition: IFSStub.h:56
llvm::ifs::convertIFSEndiannessToELF
uint8_t convertIFSEndiannessToELF(IFSEndiannessType Endianness)
This function convert endianness type from IFS enum to ELF format Currently, ELFDATA2LSB and ELFDATA2...
Definition: IFSStub.cpp:72
llvm::ifs::IFSEndiannessType
IFSEndiannessType
Definition: IFSStub.h:36
llvm::ifs::IFSSymbolType::Func
@ Func
llvm::ifs::IFSSymbol::Weak
bool Weak
Definition: IFSStub.h:59
llvm::ifs::IFSTarget
Definition: IFSStub.h:64
llvm::AMDGPU::HSAMD::Kernel::Key::SymbolName
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
Definition: AMDGPUMetadata.h:386
std
Definition: BitVector.h:851
uint16_t
llvm::ifs::IFSStub::Target
IFSTarget Target
Definition: IFSStub.h:93
llvm::ifs::IFSStub::IfsVersion
VersionTuple IfsVersion
Definition: IFSStub.h:91
llvm::BitWidth
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:147
llvm::ifs::IFSSymbolType::Object
@ Object
llvm::ifs::IFSStub::Symbols
std::vector< IFSSymbol > Symbols
Definition: IFSStub.h:95
llvm::ifs::IFSTarget::ObjectFormat
Optional< std::string > ObjectFormat
Definition: IFSStub.h:66
llvm::ifs::IFSTarget::Endianness
Optional< IFSEndiannessType > Endianness
Definition: IFSStub.h:69
llvm::ifs::IFSSymbol::Type
IFSSymbolType Type
Definition: IFSStub.h:57
llvm::ifs::IFSSymbol::operator<
bool operator<(const IFSSymbol &RHS) const
Definition: IFSStub.h:61