[clang] [llvm] [HLSL] Pack Intrinsics and related types (PR #224277)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 17 05:22:48 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-modules
Author: Alexander Johnston (Alexander-Johnston)
<details>
<summary>Changes</summary>
This patch adds the pack_u8/s8 and pack_clamp_u8/s8 intrinsics and the HLSL SM6.6 packed types they use.
The new types, int8_t4_packed and uint8_t4_packed, are convertible to uint as described in the DirectX Specs. They do not have the full breadth of DXCs implementation, which allows undefiend behaviour such as increment operators.
---
Patch is 89.85 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/224277.diff
70 Files Affected:
- (modified) clang/include/clang/AST/ASTContext.h (+2)
- (modified) clang/include/clang/AST/TypeBase.h (+20-1)
- (modified) clang/include/clang/AST/TypeProperties.td (+4)
- (modified) clang/include/clang/Basic/Builtins.td (+24)
- (modified) clang/include/clang/Basic/HLSLIntrinsics.td (+38)
- (added) clang/include/clang/Basic/HLSLPackedTypes.def (+31)
- (modified) clang/include/clang/Basic/Specifiers.h (+3)
- (modified) clang/include/clang/Basic/TokenKinds.def (+3)
- (modified) clang/include/clang/Sema/DeclSpec.h (+3)
- (modified) clang/include/clang/Sema/Overload.h (+3)
- (modified) clang/include/clang/Sema/SemaHLSL.h (+1)
- (modified) clang/include/clang/Serialization/ASTBitCodes.h (+4-1)
- (modified) clang/lib/AST/ASTContext.cpp (+15)
- (modified) clang/lib/AST/ASTImporter.cpp (+4)
- (modified) clang/lib/AST/ExprConstant.cpp (+2)
- (modified) clang/lib/AST/ItaniumMangle.cpp (+5)
- (modified) clang/lib/AST/MicrosoftMangle.cpp (+6)
- (modified) clang/lib/AST/NSAPI.cpp (+2)
- (modified) clang/lib/AST/PrintfFormatString.cpp (+3)
- (modified) clang/lib/AST/Type.cpp (+8)
- (modified) clang/lib/AST/TypeLoc.cpp (+2)
- (modified) clang/lib/CodeGen/CGDebugInfo.cpp (+4)
- (modified) clang/lib/CodeGen/CGDebugInfo.h (+3)
- (modified) clang/lib/CodeGen/CGHLSLBuiltins.cpp (+24)
- (modified) clang/lib/CodeGen/CGHLSLRuntime.h (+4)
- (modified) clang/lib/CodeGen/CodeGenTypes.cpp (+4)
- (modified) clang/lib/CodeGen/ItaniumCXXABI.cpp (+2)
- (modified) clang/lib/CodeGen/QualTypeMapper.cpp (+4)
- (modified) clang/lib/Parse/ParseDecl.cpp (+13)
- (modified) clang/lib/Parse/ParseExpr.cpp (+2)
- (modified) clang/lib/Parse/ParseExprCXX.cpp (+5)
- (modified) clang/lib/Parse/ParseTentative.cpp (+4)
- (modified) clang/lib/Sema/DeclSpec.cpp (+6)
- (modified) clang/lib/Sema/SemaCast.cpp (+9)
- (modified) clang/lib/Sema/SemaExpr.cpp (+4)
- (modified) clang/lib/Sema/SemaExprCXX.cpp (+12-1)
- (modified) clang/lib/Sema/SemaHLSL.cpp (+82)
- (modified) clang/lib/Sema/SemaOverload.cpp (+39)
- (modified) clang/lib/Sema/SemaTemplateVariadic.cpp (+2)
- (modified) clang/lib/Sema/SemaType.cpp (+6)
- (modified) clang/lib/Serialization/ASTCommon.cpp (+5)
- (modified) clang/lib/Serialization/ASTReader.cpp (+5)
- (modified) clang/lib/UnifiedSymbolResolution/USRGeneration.cpp (+5)
- (added) clang/test/AST/HLSL/int8_t4_packed.hlsl (+8)
- (added) clang/test/AST/HLSL/uint8_t4_packed.hlsl (+8)
- (added) clang/test/CodeGenHLSL/builtins/pack_clamp_s8.hlsl (+16)
- (added) clang/test/CodeGenHLSL/builtins/pack_clamp_u8.hlsl (+16)
- (added) clang/test/CodeGenHLSL/builtins/pack_s8.hlsl (+16)
- (added) clang/test/CodeGenHLSL/builtins/pack_u8.hlsl (+16)
- (added) clang/test/SemaHLSL/BuiltIns/pack_clamp_s8.hlsl (+61)
- (added) clang/test/SemaHLSL/BuiltIns/pack_clamp_u8.hlsl (+61)
- (added) clang/test/SemaHLSL/BuiltIns/pack_s8.hlsl (+61)
- (added) clang/test/SemaHLSL/BuiltIns/pack_u8.hlsl (+61)
- (added) clang/test/SemaHLSL/BuiltIns/packed-types.hlsl (+20)
- (added) clang/test/SemaHLSL/Types/int8_t4_packed-size.hlsl (+5)
- (added) clang/test/SemaHLSL/Types/uint8_t4_packed-size.hlsl (+5)
- (modified) clang/tools/libclang/CIndex.cpp (+2)
- (modified) llvm/include/llvm/IR/IntrinsicsDirectX.td (+6)
- (modified) llvm/include/llvm/IR/IntrinsicsSPIRV.td (+4)
- (modified) llvm/lib/Target/DirectX/DXIL.td (+9)
- (modified) llvm/lib/Target/DirectX/DXILOpLowering.cpp (+34)
- (modified) llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp (+55)
- (added) llvm/test/CodeGen/DirectX/pack_clamp_s8.ll (+26)
- (added) llvm/test/CodeGen/DirectX/pack_clamp_u8.ll (+26)
- (added) llvm/test/CodeGen/DirectX/pack_s8.ll (+26)
- (added) llvm/test/CodeGen/DirectX/pack_u8.ll (+26)
- (added) llvm/test/CodeGen/SPIRV/hlsl-intrinsics/pack_clamp_s8.ll (+44)
- (added) llvm/test/CodeGen/SPIRV/hlsl-intrinsics/pack_clamp_u8.ll (+42)
- (added) llvm/test/CodeGen/SPIRV/hlsl-intrinsics/pack_s8.ll (+28)
- (added) llvm/test/CodeGen/SPIRV/hlsl-intrinsics/pack_u8.ll (+28)
``````````diff
diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h
index 2f7d39599c477..d686b0ae9f95e 100644
--- a/clang/include/clang/AST/ASTContext.h
+++ b/clang/include/clang/AST/ASTContext.h
@@ -1422,6 +1422,8 @@ class ASTContext : public RefCountedBase<ASTContext> {
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
+#include "clang/Basic/HLSLPackedTypes.def"
#define SPIRV_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
#include "clang/Basic/SPIRVTypes.def"
diff --git a/clang/include/clang/AST/TypeBase.h b/clang/include/clang/AST/TypeBase.h
index 424a2afee84da..040e593cd8ba0 100644
--- a/clang/include/clang/AST/TypeBase.h
+++ b/clang/include/clang/AST/TypeBase.h
@@ -2796,8 +2796,11 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase {
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) bool is##Id##Type() const;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) bool is##Id##Type() const;
+#include "clang/Basic/HLSLPackedTypes.def"
bool isHLSLSpecificType() const; // Any HLSL specific type
bool isHLSLBuiltinIntangibleType() const; // Any HLSL builtin intangible type
+ bool isHLSLBuiltinPackedType() const;
bool isHLSLAttributedResourceType() const;
bool isHLSLInlineSpirvType() const;
bool isHLSLResourceRecord() const;
@@ -3265,6 +3268,9 @@ class BuiltinType : public Type {
// HLSL intangible Types
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) Id,
#include "clang/Basic/HLSLIntangibleTypes.def"
+// HLSL intangible Types
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) Id,
+#include "clang/Basic/HLSLPackedTypes.def"
// SPIRV types
#define SPIRV_TYPE(Name, Id, SingletonId) Id,
#include "clang/Basic/SPIRVTypes.def"
@@ -8960,6 +8966,12 @@ inline bool Type::isOpenCLSpecificType() const {
}
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
+ inline bool Type::is##Id##Type() const { \
+ return isSpecificBuiltinType(BuiltinType::Id); \
+ }
+#include "clang/Basic/HLSLPackedTypes.def"
+
#define SPIRV_TYPE(Name, Id, SingletonId) \
inline bool Type::is##Id##Type() const { \
return isSpecificBuiltinType(BuiltinType::Id); \
@@ -8973,9 +8985,16 @@ inline bool Type::isHLSLBuiltinIntangibleType() const {
false;
}
+inline bool Type::isHLSLBuiltinPackedType() const {
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) is##Id##Type() ||
+ return
+#include "clang/Basic/HLSLPackedTypes.def"
+ false;
+}
+
inline bool Type::isHLSLSpecificType() const {
return isHLSLBuiltinIntangibleType() || isHLSLAttributedResourceType() ||
- isHLSLInlineSpirvType();
+ isHLSLInlineSpirvType() || isHLSLBuiltinPackedType();
}
inline bool Type::isHLSLAttributedResourceType() const {
diff --git a/clang/include/clang/AST/TypeProperties.td b/clang/include/clang/AST/TypeProperties.td
index dc2a45ec85729..c6e494ddb75c1 100644
--- a/clang/include/clang/AST/TypeProperties.td
+++ b/clang/include/clang/AST/TypeProperties.td
@@ -885,6 +885,10 @@ let Class = BuiltinType in {
case BuiltinType::ID: return ctx.SINGLETON_ID;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(NAME, ID, SINGLETON_ID) \
+ case BuiltinType::ID: return ctx.SINGLETON_ID;
+#include "clang/Basic/HLSLPackedTypes.def"
+
#define SPIRV_TYPE(NAME, ID, SINGLETON_ID) \
case BuiltinType::ID: return ctx.SINGLETON_ID;
#include "clang/Basic/SPIRVTypes.def"
diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td
index 90340ad7f812c..d5d8ffd79659f 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -5878,6 +5878,30 @@ def HLSLDdyFine : LangBuiltin<"HLSL_LANG"> {
let Prototype = "void(...)";
}
+def HLSLPackU8 : LangBuiltin<"HLSL_LANG"> {
+ let Spellings = ["__builtin_hlsl_pack_u8"];
+ let Attributes = [NoThrow, CustomTypeChecking];
+ let Prototype = "void(...)";
+}
+
+def HLSLPackS8 : LangBuiltin<"HLSL_LANG"> {
+ let Spellings = ["__builtin_hlsl_pack_s8"];
+ let Attributes = [NoThrow, CustomTypeChecking];
+ let Prototype = "void(...)";
+}
+
+def HLSLPackClampU8 : LangBuiltin<"HLSL_LANG"> {
+ let Spellings = ["__builtin_hlsl_pack_clamp_u8"];
+ let Attributes = [NoThrow, CustomTypeChecking];
+ let Prototype = "void(...)";
+}
+
+def HLSLPackClampS8 : LangBuiltin<"HLSL_LANG"> {
+ let Spellings = ["__builtin_hlsl_pack_clamp_s8"];
+ let Attributes = [NoThrow, CustomTypeChecking];
+ let Prototype = "void(...)";
+}
+
// Builtins for XRay.
def XRayCustomEvent : Builtin {
let Spellings = ["__xray_customevent"];
diff --git a/clang/include/clang/Basic/HLSLIntrinsics.td b/clang/include/clang/Basic/HLSLIntrinsics.td
index 21c0960b6fa23..6a61d15773675 100644
--- a/clang/include/clang/Basic/HLSLIntrinsics.td
+++ b/clang/include/clang/Basic/HLSLIntrinsics.td
@@ -65,6 +65,8 @@ def IntTy : HLSLType<"int">;
def UIntTy : HLSLType<"uint">;
def Int64Ty : HLSLType<"int64_t">;
def UInt64Ty : HLSLType<"uint64_t">;
+def Int8PackedTy : HLSLType<"int8_t4_packed">;
+def UInt8PackedTy : HLSLType<"uint8_t4_packed">;
//===----------------------------------------------------------------------===//
// Element type groups
@@ -1922,3 +1924,39 @@ the specified wave.
let Availability = SM6_0;
let VaryingMatDims = [];
}
+
+def hlsl_pack_u8 : HLSLOneArgBuiltin<"pack_u8", "__builtin_hlsl_pack_u8"> {
+ let VaryingTypes = [UInt16Ty, UIntTy];
+ let VaryingScalar = 0;
+ let VaryingVecSizes = [4];
+ let VaryingMatDims = [];
+ let ReturnType = UInt8PackedTy;
+ let Availability = SM6_6;
+}
+
+def hlsl_pack_s8 : HLSLOneArgBuiltin<"pack_s8", "__builtin_hlsl_pack_s8"> {
+ let VaryingTypes = [Int16Ty, IntTy];
+ let VaryingScalar = 0;
+ let VaryingVecSizes = [4];
+ let VaryingMatDims = [];
+ let ReturnType = Int8PackedTy;
+ let Availability = SM6_6;
+}
+
+def hlsl_pack_clamp_u8 : HLSLOneArgBuiltin<"pack_clamp_u8", "__builtin_hlsl_pack_clamp_u8"> {
+ let VaryingTypes = [Int16Ty, IntTy];
+ let VaryingScalar = 0;
+ let VaryingVecSizes = [4];
+ let VaryingMatDims = [];
+ let ReturnType = UInt8PackedTy;
+ let Availability = SM6_6;
+}
+
+def hlsl_pack_clamp_s8 : HLSLOneArgBuiltin<"pack_clamp_s8", "__builtin_hlsl_pack_clamp_s8"> {
+ let VaryingTypes = [Int16Ty, IntTy];
+ let VaryingScalar = 0;
+ let VaryingVecSizes = [4];
+ let VaryingMatDims = [];
+ let ReturnType = Int8PackedTy;
+ let Availability = SM6_6;
+}
diff --git a/clang/include/clang/Basic/HLSLPackedTypes.def b/clang/include/clang/Basic/HLSLPackedTypes.def
new file mode 100644
index 0000000000000..763267bb779eb
--- /dev/null
+++ b/clang/include/clang/Basic/HLSLPackedTypes.def
@@ -0,0 +1,31 @@
+//===-- HLSLPackedTypes.def - HLSL packed scalar types ----------*- C++ -*-===//
+//
+// 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 file defines HLSL SM 6.6 packed types.
+//
+// The macro is:
+//
+// HLSL_PACKED_TYPE(Spelling, Id, SingletonId)
+//
+// where:
+//
+// - Spelling is the HLSL type name (e.g. int8_t4_packed).
+//
+// - BuiltinType::Id is the enumerator defining the type.
+//
+// - Context.SingletonId is the global singleton of this type.
+//
+// To include this file, define HLSL_PACKED_TYPE.
+// The macro will be undefined after inclusion.
+//
+//===----------------------------------------------------------------------===//
+
+HLSL_PACKED_TYPE(int8_t4_packed, Int8_4Packed, Int8_4PackedTy)
+HLSL_PACKED_TYPE(uint8_t4_packed, UInt8_4Packed, UInt8_4PackedTy)
+
+#undef HLSL_PACKED_TYPE
diff --git a/clang/include/clang/Basic/Specifiers.h b/clang/include/clang/Basic/Specifiers.h
index c1b7198565f07..67742038bb6a8 100644
--- a/clang/include/clang/Basic/Specifiers.h
+++ b/clang/include/clang/Basic/Specifiers.h
@@ -102,6 +102,9 @@ namespace clang {
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
TST_##Name, // HLSL Intangible Types
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
+ TST_##Name, // HLSL Packed Types
+#include "clang/Basic/HLSLPackedTypes.def"
TST_error // erroneous type
};
diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def
index dc9c7d8109467..97e5915bcd0d5 100644
--- a/clang/include/clang/Basic/TokenKinds.def
+++ b/clang/include/clang/Basic/TokenKinds.def
@@ -552,6 +552,9 @@ KEYWORD(column_major , KEYHLSL)
// HLSL Intangible Types
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) KEYWORD(Name, KEYHLSL)
#include "clang/Basic/HLSLIntangibleTypes.def"
+// HLSL Packed Types
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) KEYWORD(Name, KEYHLSL)
+#include "clang/Basic/HLSLPackedTypes.def"
// Borland Extensions.
KEYWORD(__pascal , KEYALL)
diff --git a/clang/include/clang/Sema/DeclSpec.h b/clang/include/clang/Sema/DeclSpec.h
index e6dc6831d893f..66a6098a75ae9 100644
--- a/clang/include/clang/Sema/DeclSpec.h
+++ b/clang/include/clang/Sema/DeclSpec.h
@@ -298,6 +298,9 @@ class DeclSpec {
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
static const TST TST_##Name = clang::TST_##Name;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
+ static const TST TST_##Name = clang::TST_##Name;
+#include "clang/Basic/HLSLPackedTypes.def"
static const TST TST_error = clang::TST_error;
// type-qualifiers
diff --git a/clang/include/clang/Sema/Overload.h b/clang/include/clang/Sema/Overload.h
index 3abc0013d8f69..af3335f5b53ee 100644
--- a/clang/include/clang/Sema/Overload.h
+++ b/clang/include/clang/Sema/Overload.h
@@ -210,6 +210,9 @@ class Sema;
/// HLSL matrix splat from scalar or boolean type.
ICK_HLSL_Matrix_Splat,
+ /// HLSL packed type conversion to uint
+ ICK_HLSL_Packed_Type_Conversion,
+
/// The number of conversion kinds
ICK_Num_Conversion_Kinds,
};
diff --git a/clang/include/clang/Sema/SemaHLSL.h b/clang/include/clang/Sema/SemaHLSL.h
index 6c0e5b52f7cb3..6096f24b25069 100644
--- a/clang/include/clang/Sema/SemaHLSL.h
+++ b/clang/include/clang/Sema/SemaHLSL.h
@@ -239,6 +239,7 @@ class SemaHLSL : public SemaBase {
bool CanPerformScalarCast(QualType SrcTy, QualType DestTy);
bool CanPerformElementwiseCast(Expr *Src, QualType DestType);
bool CanPerformAggregateSplatCast(Expr *Src, QualType DestType);
+ bool CanPerformPackedToUintCast(Expr *SrcTy, QualType DestTy);
ExprResult ActOnOutParamExpr(ParmVarDecl *Param, Expr *Arg);
QualType getInoutParameterType(QualType Ty);
diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h
index 6a52a9e4fa780..5dd6f38d64f37 100644
--- a/clang/include/clang/Serialization/ASTBitCodes.h
+++ b/clang/include/clang/Serialization/ASTBitCodes.h
@@ -1154,6 +1154,9 @@ enum PredefinedTypeIDs {
// \brief HLSL intangible types with auto numeration
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) PREDEF_TYPE_##Id##_ID,
#include "clang/Basic/HLSLIntangibleTypes.def"
+// \brief HLSL packed types with auto numeration
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) PREDEF_TYPE_##Id##_ID,
+#include "clang/Basic/HLSLPackedTypes.def"
// \brief SPIR-V types with auto numeration
#define SPIRV_TYPE(Name, Id, SingletonId) PREDEF_TYPE_##Id##_ID,
#include "clang/Basic/SPIRVTypes.def"
@@ -1169,7 +1172,7 @@ enum PredefinedTypeIDs {
///
/// Type IDs for non-predefined types will start at
/// NUM_PREDEF_TYPE_IDs.
-const unsigned NUM_PREDEF_TYPE_IDS = 530;
+const unsigned NUM_PREDEF_TYPE_IDS = 532;
// Ensure we do not overrun the predefined types we reserved
// in the enum PredefinedTypeIDs above.
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index ef3e6e87ec1fe..6533c82c1c12f 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -1448,6 +1448,10 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target,
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
InitBuiltinType(SingletonId, BuiltinType::Id);
#include "clang/Basic/HLSLIntangibleTypes.def"
+
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
+ InitBuiltinType(SingletonId, BuiltinType::Id);
+#include "clang/Basic/HLSLPackedTypes.def"
}
if (Target.hasAArch64ACLETypes() ||
@@ -2452,6 +2456,11 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
Width = Target->getPointerWidth(LangAS::Default);
Align = Target->getPointerAlign(LangAS::Default);
break;
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/HLSLPackedTypes.def"
+ Width = 32;
+ Align = 32;
+ break;
#define SPIRV_TYPE(Name, Id, SingletonId) \
case BuiltinType::Id: \
Width = Target->getPointerWidth(LangAS::Default); \
@@ -3604,6 +3613,10 @@ static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx,
case BuiltinType::Id: \
return;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
+ case BuiltinType::Id: \
+ return;
+#include "clang/Basic/HLSLPackedTypes.def"
case BuiltinType::Dependent:
llvm_unreachable("should never get here");
#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
@@ -9274,6 +9287,8 @@ static char getObjCEncodingForPrimitiveType(const ASTContext *C,
#include "clang/Basic/PPCTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/HLSLPackedTypes.def"
#define BUILTIN_TYPE(KIND, ID)
#define PLACEHOLDER_TYPE(KIND, ID) \
case BuiltinType::KIND:
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index 22c3af47f451f..7871ff717fe99 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -1370,6 +1370,10 @@ ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
case BuiltinType::Id: \
return Importer.getToContext().SingletonId;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
+ case BuiltinType::Id: \
+ return Importer.getToContext().SingletonId;
+#include "clang/Basic/HLSLPackedTypes.def"
#define SPIRV_TYPE(Name, Id, SingletonId) \
case BuiltinType::Id: \
return Importer.getToContext().SingletonId;
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 9242491832841..2b6b087c7652c 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -16384,6 +16384,8 @@ GCCTypeClass EvaluateBuiltinClassifyType(QualType T,
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/HLSLPackedTypes.def"
#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/SPIRVTypes.def"
return GCCTypeClass::None;
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 780fe3a321200..e25a61dc1e69a 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -3564,6 +3564,11 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
mangleVendorType(#Name); \
break;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
+ case BuiltinType::Id: \
+ mangleVendorType(#Name); \
+ break;
+#include "clang/Basic/HLSLPackedTypes.def"
#define SPIRV_TYPE(Name, Id, SingletonId) \
case BuiltinType::Id: \
mangleVendorType(Name); \
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index cc7bf2279b72e..983306e422485 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -2833,6 +2833,12 @@ void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T, Qualifiers,
break;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
+ case BuiltinType::Id: \
+ mangleArtificialTagType(TagTypeKind::Struct, #Name); \
+ break;
+#include "clang/Basic/HLSLPackedTypes.def"
+
case BuiltinType::SveBool:
Out << "$_CA";
break;
diff --git a/clang/lib/AST/NSAPI.cpp b/clang/lib/AST/NSAPI.cpp
index 7142ded5a551d..54c0b03b14848 100644
--- a/clang/lib/AST/NSAPI.cpp
+++ b/clang/lib/AST/NSAPI.cpp
@@ -457,6 +457,8 @@ NSAPI::getNSNumberFactoryMethodKind(QualType T) const {
#include "clang/Basic/AMDGPUTypes.def"
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/HLSLPackedTypes.def"
#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/SPIRVTypes.def"
case BuiltinType::BoundMember:
diff --git a/clang/lib/AST/PrintfFormatString.cpp b/clang/lib/AST/PrintfFormatString.cpp
index e0cff04069d59..d09ed5e02dc02 100644
--- a/clang/lib/AST/PrintfFormatString.cpp
+++ b/clang/lib/AST/PrintfFormatString.cpp
@@ -957,6 +957,9 @@ bool PrintfSpecifier::fixType(QualType QT, const LangOptions &LangOpt,
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/HLSLPackedTypes.def"
+
#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
#include "clang/Basic/SPIRVTypes.def"
diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
index cbacca1c44d91..9059272056809 100644
--- a/clang/lib/AST/Type.cpp
+++ b/clang/lib/AST/Type.cpp
@@ -2507,6 +2507,8 @@ Type::ScalarTypeKind Type::getScalarTypeKind() const {
return STK_Floating;
if (BT->isFixedPointType())
return STK_FixedPoint;
+ if (BT->isHLSLBuiltinPackedType())
+ return STK_Integral;
llvm_unreachable("unknown scalar builtin type");
} else if (isa<PointerType>(T)) {
return STK_CPointer;
@@ -3708,6 +3710,10 @@ StringRef BuiltinType::getName(const PrintingPolicy &Policy) const {
case Id: \
return #Name;
#include "clang/Basic/HLSLIntangibleTypes.def"
+#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
+ case Id: \
+ return #Name;
+#include "clang/Basic/HLSLPackedTypes.def"
#define SPIRV_TYPE(Name, Id, SingletonId) ...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/224277
More information about the llvm-commits
mailing list