xref: /llvm-project/llvm/lib/InterfaceStub/IFSStub.cpp (revision 8e9c531922c4f9a1ee583ef3553b8529bb8e9a9a)
161fa9afeSHaowei Wu //===- IFSStub.cpp --------------------------------------------------------===//
261fa9afeSHaowei Wu //
361fa9afeSHaowei Wu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
461fa9afeSHaowei Wu // See https://llvm.org/LICENSE.txt for license information.
561fa9afeSHaowei Wu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
661fa9afeSHaowei Wu //
761fa9afeSHaowei Wu //===-----------------------------------------------------------------------===/
861fa9afeSHaowei Wu 
961fa9afeSHaowei Wu #include "llvm/InterfaceStub/IFSStub.h"
1061fa9afeSHaowei Wu #include "llvm/BinaryFormat/ELF.h"
11ed98c1b3Sserge-sans-paille #include "llvm/Support/ErrorHandling.h"
1261fa9afeSHaowei Wu 
1361fa9afeSHaowei Wu using namespace llvm;
146103fdfaSHaowei Wu using namespace llvm::ifs;
1561fa9afeSHaowei Wu 
IFSStub(IFSStub const & Stub)1661fa9afeSHaowei Wu IFSStub::IFSStub(IFSStub const &Stub) {
1761fa9afeSHaowei Wu   IfsVersion = Stub.IfsVersion;
1861fa9afeSHaowei Wu   Target = Stub.Target;
1961fa9afeSHaowei Wu   SoName = Stub.SoName;
2061fa9afeSHaowei Wu   NeededLibs = Stub.NeededLibs;
2161fa9afeSHaowei Wu   Symbols = Stub.Symbols;
2261fa9afeSHaowei Wu }
2361fa9afeSHaowei Wu 
IFSStub(IFSStub && Stub)2461fa9afeSHaowei Wu IFSStub::IFSStub(IFSStub &&Stub) {
2561fa9afeSHaowei Wu   IfsVersion = std::move(Stub.IfsVersion);
2661fa9afeSHaowei Wu   Target = std::move(Stub.Target);
2761fa9afeSHaowei Wu   SoName = std::move(Stub.SoName);
2861fa9afeSHaowei Wu   NeededLibs = std::move(Stub.NeededLibs);
2961fa9afeSHaowei Wu   Symbols = std::move(Stub.Symbols);
3061fa9afeSHaowei Wu }
3161fa9afeSHaowei Wu 
IFSStubTriple(IFSStubTriple const & Stub)32e5947760SKazu Hirata IFSStubTriple::IFSStubTriple(IFSStubTriple const &Stub) : IFSStub() {
3361fa9afeSHaowei Wu   IfsVersion = Stub.IfsVersion;
3461fa9afeSHaowei Wu   Target = Stub.Target;
3561fa9afeSHaowei Wu   SoName = Stub.SoName;
3661fa9afeSHaowei Wu   NeededLibs = Stub.NeededLibs;
3761fa9afeSHaowei Wu   Symbols = Stub.Symbols;
3861fa9afeSHaowei Wu }
3961fa9afeSHaowei Wu 
IFSStubTriple(IFSStub const & Stub)40b932bdf5SKazu Hirata IFSStubTriple::IFSStubTriple(IFSStub const &Stub) {
4161fa9afeSHaowei Wu   IfsVersion = Stub.IfsVersion;
4261fa9afeSHaowei Wu   Target = Stub.Target;
4361fa9afeSHaowei Wu   SoName = Stub.SoName;
4461fa9afeSHaowei Wu   NeededLibs = Stub.NeededLibs;
4561fa9afeSHaowei Wu   Symbols = Stub.Symbols;
4661fa9afeSHaowei Wu }
4761fa9afeSHaowei Wu 
IFSStubTriple(IFSStubTriple && Stub)4861fa9afeSHaowei Wu IFSStubTriple::IFSStubTriple(IFSStubTriple &&Stub) {
4961fa9afeSHaowei Wu   IfsVersion = std::move(Stub.IfsVersion);
5061fa9afeSHaowei Wu   Target = std::move(Stub.Target);
5161fa9afeSHaowei Wu   SoName = std::move(Stub.SoName);
5261fa9afeSHaowei Wu   NeededLibs = std::move(Stub.NeededLibs);
5361fa9afeSHaowei Wu   Symbols = std::move(Stub.Symbols);
5461fa9afeSHaowei Wu }
5561fa9afeSHaowei Wu 
empty()5661fa9afeSHaowei Wu bool IFSTarget::empty() {
5761fa9afeSHaowei Wu   return !Triple && !ObjectFormat && !Arch && !ArchString && !Endianness &&
5861fa9afeSHaowei Wu          !BitWidth;
5961fa9afeSHaowei Wu }
6061fa9afeSHaowei Wu 
convertIFSBitWidthToELF(IFSBitWidthType BitWidth)616103fdfaSHaowei Wu uint8_t ifs::convertIFSBitWidthToELF(IFSBitWidthType BitWidth) {
6261fa9afeSHaowei Wu   switch (BitWidth) {
6361fa9afeSHaowei Wu   case IFSBitWidthType::IFS32:
6461fa9afeSHaowei Wu     return ELF::ELFCLASS32;
6561fa9afeSHaowei Wu   case IFSBitWidthType::IFS64:
6661fa9afeSHaowei Wu     return ELF::ELFCLASS64;
677c53a7d3SSimon Pilgrim   default:
687c53a7d3SSimon Pilgrim     llvm_unreachable("unknown bitwidth");
6961fa9afeSHaowei Wu   }
7061fa9afeSHaowei Wu }
7161fa9afeSHaowei Wu 
convertIFSEndiannessToELF(IFSEndiannessType Endianness)726103fdfaSHaowei Wu uint8_t ifs::convertIFSEndiannessToELF(IFSEndiannessType Endianness) {
7361fa9afeSHaowei Wu   switch (Endianness) {
7461fa9afeSHaowei Wu   case IFSEndiannessType::Little:
7561fa9afeSHaowei Wu     return ELF::ELFDATA2LSB;
7661fa9afeSHaowei Wu   case IFSEndiannessType::Big:
7761fa9afeSHaowei Wu     return ELF::ELFDATA2MSB;
787c53a7d3SSimon Pilgrim   default:
7961fa9afeSHaowei Wu     llvm_unreachable("unknown endianness");
8061fa9afeSHaowei Wu   }
8161fa9afeSHaowei Wu }
8261fa9afeSHaowei Wu 
convertIFSSymbolTypeToELF(IFSSymbolType SymbolType)836103fdfaSHaowei Wu uint8_t ifs::convertIFSSymbolTypeToELF(IFSSymbolType SymbolType) {
8461fa9afeSHaowei Wu   switch (SymbolType) {
8561fa9afeSHaowei Wu   case IFSSymbolType::Object:
8661fa9afeSHaowei Wu     return ELF::STT_OBJECT;
8761fa9afeSHaowei Wu   case IFSSymbolType::Func:
8861fa9afeSHaowei Wu     return ELF::STT_FUNC;
8961fa9afeSHaowei Wu   case IFSSymbolType::TLS:
9061fa9afeSHaowei Wu     return ELF::STT_TLS;
9161fa9afeSHaowei Wu   case IFSSymbolType::NoType:
9261fa9afeSHaowei Wu     return ELF::STT_NOTYPE;
93*8e9c5319SHaowei   default:
94*8e9c5319SHaowei     llvm_unreachable("unknown symbol type");
9561fa9afeSHaowei Wu   }
9661fa9afeSHaowei Wu }
9761fa9afeSHaowei Wu 
convertELFBitWidthToIFS(uint8_t BitWidth)986103fdfaSHaowei Wu IFSBitWidthType ifs::convertELFBitWidthToIFS(uint8_t BitWidth) {
9961fa9afeSHaowei Wu   switch (BitWidth) {
10061fa9afeSHaowei Wu   case ELF::ELFCLASS32:
10161fa9afeSHaowei Wu     return IFSBitWidthType::IFS32;
10261fa9afeSHaowei Wu   case ELF::ELFCLASS64:
10361fa9afeSHaowei Wu     return IFSBitWidthType::IFS64;
10461fa9afeSHaowei Wu   default:
10561fa9afeSHaowei Wu     return IFSBitWidthType::Unknown;
10661fa9afeSHaowei Wu   }
10761fa9afeSHaowei Wu }
10861fa9afeSHaowei Wu 
convertELFEndiannessToIFS(uint8_t Endianness)1096103fdfaSHaowei Wu IFSEndiannessType ifs::convertELFEndiannessToIFS(uint8_t Endianness) {
11061fa9afeSHaowei Wu   switch (Endianness) {
11161fa9afeSHaowei Wu   case ELF::ELFDATA2LSB:
11261fa9afeSHaowei Wu     return IFSEndiannessType::Little;
11361fa9afeSHaowei Wu   case ELF::ELFDATA2MSB:
11461fa9afeSHaowei Wu     return IFSEndiannessType::Big;
11561fa9afeSHaowei Wu   default:
11661fa9afeSHaowei Wu     return IFSEndiannessType::Unknown;
11761fa9afeSHaowei Wu   }
11861fa9afeSHaowei Wu }
11961fa9afeSHaowei Wu 
convertELFSymbolTypeToIFS(uint8_t SymbolType)1206103fdfaSHaowei Wu IFSSymbolType ifs::convertELFSymbolTypeToIFS(uint8_t SymbolType) {
12161fa9afeSHaowei Wu   SymbolType = SymbolType & 0xf;
12261fa9afeSHaowei Wu   switch (SymbolType) {
12361fa9afeSHaowei Wu   case ELF::STT_OBJECT:
12461fa9afeSHaowei Wu     return IFSSymbolType::Object;
12561fa9afeSHaowei Wu   case ELF::STT_FUNC:
12661fa9afeSHaowei Wu     return IFSSymbolType::Func;
12761fa9afeSHaowei Wu   case ELF::STT_TLS:
12861fa9afeSHaowei Wu     return IFSSymbolType::TLS;
12961fa9afeSHaowei Wu   case ELF::STT_NOTYPE:
13061fa9afeSHaowei Wu     return IFSSymbolType::NoType;
13161fa9afeSHaowei Wu   default:
13261fa9afeSHaowei Wu     return IFSSymbolType::Unknown;
13361fa9afeSHaowei Wu   }
13461fa9afeSHaowei Wu }
135