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 AndricIFSStub::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 AndricIFSStub::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 AndricIFSStubTriple::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 AndricIFSStubTriple::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 AndricIFSStubTriple::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 Andricbool IFSTarget::empty() { 57fe6060f1SDimitry Andric return !Triple && !ObjectFormat && !Arch && !ArchString && !Endianness && 58fe6060f1SDimitry Andric !BitWidth; 59fe6060f1SDimitry Andric } 60fe6060f1SDimitry Andric convertIFSBitWidthToELF(IFSBitWidthType BitWidth)61fe6060f1SDimitry Andricuint8_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 Andricuint8_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 Andricuint8_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 AndricIFSBitWidthType 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 AndricIFSEndiannessType 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 AndricIFSSymbolType 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