https://github.com/Daniel-Hogan created https://github.com/llvm/llvm-project/pull/237828
Adds implementation for SystemZ TargetCIRGenInfo (following the structure used in #215424). getTargetCIRGenInfo() had no SystemZ case so it fell through to x86_64 target info. The only hook in SystemZTargetCodeGenInfo in classic code gen that has a CIR equivalent is setTargetAttributes. setTargetAttributes adds the s390x-visible-vector-ABI module flag which CIR doesn't emit yet. This is my intended next PR. For now, I add a MissingFeatures marker. The other classic hook testFPKind has no counterpart in TargetCIRGenInfo yet. z/OS uses XPLINK ABI which has its own target info in classic codegen. For now, z/OS uses the SystemZ ELF target info as a placeholder. I marked it with targetCIRGenInfoOS() for follow up. NFC. This is the first step in my plan I laid out in https://discourse.llvm.org/t/rfc-enable-clangir-build-by-default/91730/114. Assisted-by: Claude >From ee519f681400ecf747965e9e4e6d9585df00578c Mon Sep 17 00:00:00 2001 From: Daniel-Hogan <[email protected]> Date: Sun, 1 Nov 2026 22:46:30 -0500 Subject: [PATCH] [CIR][SystemZ][NFC] Add SystemZTargetCIRGenInfo Adds SystemZ TargetCIRGenInfo. z/OS uses XPLINK which has its own target info in classic codegen. I assume this is the route we will take for CIR and eventually create seperate target info for z/OS. For now, z/OS uses the SystemZ ELF target info as a placeholder. No Function changes as of now. Next patch I intend on working on the vector ABI module flag. --- clang/include/clang/CIR/MissingFeatures.h | 1 + clang/lib/CIR/CodeGen/CIRGenModule.cpp | 8 ++++ clang/lib/CIR/CodeGen/CMakeLists.txt | 1 + clang/lib/CIR/CodeGen/TargetInfo.h | 3 ++ clang/lib/CIR/CodeGen/Targets/SystemZ.cpp | 47 +++++++++++++++++++++++ 5 files changed, 60 insertions(+) create mode 100644 clang/lib/CIR/CodeGen/Targets/SystemZ.cpp diff --git a/clang/include/clang/CIR/MissingFeatures.h b/clang/include/clang/CIR/MissingFeatures.h index 1348206f1738ad..0b73847675be64 100644 --- a/clang/include/clang/CIR/MissingFeatures.h +++ b/clang/include/clang/CIR/MissingFeatures.h @@ -281,6 +281,7 @@ struct MissingFeatures { static bool preservedAccessIndexRegion() { return false; } static bool returnValueSlotFeatures() { return false; } static bool runCleanupsScope() { return false; } + static bool s390xVisibleVectorABI() { return false; } static bool sanitizers() { return false; } static bool setDLLStorageClass() { return false; } static bool setNonGC() { return false; } diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp b/clang/lib/CIR/CodeGen/CIRGenModule.cpp index 4e11a6555b62df..c83df2110d1d40 100644 --- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp @@ -399,6 +399,14 @@ const TargetCIRGenInfo &CIRGenModule::getTargetCIRGenInfo() { case llvm::Triple::spirv64: theTargetCIRGenInfo = createCommonSPIRTargetCIRGenInfo(genTypes); return *theTargetCIRGenInfo; + case llvm::Triple::systemz: { + // z/OS XPLINK target info is not implemented yet. + // We just default to SystemZ ELF Target for now. + if (triple.isOSzOS()) + assert(!cir::MissingFeatures::targetCIRGenInfoOS()); + theTargetCIRGenInfo = createSystemZTargetCIRGenInfo(genTypes); + return *theTargetCIRGenInfo; + } } } diff --git a/clang/lib/CIR/CodeGen/CMakeLists.txt b/clang/lib/CIR/CodeGen/CMakeLists.txt index 1f4db82585c20e..f40ff409eb4def 100644 --- a/clang/lib/CIR/CodeGen/CMakeLists.txt +++ b/clang/lib/CIR/CodeGen/CMakeLists.txt @@ -60,6 +60,7 @@ add_clang_library(clangCIR Targets/AMDGPU.cpp Targets/NVPTX.cpp Targets/SPIRV.cpp + Targets/SystemZ.cpp DISABLE_PCH_REUSE # PCH contains private headers PRECOMPILE_HEADERS diff --git a/clang/lib/CIR/CodeGen/TargetInfo.h b/clang/lib/CIR/CodeGen/TargetInfo.h index 09f41fcd3cf9b7..62acf0afa80020 100644 --- a/clang/lib/CIR/CodeGen/TargetInfo.h +++ b/clang/lib/CIR/CodeGen/TargetInfo.h @@ -201,6 +201,9 @@ std::unique_ptr<TargetCIRGenInfo> createNVPTXTargetCIRGenInfo(CIRGenTypes &cgt); std::unique_ptr<TargetCIRGenInfo> createCommonSPIRTargetCIRGenInfo(CIRGenTypes &cgt); +std::unique_ptr<TargetCIRGenInfo> +createSystemZTargetCIRGenInfo(CIRGenTypes &cgt); + } // namespace clang::CIRGen #endif // LLVM_CLANG_LIB_CIR_TARGETINFO_H diff --git a/clang/lib/CIR/CodeGen/Targets/SystemZ.cpp b/clang/lib/CIR/CodeGen/Targets/SystemZ.cpp new file mode 100644 index 00000000000000..73389ece694baa --- /dev/null +++ b/clang/lib/CIR/CodeGen/Targets/SystemZ.cpp @@ -0,0 +1,47 @@ +//===---- SystemZ.cpp - SystemZ-specific CIR CodeGen ----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This provides SystemZ-specific CIR CodeGen logic. +// +//===----------------------------------------------------------------------===// + +#include "ABIInfo.h" +#include "CIRGenModule.h" +#include "TargetInfo.h" +#include "clang/AST/Decl.h" +#include "clang/CIR/MissingFeatures.h" + +using namespace clang; +using namespace clang::CIRGen; + +namespace { + +class SystemZABIInfo : public ABIInfo { +public: + SystemZABIInfo(CIRGenTypes &cgt) : ABIInfo(cgt) {} +}; + +class SystemZTargetCIRGenInfo : public TargetCIRGenInfo { +public: + SystemZTargetCIRGenInfo(CIRGenTypes &cgt) + : TargetCIRGenInfo(std::make_unique<SystemZABIInfo>(cgt)) {} + + void setTargetAttributes(const Decl *d, mlir::Operation *gv, + CIRGenModule &cgm) const override { + if (!d) + return; + assert(!cir::MissingFeatures::s390xVisibleVectorABI()); + } +}; + +} // namespace + +std::unique_ptr<TargetCIRGenInfo> +clang::CIRGen::createSystemZTargetCIRGenInfo(CIRGenTypes &cgt) { + return std::make_unique<SystemZTargetCIRGenInfo>(cgt); +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
