1 #include "loader.h"
2 
3 namespace REDasm {
4 
LOADER_PLUGIN_TEST(LoaderPluginB,u8)5 LOADER_PLUGIN_TEST(LoaderPluginB, u8)
6 {
7     RE_UNUSED(request);
8     RE_UNUSED(header);
9     return true;
10 }
11 
LoaderPlugin(AbstractBuffer * buffer)12 LoaderPlugin::LoaderPlugin(AbstractBuffer* buffer): Plugin()
13 {
14     m_buffer = std::unique_ptr<AbstractBuffer>(buffer); // Take ownership
15     m_view = m_buffer->view(0);                         // Full View
16 }
17 
createDocument()18 ListingDocument& LoaderPlugin::createDocument() { m_document = ListingDocument(); return m_document; }
document() const19 const ListingDocument &LoaderPlugin::document() const { return m_document; }
document()20 ListingDocument& LoaderPlugin::document() { return m_document; }
signatures()21 SignatureIdentifiers &LoaderPlugin::signatures() { return m_signatures; }
22 
offset(address_t address) const23 offset_location LoaderPlugin::offset(address_t address) const
24 {
25     for(const Segment& segment : m_document->segments())
26     {
27         if(!segment.contains(address))
28             continue;
29 
30         offset_t offset = (address - segment.address) + segment.offset;
31         return REDasm::make_location(offset, segment.containsOffset(offset));
32     }
33 
34     return REDasm::invalid_location<offset_t>();
35 }
36 
address(offset_t offset) const37 address_location LoaderPlugin::address(offset_t offset) const
38 {
39     for(const Segment& segment : m_document->segments())
40     {
41         if(!segment.containsOffset(offset))
42             continue;
43 
44         address_t address = (offset - segment.offset) + segment.address;
45         return REDasm::make_location(address, segment.contains(address));
46     }
47 
48     return REDasm::invalid_location<address_t>();
49 }
50 
build(const std::string & assembler,offset_t offset,address_t baseaddress,address_t entrypoint)51 void LoaderPlugin::build(const std::string &assembler, offset_t offset, address_t baseaddress, address_t entrypoint) { throw std::runtime_error("Invalid call to LoaderPlugin::build()"); }
createAnalyzer(DisassemblerAPI * disassembler) const52 Analyzer* LoaderPlugin::createAnalyzer(DisassemblerAPI *disassembler) const { return new Analyzer(disassembler); }
assembler() const53 std::string LoaderPlugin::assembler() const { return std::string(); }
buffer() const54 AbstractBuffer *LoaderPlugin::buffer() const { return m_buffer.get(); }
viewOffset(offset_t offset) const55 BufferView LoaderPlugin::viewOffset(offset_t offset) const { return m_buffer->view(offset); }
56 
view(address_t address) const57 BufferView LoaderPlugin::view(address_t address) const
58 {
59     offset_location offset = this->offset(address);
60 
61     if(!offset.valid)
62         return BufferView();
63 
64     return this->viewOffset(offset);
65 }
66 
viewSegment(const Segment * segment) const67 BufferView LoaderPlugin::viewSegment(const Segment *segment) const
68 {
69     if(!segment || segment->empty() || segment->is(SegmentType::Bss))
70         return BufferView();
71 
72     return m_buffer->view(segment->offset, segment->rawSize());
73 }
74 
75 } // namespace REDasm
76