diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 9b0ae2102e0988..9547cc02bc33e6 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -1759,6 +1759,17 @@ class TargetInfo : public TransferrableTargetInfo, return 0; } + /// \returns If a target exposes a flat ptr address space (a flat ptr is a ptr + /// that can be casted to / from all other target address spaces), then return + /// it. Otherwise, return std::nullopt and leave it up to the FE to correctly + /// insert specific address spaces. Note that this is target specific and + /// might not have a corresponding LangAS equivalent, thus it is not safe to + /// unconditionally invoke getLangASFromTargetAS on the value returned by this + /// interface. + virtual std::optional getFlatPtrAddressSpace() const { + return std::nullopt; + } + /// \returns If a target requires an address within a target specific address /// space \p AddressSpace to be converted in order to be used, then return the /// corresponding target specific DWARF address space. diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h index 94d9ba93ed226f..5615bfe97c66cb 100644 --- a/clang/lib/Basic/Targets/AMDGPU.h +++ b/clang/lib/Basic/Targets/AMDGPU.h @@ -379,6 +379,12 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo { return static_cast(llvm::AMDGPUAS::CONSTANT_ADDRESS); } + /// \returns Target specific flat ptr address space; a flat ptr is a ptr that + /// can be casted to / from all other target address spaces. + std::optional getFlatPtrAddressSpace() const override { + return static_cast(llvm::AMDGPUAS::FLAT_ADDRESS); + } + /// \returns If a target requires an address within a target specific address /// space \p AddressSpace to be converted in order to be used, then return the /// corresponding target specific DWARF address space. diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h index 37cf9d7921bac5..3bf9e22204c289 100644 --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -182,6 +182,10 @@ class LLVM_LIBRARY_VISIBILITY BaseSPIRTargetInfo : public TargetInfo { return TargetInfo::VoidPtrBuiltinVaList; } + std::optional getFlatPtrAddressSpace() const override { + return 4u; // 4 is generic i.e. flat for SPIR & SPIR-V. + } + std::optional getDWARFAddressSpace(unsigned AddressSpace) const override { return AddressSpace;