/* * Copyright (C) 2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/device_binary_format/elf/elf.h" #include "shared/source/helpers/aligned_memory.h" #include "shared/source/utilities/arrayref.h" #include "shared/source/utilities/const_stringref.h" #include "shared/source/utilities/stackvec.h" #include #include namespace NEO { namespace Elf { template struct ElfEncoder { ElfEncoder(bool addUndefSectionHeader = true, bool addHeaderSectionNamesSection = true, uint64_t defaultDataAlignment = 8U); void appendSection(const ElfSectionHeader §ionHeader, const ArrayRef sectionData); void appendSegment(const ElfProgramHeader &programHeader, const ArrayRef segmentData); ElfSectionHeader &appendSection(SECTION_HEADER_TYPE sectionType, ConstStringRef sectionLabel, const ArrayRef sectionData); ElfProgramHeader &appendSegment(PROGRAM_HEADER_TYPE segmentType, const ArrayRef segmentData); template ElfSectionHeader &appendSection(SectionHeaderEnumT sectionType, ConstStringRef sectionLabel, const ArrayRef sectionData) { return appendSection(static_cast(sectionType), sectionLabel, sectionData); } template ElfSectionHeader &appendSection(SectionHeaderEnumT sectionType, ConstStringRef sectionLabel, const std::string §ionData) { return appendSection(static_cast(sectionType), sectionLabel, ArrayRef(reinterpret_cast(sectionData.c_str()), sectionData.size() + 1)); } uint32_t appendSectionName(ConstStringRef str); std::vector encode() const; ElfFileHeader &getElfFileHeader() { return elfFileHeader; } protected: bool addUndefSectionHeader = false; bool addHeaderSectionNamesSection = false; uint64_t defaultDataAlignment = 8U; uint64_t maxDataAlignmentNeeded = 1U; ElfFileHeader elfFileHeader; StackVec, 32> programHeaders; StackVec, 32> sectionHeaders; std::vector data; std::vector stringTable; struct { uint32_t shStrTab = 0; uint32_t undef = 0; } specialStringsOffsets; }; extern template struct ElfEncoder; extern template struct ElfEncoder; } // namespace Elf } // namespace NEO