// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_MC_MCOBJECTWRITER_H #define RCC_MC_MCOBJECTWRITER_H #include "rcc/MC/MCSection.h" #include "rcc/MC/MCSymbol.h" #include "rcc/Support/Error.h" #include #include #include #include namespace rcc::mc { enum class MCObjectSymbolBinding : std::uint8_t { Local, Global, Weak, }; enum class MCObjectSymbolType : std::uint8_t { None, Function, Object, TLSObject, Section, }; enum class MCObjectSymbolVisibility : std::uint8_t { Default, Hidden, Protected, }; struct MCObjectRelocation final { std::uint64_t Offset = 0; std::uint32_t Type = 0; MCSymbolRef Symbol; std::int64_t Addend = 0; }; struct MCObjectSection final { MCSectionRef Section; std::vector Contents; std::uint64_t AddressSize = 0; std::uint64_t Alignment = 1; std::vector Relocations; }; struct MCObjectSymbol final { MCSymbolRef Symbol; MCObjectSymbolBinding Binding = MCObjectSymbolBinding::Local; MCObjectSymbolType Type = MCObjectSymbolType::None; MCObjectSymbolVisibility Visibility = MCObjectSymbolVisibility::Default; std::optional SectionIndex; std::uint64_t Value = 0; std::uint64_t Size = 0; std::uint64_t CommonAlignment = 0; }; struct MCAssembledObject final { std::vector Sections; std::vector Symbols; std::uint32_t Flags = 0; }; class MCObjectWriter { public: virtual ~MCObjectWriter() = default; [[nodiscard]] virtual Expected> writeObject(const MCAssembledObject &Object) const = 0; }; } // namespace rcc::mc #endif // RCC_MC_MCOBJECTWRITER_H