# SPDX-License-Identifier: GPL-3.0-or-later

set(
  RCCBackendCodeGenSources
  CFIInstrInserter.cpp
  CompilationUnit.cpp
  CommandFlags.cpp
  GlobalObject.cpp
  GenericOpcodes.cpp
  FrameIndexElimination.cpp
  FinalizeISel.cpp
  InstructionDescriptor.cpp
  LowLevelType.cpp
  MachineBasicBlockAttributes.cpp
  MachineCFIInfo.cpp
  MachineCompilationStatus.cpp
  MachineCombiner.cpp
  MachineCombinerPattern.cpp
  MachineBasicBlock.cpp
  MachineBlockPlacement.cpp
  MachineBranchOptimization.cpp
  MachineBranchRelaxation.cpp
  MachineCFGUpdater.cpp
  MachineConstantPool.cpp
  MachineCopyPropagation.cpp
  MachineCSE.cpp
  MachineDebugInfo.cpp
  MachineStripDebug.cpp
  MachineDCE.cpp
  MachineFrameInfo.cpp
  MachineFinalization.cpp
  MachineFunction.cpp
  MachineFunctionAttributes.cpp
  MachineFunctionCloner.cpp
  MachineIRTypes.cpp
  MachineIRBuilder.cpp
  MachineAnalyses.cpp
  MachineInstr.cpp
  MachineJumpTableInfo.cpp
  MachineLICM.cpp
  SlotIndexes.cpp
  LiveVariables.cpp
  LiveInterval.cpp
  LiveIntervals.cpp
  LivePhysRegs.cpp
  LiveRegUnits.cpp
  MachineMemoryFolding.cpp
  MachinePeepholeOptimizer.cpp
  MachineMemOperand.cpp
  MachineMetadata.cpp
  MachineOperand.cpp
  MachineOptimizationPipeline.cpp
  MachineOutliner.cpp
  MachinePassInstrumentation.cpp
  MachinePassManager.cpp
  MachinePseudoExpansion.cpp
  MachineRegisterInfo.cpp
  MachineScheduler.cpp
  MachineShrinkWrapping.cpp
  MachineSink.cpp
  MachineStackSlotColoring.cpp
  MachineTailDuplication.cpp
  PrologueEpilogueInsertion.cpp
  PostRAScheduler.cpp
  RegisterPressure.cpp
  ReachingDefAnalysis.cpp
  RegisterScavenger.cpp
  MacroFusion.cpp
  ScheduleDAG.cpp
  ScheduleHazardRecognizer.cpp
  InlineSpiller.cpp
  LiveRangeEdit.cpp
  LiveRegMatrix.cpp
  RegAllocBase.cpp
  RegAllocBasic.cpp
  RegAllocFast.cpp
  RegAllocGreedy.cpp
  RegAllocPBQP.cpp
  VirtRegMap.cpp
  PHIElimination.cpp
  MachineVerifier.cpp
  MachineFunctionProperties.cpp
  MachineFunctionRecords.cpp
  Register.cpp
  RegisterMask.cpp
  TargetConstant.cpp
  TargetCallLowering.cpp
  TargetInstrInfo.cpp
  TargetDescription.cpp
  TargetFunctionState.cpp
  TargetMIRTextInfo.cpp
  TargetRegisterInfo.cpp
  TargetSchedulingModel.cpp
  TwoAddressInstructionPass.cpp
)
set(
  RCCBackendCodeGenHeaders
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/CFIInstrInserter.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/CompilationUnit.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/CommandFlags.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/CSEConfigBase.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/GlobalObject.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/GenericOpcodes.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/FrameIndexElimination.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/FinalizeISel.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/InstructionDescriptor.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/InlineAsm.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/LowLevelType.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MacroFusion.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineBasicBlockAttributes.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineCFIInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineCompilationStatus.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineCombiner.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineCombinerPattern.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineBasicBlock.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineBlockPlacement.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineBranchOptimization.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineBranchRelaxation.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineCFGUpdater.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineConstantPool.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineCopyPropagation.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineCSE.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineDebugInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineStripDebug.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineDCE.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineFrameInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineFinalization.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineFunction.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineFunctionAttributes.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineFunctionCloner.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineIRTypes.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineIRBuilder.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineAnalyses.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineInstr.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineJumpTableInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineLICM.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/SlotIndexes.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/LiveVariables.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/LiveInterval.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/LiveIntervals.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/LivePhysRegs.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/LiveRegUnits.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineMemoryFolding.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachinePeepholeOptimizer.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineMemOperand.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineMetadata.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineOperand.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineOptimizationPipeline.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineOutliner.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/IR/PassManager.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineFunctionAnalysisManager.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachinePassInstrumentation.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachinePassManager.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachinePseudoExpansion.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/PrologueEpilogueInsertion.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/RegisterPressure.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/ReachingDefAnalysis.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/RegisterScavenger.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/ScheduleDAG.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/ScheduleHazardRecognizer.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetFrameLowering.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineRegisterInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineScheduler.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineShrinkWrapping.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineSink.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineStackSlotColoring.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineTailDuplication.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/PostRAScheduler.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/PBQP/Graph.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/PBQP/Math.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/PBQP/ReductionRules.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/PBQP/Solution.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/PBQP/Solver.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/LiveRangeEdit.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/LiveRegMatrix.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/RegAllocCommon.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/RegAllocFast.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/RegAllocPBQP.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/Spiller.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetRegisterAllocationInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/VirtRegMap.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/PHIElimination.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineVerifier.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineFunctionProperties.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/MachineFunctionRecords.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/Register.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/RegisterBankInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/RegisterMask.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/StableID.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetConstant.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetCallLowering.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetInstrInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetDescription.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetFunctionState.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetMIRTextInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetMemoryFolding.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetRegisterInfo.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetSchedulingModel.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TwoAddressInstructionPass.h"
  "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/TargetPseudoExpansion.h"
)

add_library(RCCBackendCodeGen ${RCCBackendCodeGenSources})
add_library(RCCBackend::CodeGen ALIAS RCCBackendCodeGen)

add_subdirectory(GlobalISel)

rcc_backend_configure_target(RCCBackendCodeGen)

target_include_directories(
  RCCBackendCodeGen
  PUBLIC
    "$<BUILD_INTERFACE:${RCC_BACKEND_SOURCE_DIR}/include>"
    "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
target_link_libraries(RCCBackendCodeGen PUBLIC RCCBackend::IR)

set_target_properties(
  RCCBackendCodeGen
  PROPERTIES
    EXPORT_NAME CodeGen
    OUTPUT_NAME RCCBackendCodeGen
)

install(
  TARGETS RCCBackendCodeGen
  EXPORT RCCBackendTargets
  ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
)

list(
  TRANSFORM RCCBackendCodeGenSources
  PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/"
  OUTPUT_VARIABLE RCCBackendCodeGenSourcePaths
)
set(
  RCCBackendCodeGenPrivateHeaders
  "${CMAKE_CURRENT_SOURCE_DIR}/MachineSchedulerInternal.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/RegAllocBase.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/RegAllocBasic.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/RegAllocGreedy.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/RegAllocInternal.h"
)
rcc_backend_register_format_files(
  ${RCCBackendCodeGenSourcePaths}
  ${RCCBackendCodeGenHeaders}
  ${RCCBackendCodeGenPrivateHeaders}
)
