/* * Copyright (C) 2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/device_binary_format/elf/elf.h" #include "shared/source/utilities/arrayref.h" #include "shared/source/utilities/const_stringref.h" #include "shared/source/utilities/stackvec.h" #include namespace NEO { namespace Elf { template struct Elf { struct ProgramHeaderAndData { const ElfProgramHeader *header = nullptr; ArrayRef data; }; struct SectionHeaderAndData { const ElfSectionHeader *header; ArrayRef data; }; const ElfFileHeader *elfFileHeader = nullptr; StackVec programHeaders; StackVec sectionHeaders; }; template const ElfFileHeader *decodeElfFileHeader(const ArrayRef binary); extern template const ElfFileHeader *decodeElfFileHeader(const ArrayRef); extern template const ElfFileHeader *decodeElfFileHeader(const ArrayRef); template Elf decodeElf(const ArrayRef binary, std::string &outErrReason, std::string &outWarning); extern template Elf decodeElf(const ArrayRef, std::string &, std::string &); extern template Elf decodeElf(const ArrayRef, std::string &, std::string &); template inline bool isElf(const ArrayRef binary) { return (nullptr != decodeElfFileHeader(binary)); } inline bool isElf(const ArrayRef binary) { return isElf(binary) || isElf(binary); } inline ELF_IDENTIFIER_CLASS getElfNumBits(const ArrayRef binary) { if (isElf(binary)) { return EI_CLASS_32; } else if (isElf(binary)) { return EI_CLASS_64; } return EI_CLASS_NONE; } } // namespace Elf } // namespace NEO