xref: /freebsd-src/contrib/llvm-project/llvm/lib/InterfaceStub/IFSStub.cpp (revision fe6060f10f634930ff71b7c50291ddc610da2475)
1*fe6060f1SDimitry Andric //===- IFSStub.cpp --------------------------------------------------------===//
2*fe6060f1SDimitry Andric //
3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*fe6060f1SDimitry Andric //
7*fe6060f1SDimitry Andric //===-----------------------------------------------------------------------===/
8*fe6060f1SDimitry Andric 
9*fe6060f1SDimitry Andric #include "llvm/InterfaceStub/IFSStub.h"
10*fe6060f1SDimitry Andric #include "llvm/BinaryFormat/ELF.h"
11*fe6060f1SDimitry Andric #include "llvm/Support/Error.h"
12*fe6060f1SDimitry Andric 
13*fe6060f1SDimitry Andric using namespace llvm;
14*fe6060f1SDimitry Andric using namespace llvm::ifs;
15*fe6060f1SDimitry Andric 
16*fe6060f1SDimitry Andric IFSStub::IFSStub(IFSStub const &Stub) {
17*fe6060f1SDimitry Andric   IfsVersion = Stub.IfsVersion;
18*fe6060f1SDimitry Andric   Target = Stub.Target;
19*fe6060f1SDimitry Andric   SoName = Stub.SoName;
20*fe6060f1SDimitry Andric   NeededLibs = Stub.NeededLibs;
21*fe6060f1SDimitry Andric   Symbols = Stub.Symbols;
22*fe6060f1SDimitry Andric }
23*fe6060f1SDimitry Andric 
24*fe6060f1SDimitry Andric IFSStub::IFSStub(IFSStub &&Stub) {
25*fe6060f1SDimitry Andric   IfsVersion = std::move(Stub.IfsVersion);
26*fe6060f1SDimitry Andric   Target = std::move(Stub.Target);
27*fe6060f1SDimitry Andric   SoName = std::move(Stub.SoName);
28*fe6060f1SDimitry Andric   NeededLibs = std::move(Stub.NeededLibs);
29*fe6060f1SDimitry Andric   Symbols = std::move(Stub.Symbols);
30*fe6060f1SDimitry Andric }
31*fe6060f1SDimitry Andric 
32*fe6060f1SDimitry Andric IFSStubTriple::IFSStubTriple(IFSStubTriple const &Stub) {
33*fe6060f1SDimitry Andric   IfsVersion = Stub.IfsVersion;
34*fe6060f1SDimitry Andric   Target = Stub.Target;
35*fe6060f1SDimitry Andric   SoName = Stub.SoName;
36*fe6060f1SDimitry Andric   NeededLibs = Stub.NeededLibs;
37*fe6060f1SDimitry Andric   Symbols = Stub.Symbols;
38*fe6060f1SDimitry Andric }
39*fe6060f1SDimitry Andric 
40*fe6060f1SDimitry Andric IFSStubTriple::IFSStubTriple(IFSStub const &Stub) {
41*fe6060f1SDimitry Andric   IfsVersion = Stub.IfsVersion;
42*fe6060f1SDimitry Andric   Target = Stub.Target;
43*fe6060f1SDimitry Andric   SoName = Stub.SoName;
44*fe6060f1SDimitry Andric   NeededLibs = Stub.NeededLibs;
45*fe6060f1SDimitry Andric   Symbols = Stub.Symbols;
46*fe6060f1SDimitry Andric }
47*fe6060f1SDimitry Andric 
48*fe6060f1SDimitry Andric IFSStubTriple::IFSStubTriple(IFSStubTriple &&Stub) {
49*fe6060f1SDimitry Andric   IfsVersion = std::move(Stub.IfsVersion);
50*fe6060f1SDimitry Andric   Target = std::move(Stub.Target);
51*fe6060f1SDimitry Andric   SoName = std::move(Stub.SoName);
52*fe6060f1SDimitry Andric   NeededLibs = std::move(Stub.NeededLibs);
53*fe6060f1SDimitry Andric   Symbols = std::move(Stub.Symbols);
54*fe6060f1SDimitry Andric }
55*fe6060f1SDimitry Andric 
56*fe6060f1SDimitry Andric bool IFSTarget::empty() {
57*fe6060f1SDimitry Andric   return !Triple && !ObjectFormat && !Arch && !ArchString && !Endianness &&
58*fe6060f1SDimitry Andric          !BitWidth;
59*fe6060f1SDimitry Andric }
60*fe6060f1SDimitry Andric 
61*fe6060f1SDimitry Andric uint8_t ifs::convertIFSBitWidthToELF(IFSBitWidthType BitWidth) {
62*fe6060f1SDimitry Andric   switch (BitWidth) {
63*fe6060f1SDimitry Andric   case IFSBitWidthType::IFS32:
64*fe6060f1SDimitry Andric     return ELF::ELFCLASS32;
65*fe6060f1SDimitry Andric   case IFSBitWidthType::IFS64:
66*fe6060f1SDimitry Andric     return ELF::ELFCLASS64;
67*fe6060f1SDimitry Andric   default:
68*fe6060f1SDimitry Andric     llvm_unreachable("unknown bitwidth");
69*fe6060f1SDimitry Andric   }
70*fe6060f1SDimitry Andric }
71*fe6060f1SDimitry Andric 
72*fe6060f1SDimitry Andric uint8_t ifs::convertIFSEndiannessToELF(IFSEndiannessType Endianness) {
73*fe6060f1SDimitry Andric   switch (Endianness) {
74*fe6060f1SDimitry Andric   case IFSEndiannessType::Little:
75*fe6060f1SDimitry Andric     return ELF::ELFDATA2LSB;
76*fe6060f1SDimitry Andric   case IFSEndiannessType::Big:
77*fe6060f1SDimitry Andric     return ELF::ELFDATA2MSB;
78*fe6060f1SDimitry Andric   default:
79*fe6060f1SDimitry Andric     llvm_unreachable("unknown endianness");
80*fe6060f1SDimitry Andric   }
81*fe6060f1SDimitry Andric }
82*fe6060f1SDimitry Andric 
83*fe6060f1SDimitry Andric uint8_t ifs::convertIFSSymbolTypeToELF(IFSSymbolType SymbolType) {
84*fe6060f1SDimitry Andric   switch (SymbolType) {
85*fe6060f1SDimitry Andric   case IFSSymbolType::Object:
86*fe6060f1SDimitry Andric     return ELF::STT_OBJECT;
87*fe6060f1SDimitry Andric   case IFSSymbolType::Func:
88*fe6060f1SDimitry Andric     return ELF::STT_FUNC;
89*fe6060f1SDimitry Andric   case IFSSymbolType::TLS:
90*fe6060f1SDimitry Andric     return ELF::STT_TLS;
91*fe6060f1SDimitry Andric   case IFSSymbolType::NoType:
92*fe6060f1SDimitry Andric   default:
93*fe6060f1SDimitry Andric     return ELF::STT_NOTYPE;
94*fe6060f1SDimitry Andric   }
95*fe6060f1SDimitry Andric }
96*fe6060f1SDimitry Andric 
97*fe6060f1SDimitry Andric IFSBitWidthType ifs::convertELFBitWidthToIFS(uint8_t BitWidth) {
98*fe6060f1SDimitry Andric   switch (BitWidth) {
99*fe6060f1SDimitry Andric   case ELF::ELFCLASS32:
100*fe6060f1SDimitry Andric     return IFSBitWidthType::IFS32;
101*fe6060f1SDimitry Andric   case ELF::ELFCLASS64:
102*fe6060f1SDimitry Andric     return IFSBitWidthType::IFS64;
103*fe6060f1SDimitry Andric   default:
104*fe6060f1SDimitry Andric     return IFSBitWidthType::Unknown;
105*fe6060f1SDimitry Andric   }
106*fe6060f1SDimitry Andric }
107*fe6060f1SDimitry Andric 
108*fe6060f1SDimitry Andric IFSEndiannessType ifs::convertELFEndiannessToIFS(uint8_t Endianness) {
109*fe6060f1SDimitry Andric   switch (Endianness) {
110*fe6060f1SDimitry Andric   case ELF::ELFDATA2LSB:
111*fe6060f1SDimitry Andric     return IFSEndiannessType::Little;
112*fe6060f1SDimitry Andric   case ELF::ELFDATA2MSB:
113*fe6060f1SDimitry Andric     return IFSEndiannessType::Big;
114*fe6060f1SDimitry Andric   default:
115*fe6060f1SDimitry Andric     return IFSEndiannessType::Unknown;
116*fe6060f1SDimitry Andric   }
117*fe6060f1SDimitry Andric }
118*fe6060f1SDimitry Andric 
119*fe6060f1SDimitry Andric IFSSymbolType ifs::convertELFSymbolTypeToIFS(uint8_t SymbolType) {
120*fe6060f1SDimitry Andric   SymbolType = SymbolType & 0xf;
121*fe6060f1SDimitry Andric   switch (SymbolType) {
122*fe6060f1SDimitry Andric   case ELF::STT_OBJECT:
123*fe6060f1SDimitry Andric     return IFSSymbolType::Object;
124*fe6060f1SDimitry Andric   case ELF::STT_FUNC:
125*fe6060f1SDimitry Andric     return IFSSymbolType::Func;
126*fe6060f1SDimitry Andric   case ELF::STT_TLS:
127*fe6060f1SDimitry Andric     return IFSSymbolType::TLS;
128*fe6060f1SDimitry Andric   case ELF::STT_NOTYPE:
129*fe6060f1SDimitry Andric     return IFSSymbolType::NoType;
130*fe6060f1SDimitry Andric   default:
131*fe6060f1SDimitry Andric     return IFSSymbolType::Unknown;
132*fe6060f1SDimitry Andric   }
133*fe6060f1SDimitry Andric }
134