38 lines
1.3 KiB
C++
38 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include "elna/source/parser.hpp"
|
|
#include "elna/source/optimizer.hpp"
|
|
#include <filesystem>
|
|
#include <elfio/elfio.hpp>
|
|
|
|
namespace elna::riscv
|
|
{
|
|
class elfio_writer final : public source::writer<std::byte>
|
|
{
|
|
ELFIO::section *text;
|
|
ELFIO::symbol_section_accessor symbol_accessor;
|
|
ELFIO::string_section_accessor string_accessor;
|
|
|
|
public:
|
|
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;
|
|
void sink(const std::string& label) override;
|
|
std::size_t size() const override;
|
|
};
|
|
|
|
/**
|
|
* Searches the content by label and returns its index or -1 when the
|
|
* label does not exist.
|
|
*
|
|
* \param symbol_accessor Object accessor.
|
|
* \param needle Label name.
|
|
* \return Data index.
|
|
*/
|
|
std::ptrdiff_t lookup(ELFIO::symbol_section_accessor symbol_accessor, const std::string& label);
|
|
|
|
void riscv32_elf(source::program *ast, source::intermediate_code_generator intermediate_code_generator,
|
|
std::shared_ptr<source::symbol_table> table, const std::filesystem::path& out_file);
|
|
}
|