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