Remove unused section writer
This commit is contained in:
parent
611f43e5d8
commit
e95d63c620
@ -5,7 +5,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
|
|||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
|
||||||
find_package(Boost COMPONENTS program_options REQUIRED)
|
find_package(Boost COMPONENTS process program_options REQUIRED)
|
||||||
find_package(FLEX)
|
find_package(FLEX)
|
||||||
include_directories(${Boost_INCLUDE_DIR})
|
include_directories(${Boost_INCLUDE_DIR})
|
||||||
|
|
||||||
|
@ -4,87 +4,9 @@
|
|||||||
|
|
||||||
namespace elna::riscv
|
namespace elna::riscv
|
||||||
{
|
{
|
||||||
elfio_section_writer::iterator::reference elfio_section_writer::iterator::operator*() const noexcept
|
elfio_writer::elfio_writer(ELFIO::section *text,
|
||||||
{
|
|
||||||
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<const char *>(data), size);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::pair<std::string_view, bool> 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<std::string_view, bool>(labels.back(), true);
|
|
||||||
}
|
|
||||||
return std::pair<std::string_view, bool>(found->label, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
elfio_section_writer::iterator elfio_section_writer::begin() const
|
|
||||||
{
|
|
||||||
return elfio_section_writer::iterator(labels.cbegin(), sizes.cbegin(),
|
|
||||||
reinterpret_cast<const std::byte *>(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::symbol_section_accessor symbol_accessor, ELFIO::string_section_accessor string_accessor)
|
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)
|
symbol_accessor(symbol_accessor), string_accessor(string_accessor)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -100,20 +22,6 @@ namespace elna::riscv
|
|||||||
return text->get_size();
|
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)
|
void elfio_writer::sink(const std::string& label)
|
||||||
{
|
{
|
||||||
this->symbol_accessor.add_symbol(this->string_accessor, "printf", 0x00000000, 0,
|
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_link(sym_sec->get_index());
|
||||||
rel_sec->set_flags(ELFIO::SHF_ALLOC);
|
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
|
// Create symbol relocation table writers
|
||||||
ELFIO::symbol_section_accessor syma(writer, sym_sec);
|
ELFIO::symbol_section_accessor syma(writer, sym_sec);
|
||||||
ELFIO::relocation_section_accessor rela(writer, rel_sec);
|
ELFIO::relocation_section_accessor rela(writer, rel_sec);
|
||||||
auto _writer = std::make_shared<elfio_writer>(text_sec, ro_sec, syma, stra);
|
|
||||||
|
|
||||||
|
auto _writer = std::make_shared<elfio_writer>(text_sec, syma, stra);
|
||||||
auto references = generate(intermediate_code_generator, table, _writer);
|
auto references = generate(intermediate_code_generator, table, _writer);
|
||||||
|
|
||||||
syma.arrange_local_symbols();
|
syma.arrange_local_symbols();
|
||||||
|
@ -7,87 +7,17 @@
|
|||||||
|
|
||||||
namespace elna::riscv
|
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<std::string>::const_iterator labels;
|
|
||||||
std::vector<std::size_t>::const_iterator sizes;
|
|
||||||
value_type payload;
|
|
||||||
|
|
||||||
iterator(std::vector<std::string>::const_iterator labels, std::vector<std::size_t>::const_iterator sizes,
|
|
||||||
const std::byte *data)
|
|
||||||
: labels(labels), sizes(sizes)
|
|
||||||
{
|
|
||||||
if (data != nullptr)
|
|
||||||
{
|
|
||||||
payload = { *this->labels, data, *this->sizes};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator(std::vector<std::string>::const_iterator labels, std::vector<std::size_t>::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<std::string_view, bool> operator()(const std::byte *data, std::size_t size);
|
|
||||||
|
|
||||||
iterator begin() const;
|
|
||||||
iterator end() const;
|
|
||||||
|
|
||||||
ELFIO::section *section() noexcept;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<std::string> labels;
|
|
||||||
std::vector<std::size_t> sizes;
|
|
||||||
ELFIO::section *m_section;
|
|
||||||
};
|
|
||||||
|
|
||||||
class elfio_writer final : public source::writer<std::byte>
|
class elfio_writer final : public source::writer<std::byte>
|
||||||
{
|
{
|
||||||
ELFIO::section *text;
|
ELFIO::section *text;
|
||||||
elfio_section_writer read_only;
|
|
||||||
ELFIO::symbol_section_accessor symbol_accessor;
|
ELFIO::symbol_section_accessor symbol_accessor;
|
||||||
ELFIO::string_section_accessor string_accessor;
|
ELFIO::string_section_accessor string_accessor;
|
||||||
|
|
||||||
public:
|
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);
|
ELFIO::string_section_accessor string_accessor);
|
||||||
|
|
||||||
std::size_t sink(const std::string& label, const std::byte *data, std::size_t size) override;
|
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;
|
void sink(const std::string& label) override;
|
||||||
std::size_t size() const override;
|
std::size_t size() const override;
|
||||||
};
|
};
|
||||||
|
@ -171,16 +171,6 @@ namespace elna::source
|
|||||||
*/
|
*/
|
||||||
virtual std::size_t sink(const std::string& label, const T *data, std::size_t size) = 0;
|
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.
|
* Creates an external symbol.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user