// SPDX-License-Identifier: GPL-3.0-or-later #ifndef RCC_CODEGEN_MACHINEFUNCTIONCLONER_H #define RCC_CODEGEN_MACHINEFUNCTIONCLONER_H #include "rcc/CodeGen/MachineIRTypes.h" #include "rcc/CodeGen/Register.h" #include "rcc/CodeGen/StableID.h" #include "rcc/Support/Error.h" #include #include #include #include namespace rcc { class MachineBasicBlock; class MachineFunction; class MachineInstr; class TargetDescription; struct MachineFunctionCloneOptions final { MachineFunctionStableID NewStableID; std::optional NewName; }; struct MachineFunctionCloneResult final { MachineFunctionCloneResult(); MachineFunctionCloneResult(const MachineFunctionCloneResult &) = delete; MachineFunctionCloneResult &operator=(const MachineFunctionCloneResult &) = delete; MachineFunctionCloneResult(MachineFunctionCloneResult &&) noexcept; MachineFunctionCloneResult &operator=(MachineFunctionCloneResult &&) noexcept; ~MachineFunctionCloneResult(); std::unique_ptr ClonedFunction; std::unordered_map BlockStableIDs; std::unordered_map InstructionStableIDs; std::unordered_map VirtualRegisters; std::unordered_map FrameIndices; std::unordered_map ConstantPoolIndices; std::unordered_map JumpTableIndices; }; class MachineFunctionCloneContext final { public: [[nodiscard]] const MachineFunction &sourceFunction() const noexcept { return Source; } [[nodiscard]] MachineFunction &destinationFunction() const noexcept { return Destination; } [[nodiscard]] Expected mapBlock(const MachineBasicBlock &SourceBlock) const; [[nodiscard]] Expected mapInstruction(const MachineInstr &SourceInstruction) const; [[nodiscard]] Expected mapBlockStableID(MachineBlockStableID SourceID) const; [[nodiscard]] Expected mapInstructionStableID(MachineInstrStableID SourceID) const; [[nodiscard]] Expected mapRegister(Register SourceRegister) const; [[nodiscard]] Expected mapFrameIndex(FrameIndex SourceIndex) const; [[nodiscard]] Expected mapConstantPoolIndex(ConstantPoolIndex SourceIndex) const; [[nodiscard]] Expected mapJumpTableIndex(JumpTableIndex SourceIndex) const; private: MachineFunctionCloneContext( const MachineFunction &Source, MachineFunction &Destination, const MachineFunctionCloneResult &Result, const std::unordered_map &Blocks, const std::unordered_map &Instructions) noexcept : Source(Source), Destination(Destination), Result(Result), Blocks(Blocks), Instructions(Instructions) {} const MachineFunction &Source; MachineFunction &Destination; const MachineFunctionCloneResult &Result; const std::unordered_map &Blocks; const std::unordered_map &Instructions; friend Expected cloneMachineFunction(const MachineFunction &Source, const TargetDescription &Target, MachineFunctionCloneOptions Options); }; [[nodiscard]] Expected cloneMachineFunction(const MachineFunction &Source, const TargetDescription &Target, MachineFunctionCloneOptions Options); } // namespace rcc #endif // RCC_CODEGEN_MACHINEFUNCTIONCLONER_H