1 //===- IFSStub.cpp --------------------------------------------------------===//
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
7 //===-----------------------------------------------------------------------===/
9 #include "llvm/InterfaceStub/IFSStub.h"
10 #include "llvm/BinaryFormat/ELF.h"
11 #include "llvm/Support/ErrorHandling.h"
14 using namespace llvm::ifs
;
16 IFSStub::IFSStub(IFSStub
const &Stub
) {
17 IfsVersion
= Stub
.IfsVersion
;
20 NeededLibs
= Stub
.NeededLibs
;
21 Symbols
= Stub
.Symbols
;
24 IFSStub::IFSStub(IFSStub
&&Stub
) {
25 IfsVersion
= std::move(Stub
.IfsVersion
);
26 Target
= std::move(Stub
.Target
);
27 SoName
= std::move(Stub
.SoName
);
28 NeededLibs
= std::move(Stub
.NeededLibs
);
29 Symbols
= std::move(Stub
.Symbols
);
32 IFSStubTriple::IFSStubTriple(IFSStubTriple
const &Stub
) : IFSStub() {
33 IfsVersion
= Stub
.IfsVersion
;
36 NeededLibs
= Stub
.NeededLibs
;
37 Symbols
= Stub
.Symbols
;
40 IFSStubTriple::IFSStubTriple(IFSStub
const &Stub
) {
41 IfsVersion
= Stub
.IfsVersion
;
44 NeededLibs
= Stub
.NeededLibs
;
45 Symbols
= Stub
.Symbols
;
48 IFSStubTriple::IFSStubTriple(IFSStubTriple
&&Stub
) {
49 IfsVersion
= std::move(Stub
.IfsVersion
);
50 Target
= std::move(Stub
.Target
);
51 SoName
= std::move(Stub
.SoName
);
52 NeededLibs
= std::move(Stub
.NeededLibs
);
53 Symbols
= std::move(Stub
.Symbols
);
56 bool IFSTarget::empty() {
57 return !Triple
&& !ObjectFormat
&& !Arch
&& !ArchString
&& !Endianness
&&
61 uint8_t ifs::convertIFSBitWidthToELF(IFSBitWidthType BitWidth
) {
63 case IFSBitWidthType::IFS32
:
64 return ELF::ELFCLASS32
;
65 case IFSBitWidthType::IFS64
:
66 return ELF::ELFCLASS64
;
68 llvm_unreachable("unknown bitwidth");
72 uint8_t ifs::convertIFSEndiannessToELF(IFSEndiannessType Endianness
) {
74 case IFSEndiannessType::Little
:
75 return ELF::ELFDATA2LSB
;
76 case IFSEndiannessType::Big
:
77 return ELF::ELFDATA2MSB
;
79 llvm_unreachable("unknown endianness");
83 uint8_t ifs::convertIFSSymbolTypeToELF(IFSSymbolType SymbolType
) {
85 case IFSSymbolType::Object
:
86 return ELF::STT_OBJECT
;
87 case IFSSymbolType::Func
:
89 case IFSSymbolType::TLS
:
91 case IFSSymbolType::NoType
:
92 return ELF::STT_NOTYPE
;
94 llvm_unreachable("unknown symbol type");
98 IFSBitWidthType
ifs::convertELFBitWidthToIFS(uint8_t BitWidth
) {
100 case ELF::ELFCLASS32
:
101 return IFSBitWidthType::IFS32
;
102 case ELF::ELFCLASS64
:
103 return IFSBitWidthType::IFS64
;
105 return IFSBitWidthType::Unknown
;
109 IFSEndiannessType
ifs::convertELFEndiannessToIFS(uint8_t Endianness
) {
110 switch (Endianness
) {
111 case ELF::ELFDATA2LSB
:
112 return IFSEndiannessType::Little
;
113 case ELF::ELFDATA2MSB
:
114 return IFSEndiannessType::Big
;
116 return IFSEndiannessType::Unknown
;
120 IFSSymbolType
ifs::convertELFSymbolTypeToIFS(uint8_t SymbolType
) {
121 SymbolType
= SymbolType
& 0xf;
122 switch (SymbolType
) {
123 case ELF::STT_OBJECT
:
124 return IFSSymbolType::Object
;
126 return IFSSymbolType::Func
;
128 return IFSSymbolType::TLS
;
129 case ELF::STT_NOTYPE
:
130 return IFSSymbolType::NoType
;
132 return IFSSymbolType::Unknown
;