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