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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to