1//===- IFSStub.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#include "llvm/InterfaceStub/IFSStub.h"
10#include "llvm/BinaryFormat/ELF.h"
11#include "llvm/Support/ErrorHandling.h"
12
13using namespace llvm;
14using namespace llvm::ifs;
15
16IFSStub::IFSStub(IFSStub const &Stub) {
17 IfsVersion = Stub.IfsVersion;
18 Target = Stub.Target;
19 SoName = Stub.SoName;
20 NeededLibs = Stub.NeededLibs;
21 Symbols = Stub.Symbols;
22}
23
24IFSStub::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);
30}
31
32IFSStubTriple::IFSStubTriple(IFSStubTriple const &Stub) : IFSStub() {
33 IfsVersion = Stub.IfsVersion;
34 Target = Stub.Target;
35 SoName = Stub.SoName;
36 NeededLibs = Stub.NeededLibs;
37 Symbols = Stub.Symbols;
38}
39
40IFSStubTriple::IFSStubTriple(IFSStub const &Stub) {
41 IfsVersion = Stub.IfsVersion;
42 Target = Stub.Target;
43 SoName = Stub.SoName;
44 NeededLibs = Stub.NeededLibs;
45 Symbols = Stub.Symbols;
46}
47
48IFSStubTriple::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);
54}
55
56bool IFSTarget::empty() {
57 return !Triple && !ObjectFormat && !Arch && !ArchString && !Endianness &&
58 !BitWidth;
59}
60
61uint8_t ifs::convertIFSBitWidthToELF(IFSBitWidthType BitWidth) {
62 switch (BitWidth) {
63 case IFSBitWidthType::IFS32:
64 return ELF::ELFCLASS32;
65 case IFSBitWidthType::IFS64:
66 return ELF::ELFCLASS64;
67 default:
68 llvm_unreachable("unknown bitwidth");
69 }
70}
71
72uint8_t ifs::convertIFSEndiannessToELF(IFSEndiannessType Endianness) {
73 switch (Endianness) {
74 case IFSEndiannessType::Little:
75 return ELF::ELFDATA2LSB;
76 case IFSEndiannessType::Big:
77 return ELF::ELFDATA2MSB;
78 default:
79 llvm_unreachable("unknown endianness");
80 }
81}
82
83uint8_t ifs::convertIFSSymbolTypeToELF(IFSSymbolType SymbolType) {
84 switch (SymbolType) {
85 case IFSSymbolType::Object:
86 return ELF::STT_OBJECT;
87 case IFSSymbolType::Func:
88 return ELF::STT_FUNC;
89 case IFSSymbolType::TLS:
90 return ELF::STT_TLS;
91 case IFSSymbolType::NoType:
92 return ELF::STT_NOTYPE;
93 default:
94 llvm_unreachable("unknown symbol type");
95 }
96}
97
98IFSBitWidthType ifs::convertELFBitWidthToIFS(uint8_t BitWidth) {
99 switch (BitWidth) {
100 case ELF::ELFCLASS32:
101 return IFSBitWidthType::IFS32;
102 case ELF::ELFCLASS64:
103 return IFSBitWidthType::IFS64;
104 default:
105 return IFSBitWidthType::Unknown;
106 }
107}
108
109IFSEndiannessType ifs::convertELFEndiannessToIFS(uint8_t Endianness) {
110 switch (Endianness) {
111 case ELF::ELFDATA2LSB:
112 return IFSEndiannessType::Little;
113 case ELF::ELFDATA2MSB:
114 return IFSEndiannessType::Big;
115 default:
116 return IFSEndiannessType::Unknown;
117 }
118}
119
120IFSSymbolType ifs::convertELFSymbolTypeToIFS(uint8_t SymbolType) {
121 SymbolType = SymbolType & 0xf;
122 switch (SymbolType) {
123 case ELF::STT_OBJECT:
124 return IFSSymbolType::Object;
125 case ELF::STT_FUNC:
126 return IFSSymbolType::Func;
127 case ELF::STT_TLS:
128 return IFSSymbolType::TLS;
129 case ELF::STT_NOTYPE:
130 return IFSSymbolType::NoType;
131 default:
132 return IFSSymbolType::Unknown;
133 }
134}
135