// SPDX-License-Identifier: MIT #ifndef RGBDS_LINK_SECTION_HPP #define RGBDS_LINK_SECTION_HPP // GUIDELINE: external code MUST NOT BE AWARE of the data structure used! #include #include #include #include #include #include "linkdefs.hpp" #include "link/main.hpp" struct FileStackNode; struct Section; struct Symbol; struct Patch { FileStackNode const *src; uint32_t lineNo; uint32_t offset; Section const *pcSection; uint32_t pcSectionID; uint32_t pcOffset; PatchType type; std::vector rpnExpression; }; struct Section { // Info contained in the object files std::string name; uint16_t size; uint16_t offset; SectionType type; SectionModifier modifier; bool isAddressFixed; // This `struct`'s address in ROM. // Importantly for fragments, this does not include `offset`! uint16_t org; bool isBankFixed; uint32_t bank; bool isAlignFixed; uint16_t alignMask; uint16_t alignOfs; FileStackNode const *src; int32_t lineNo; std::vector data; // Array of size `size`, or 0 if `type` does not have data std::vector patches; // Extra info computed during linking std::vector *fileSymbols; std::vector symbols; std::unique_ptr
nextu; // The next "component" of this unionized sect }; // Execute a callback for each section currently registered. // This is to avoid exposing the data structure in which sections are stored. void sect_ForEach(void (*callback)(Section &)); // Registers a section to be processed. void sect_AddSection(std::unique_ptr
&§ion); // Finds a section by its name. Section *sect_GetSection(std::string const &name); // Checks if all sections meet reasonable criteria, such as max size void sect_DoSanityChecks(); #endif // RGBDS_LINK_SECTION_HPP