// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_TARGET_RISCV_RISCVTARGETCONSTANT_H #define RCC_TARGET_RISCV_RISCVTARGETCONSTANT_H #include "rcc/CodeGen/TargetConstant.h" #include #include #include #include #include #include #include #include namespace rcc::riscv { enum class RISCVSymbolConstantKind : std::uint8_t { GlobalValue, ExternalSymbol, }; class RISCVSymbolConstant final { public: RISCVSymbolConstant(RISCVSymbolConstantKind Kind, std::string Symbol, std::int64_t Addend = 0) : ConstantKind(Kind), SymbolName(std::move(Symbol)), SymbolAddend(Addend) {} [[nodiscard]] static constexpr TargetConstantTypeID stableTypeID() noexcept { return TargetConstantTypeID::fromValue(0x5243435256435001ULL); } [[nodiscard]] static constexpr std::uint32_t schemaVersion() noexcept { return 1; } [[nodiscard]] Expected verify() const; [[nodiscard]] Expected clone() const; [[nodiscard]] std::uint64_t stableHash() const noexcept; [[nodiscard]] std::string print() const; [[nodiscard]] Expected> encode() const; [[nodiscard]] Expected emit() const; [[nodiscard]] Alignment requiredAlignment() const noexcept; [[nodiscard]] std::optional relocationKind() const noexcept; [[nodiscard]] static Expected parse(std::string_view Text); [[nodiscard]] static Expected decode(std::uint32_t Version, std::span Payload); [[nodiscard]] RISCVSymbolConstantKind kind() const noexcept { return ConstantKind; } [[nodiscard]] std::string_view symbol() const noexcept { return SymbolName; } [[nodiscard]] std::int64_t addend() const noexcept { return SymbolAddend; } friend bool operator==(const RISCVSymbolConstant &Left, const RISCVSymbolConstant &Right) = default; private: RISCVSymbolConstantKind ConstantKind; std::string SymbolName; std::int64_t SymbolAddend = 0; }; } // namespace rcc::riscv #endif // RCC_TARGET_RISCV_RISCVTARGETCONSTANT_H