From e95d63c6209c05f144aa2d2d8e58ca58d156b7f6 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 30 Aug 2024 19:46:43 +0200 Subject: [PATCH] Remove unused section writer --- CMakeLists.txt | 2 +- backend/target.cpp | 104 +------------------------------- include/elna/backend/target.hpp | 72 +--------------------- include/elna/source/result.hpp | 10 --- 4 files changed, 5 insertions(+), 183 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 215a0ab..9e2bd7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS 1) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_CXX_STANDARD 17) -find_package(Boost COMPONENTS program_options REQUIRED) +find_package(Boost COMPONENTS process program_options REQUIRED) find_package(FLEX) include_directories(${Boost_INCLUDE_DIR}) diff --git a/backend/target.cpp b/backend/target.cpp index aa105c1..7dd27c5 100644 --- a/backend/target.cpp +++ b/backend/target.cpp @@ -4,87 +4,9 @@ namespace elna::riscv { - elfio_section_writer::iterator::reference elfio_section_writer::iterator::operator*() const noexcept - { - return payload; - } - - elfio_section_writer::iterator::pointer elfio_section_writer::iterator::operator->() const noexcept - { - return &payload; - } - - elfio_section_writer::iterator& elfio_section_writer::iterator::operator++() - { - this->payload.data += *this->sizes; - this->payload.label = *(++this->labels); - this->payload.size = *(++this->sizes); - - return *this; - } - - elfio_section_writer::iterator& elfio_section_writer::iterator::operator++(int) - { - auto tmp = *this; - ++(*this); - return *this; - } - - bool elfio_section_writer::iterator::operator==(const iterator& that) const - { - return this->labels == that.labels; - } - - bool elfio_section_writer::iterator::operator!=(const iterator& that) const - { - return !(*this == that); - } - - elfio_section_writer::elfio_section_writer(ELFIO::section *section) - : m_section(section) - { - } - - void elfio_section_writer::operator()(const std::string& label, const std::byte *data, std::size_t size) - { - labels.push_back(label); - sizes.push_back(size); - m_section->append_data(reinterpret_cast(data), size); - } - - std::pair elfio_section_writer::operator()(const std::byte *data, std::size_t size) - { - auto found = std::find_if(begin(), end(), - [data, size](elfio_section_writer::entry entry) { - return size == entry.size && std::memcmp(entry.data, data, size) == 0; - }); - if (found == end()) - { - (*this)(".CL" + std::to_string(labels.size()), data, size); - return std::pair(labels.back(), true); - } - return std::pair(found->label, false); - } - - elfio_section_writer::iterator elfio_section_writer::begin() const - { - return elfio_section_writer::iterator(labels.cbegin(), sizes.cbegin(), - reinterpret_cast(m_section->get_data())); - } - - elfio_section_writer::iterator elfio_section_writer::end() const - { - return elfio_section_writer::iterator(labels.cend(), sizes.cend()); - } - - ELFIO::section *elfio_section_writer::section() noexcept - { - return m_section; - } - - elfio_writer::elfio_writer(ELFIO::section *text, ELFIO::section *read_only, + elfio_writer::elfio_writer(ELFIO::section *text, ELFIO::symbol_section_accessor symbol_accessor, ELFIO::string_section_accessor string_accessor) - : text(text), read_only(elfio_section_writer(read_only)), + : text(text), symbol_accessor(symbol_accessor), string_accessor(string_accessor) { } @@ -100,20 +22,6 @@ namespace elna::riscv return text->get_size(); } - std::string_view elfio_writer::sink(const std::byte *data, std::size_t size) - { - auto offset = read_only.section()->get_size(); - auto [result, inserted] = read_only(data, size); - - if (inserted) - { - this->symbol_accessor.add_symbol(this->string_accessor, result.data(), offset, - result.size(), ELFIO::STB_LOCAL, ELFIO::STT_NOTYPE, 0, - read_only.section()->get_index()); - } - return result; - } - void elfio_writer::sink(const std::string& label) { this->symbol_accessor.add_symbol(this->string_accessor, "printf", 0x00000000, 0, @@ -188,17 +96,11 @@ namespace elna::riscv rel_sec->set_link(sym_sec->get_index()); rel_sec->set_flags(ELFIO::SHF_ALLOC); - // Create read only data section - ELFIO::section* ro_sec = writer.sections.add(".rodata"); - ro_sec->set_type(ELFIO::SHT_PROGBITS); - ro_sec->set_flags(ELFIO::SHF_ALLOC); - ro_sec->set_addr_align(0x4); - // Create symbol relocation table writers ELFIO::symbol_section_accessor syma(writer, sym_sec); ELFIO::relocation_section_accessor rela(writer, rel_sec); - auto _writer = std::make_shared(text_sec, ro_sec, syma, stra); + auto _writer = std::make_shared(text_sec, syma, stra); auto references = generate(intermediate_code_generator, table, _writer); syma.arrange_local_symbols(); diff --git a/include/elna/backend/target.hpp b/include/elna/backend/target.hpp index 2b3a1af..e588477 100644 --- a/include/elna/backend/target.hpp +++ b/include/elna/backend/target.hpp @@ -7,87 +7,17 @@ namespace elna::riscv { - /** - * Writer to a single label. - */ - struct elfio_section_writer - { - struct entry - { - std::string_view label; - const std::byte *data{ nullptr }; - std::size_t size{ 0 }; - }; - - /** - * An iterator over label and string pairs. - */ - struct iterator - { - using iterator_category = std::forward_iterator_tag; - using difference_type = ptrdiff_t; - using value_type = entry; - using pointer = const value_type *; - using reference = const value_type&; - - reference operator*() const noexcept; - pointer operator->() const noexcept; - iterator& operator++(); - iterator& operator++(int); - bool operator==(const iterator& that) const; - bool operator!=(const iterator& that) const; - - private: - std::vector::const_iterator labels; - std::vector::const_iterator sizes; - value_type payload; - - iterator(std::vector::const_iterator labels, std::vector::const_iterator sizes, - const std::byte *data) - : labels(labels), sizes(sizes) - { - if (data != nullptr) - { - payload = { *this->labels, data, *this->sizes}; - } - } - - iterator(std::vector::const_iterator labels, std::vector::const_iterator sizes) - : labels(labels), sizes(sizes), payload{} - { - } - - friend elfio_section_writer; - }; - explicit elfio_section_writer(ELFIO::section *section); - - void operator()(const std::string& label, const std::byte *data, std::size_t size); - std::pair operator()(const std::byte *data, std::size_t size); - - iterator begin() const; - iterator end() const; - - ELFIO::section *section() noexcept; - - private: - std::vector labels; - std::vector sizes; - ELFIO::section *m_section; - }; - class elfio_writer final : public source::writer { ELFIO::section *text; - elfio_section_writer read_only; ELFIO::symbol_section_accessor symbol_accessor; ELFIO::string_section_accessor string_accessor; public: - elfio_writer(ELFIO::section *text, ELFIO::section *read_only, ELFIO::symbol_section_accessor symbol_accessor, + elfio_writer(ELFIO::section *text, ELFIO::symbol_section_accessor symbol_accessor, ELFIO::string_section_accessor string_accessor); std::size_t sink(const std::string& label, const std::byte *data, std::size_t size) override; - std::string_view sink(const std::byte *data, std::size_t size) override; void sink(const std::string& label) override; std::size_t size() const override; }; diff --git a/include/elna/source/result.hpp b/include/elna/source/result.hpp index b75a38e..bd39e14 100644 --- a/include/elna/source/result.hpp +++ b/include/elna/source/result.hpp @@ -171,16 +171,6 @@ namespace elna::source */ virtual std::size_t sink(const std::string& label, const T *data, std::size_t size) = 0; - /** - * Writes data and returns a label under that the data can be accessed. - * - * \param data Data to be written. - * \param size Data size. - * - * \return Label for the symbol. - */ - virtual std::string_view sink(const T *data, std::size_t size) = 0; - /** * Creates an external symbol. */