2020-11-24 20:48:38 -05:00
|
|
|
#pragma once
|
|
|
|
#include <cstring>
|
2021-03-07 12:01:59 -05:00
|
|
|
#include <stdexcept>
|
2022-06-22 23:37:46 -04:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
2020-11-24 20:48:38 -05:00
|
|
|
#include "common/common_types.h"
|
2022-02-08 19:02:47 -05:00
|
|
|
#include "common/util/Assert.h"
|
2020-11-24 20:48:38 -05:00
|
|
|
|
2022-06-22 23:37:46 -04:00
|
|
|
#include "decompiler/ObjectFile/LinkedWord.h"
|
|
|
|
|
2021-01-06 20:04:15 -05:00
|
|
|
namespace decompiler {
|
2020-11-24 20:48:38 -05:00
|
|
|
class LinkedWordReader {
|
|
|
|
public:
|
|
|
|
explicit LinkedWordReader(const std::vector<LinkedWord>* words) : m_words(words) {}
|
2021-12-04 12:33:18 -05:00
|
|
|
std::string get_type_tag() {
|
|
|
|
if (m_words->at(m_offset).kind() == LinkedWord::TYPE_PTR) {
|
|
|
|
auto result = m_words->at(m_offset).symbol_name();
|
2020-11-24 20:48:38 -05:00
|
|
|
m_offset++;
|
|
|
|
return result;
|
|
|
|
} else {
|
2022-04-12 18:48:27 -04:00
|
|
|
ASSERT_MSG(false, "LinkedWordReader::get_type_tag failed");
|
2020-11-24 20:48:38 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
T get_word() {
|
|
|
|
static_assert(sizeof(T) == 4, "size of word in get_word");
|
|
|
|
T result;
|
2022-02-08 19:02:47 -05:00
|
|
|
ASSERT(m_words->at(m_offset).kind() == LinkedWord::PLAIN_DATA);
|
2020-11-24 20:48:38 -05:00
|
|
|
memcpy(&result, &m_words->at(m_offset).data, 4);
|
|
|
|
m_offset++;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 words_left() {
|
2022-02-08 19:02:47 -05:00
|
|
|
ASSERT(m_words->size() >= m_offset);
|
2020-11-24 20:48:38 -05:00
|
|
|
return m_words->size() - m_offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
const std::vector<LinkedWord>* m_words = nullptr;
|
|
|
|
u32 m_offset = 0;
|
2021-01-06 20:04:15 -05:00
|
|
|
};
|
2022-01-02 18:02:10 -05:00
|
|
|
} // namespace decompiler
|