[clang] [llvm] Add __hlt intrinsic for Windows ARM. (PR #96578)

2024-07-08 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/96578
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] Add __hlt intrinsic for Windows ARM. (PR #96578)

2024-06-26 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/96578

>From 1b436900146e1a91efac95416077485571722517 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Mon, 24 Jun 2024 16:55:08 -0700
Subject: [PATCH 1/3] Add __hlt intrinsic for Windows ARM.

---
 clang/include/clang/Basic/BuiltinsAArch64.def   |  1 +
 clang/lib/CodeGen/CGBuiltin.cpp |  5 +
 clang/lib/Headers/intrin.h  |  3 +++
 clang/test/CodeGen/arm64-microsoft-intrinsics.c |  7 +++
 llvm/include/llvm/IR/IntrinsicsAArch64.td   |  3 +++
 llvm/lib/Target/AArch64/AArch64InstrInfo.td |  3 ++-
 llvm/test/CodeGen/AArch64/arm64-hlt.ll  | 10 ++
 7 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/AArch64/arm64-hlt.ll

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index 5f53c98167dfb..668c4296208de 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -291,6 +291,7 @@ TARGET_HEADER_BUILTIN(_CountOneBits, "UiUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
 TARGET_HEADER_BUILTIN(__prefetch, "vvC*", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__hlt, "iUi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
 
 #undef BUILTIN
 #undef LANGBUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 08a89bd123d03..c646614333499 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -11475,6 +11475,11 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Builder.CreateCall(F, {Address, RW, Locality, Data});
   }
 
+  if (BuiltinID == AArch64::BI__hlt) {
+Function *F = CGM.getIntrinsic(Intrinsic::aarch64_hlt);
+return Builder.CreateCall(F, {EmitScalarExpr(E->getArg(0))});
+  }
+
   // Handle MSVC intrinsics before argument evaluation to prevent double
   // evaluation.
   if (std::optional MsvcIntId =
diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h
index 1227f45d5432b..a8a3463a78494 100644
--- a/clang/lib/Headers/intrin.h
+++ b/clang/lib/Headers/intrin.h
@@ -397,7 +397,10 @@ unsigned int _CountLeadingSigns64(__int64);
 unsigned int _CountOneBits(unsigned long);
 unsigned int _CountOneBits64(unsigned __int64);
 
+int __hlt(unsigned int);
+
 void __cdecl __prefetch(const void *);
+
 #endif
 
 
/**\
diff --git a/clang/test/CodeGen/arm64-microsoft-intrinsics.c 
b/clang/test/CodeGen/arm64-microsoft-intrinsics.c
index a354ed948ca5f..5d17cc1ca6162 100644
--- a/clang/test/CodeGen/arm64-microsoft-intrinsics.c
+++ b/clang/test/CodeGen/arm64-microsoft-intrinsics.c
@@ -127,6 +127,13 @@ void check__break() {
 // CHECK-MSVC: call void @llvm.aarch64.break(i32 0)
 // CHECK-LINUX: error: call to undeclared function '__break'
 
+void check__hlt() {
+  __hlt(0);
+}
+
+// CHECK-MSVC: call void @llvm.aarch64.hlt(i32 0)
+// CHECK-LINUX: error: call to undeclared function '__hlt'
+
 unsigned __int64 check__getReg(void) {
   unsigned volatile __int64 reg;
   reg = __getReg(18);
diff --git a/llvm/include/llvm/IR/IntrinsicsAArch64.td 
b/llvm/include/llvm/IR/IntrinsicsAArch64.td
index 9a71aaa9f4434..d7c3189280de7 100644
--- a/llvm/include/llvm/IR/IntrinsicsAArch64.td
+++ b/llvm/include/llvm/IR/IntrinsicsAArch64.td
@@ -57,6 +57,7 @@ def int_aarch64_frint64x
 : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ], [ LLVMMatchType<0> ],
 [ IntrNoMem ]>;
 
+
 
//===--===//
 // HINT
 
@@ -65,6 +66,8 @@ def int_aarch64_hint : DefaultAttrsIntrinsic<[], 
[llvm_i32_ty]>;
 def int_aarch64_break : Intrinsic<[], [llvm_i32_ty],
 [IntrNoMem, IntrHasSideEffects, IntrNoReturn, IntrCold, 
ImmArg>]>;
 
+def int_aarch64_hlt : Intrinsic<[], [llvm_i32_ty],
+[IntrNoMem, IntrHasSideEffects, IntrNoReturn, IntrCold, 
ImmArg>]>;
 
 def int_aarch64_prefetch : Intrinsic<[],
 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td 
b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 91e5bc3caa102..f4434525afecc 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -3076,7 +3076,8 @@ def BRK   : ExceptionGeneration<0b001, 0b00, "brk",
 def DCPS1 : ExceptionGeneration<0b101, 0b01, "dcps1">;
 def DCPS2 : ExceptionGeneration<0b101, 0b10, "dcps2">;
 def DCPS3 : ExceptionGeneration<0b101, 0b11, "dcps3">, Requires<[HasEL3]>;
-def HLT   : ExceptionGeneration<0b010, 0b00, "hlt">;
+def HLT   : ExceptionGeneration<0b010, 0b00, "hlt",
+[(int_aarch64_hlt timm32_0_65535:$imm)]>;
 def HVC   : ExceptionGeneration<0b000, 0b10, "hvc">;
 def SMC   : ExceptionGen

[clang] [llvm] Add __hlt intrinsic for Windows ARM. (PR #96578)

2024-06-26 Thread Amy Huang via cfe-commits

https://github.com/amykhuang edited 
https://github.com/llvm/llvm-project/pull/96578
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] Add __hlt intrinsic for Windows ARM. (PR #96578)

2024-06-26 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/96578

>From 1b436900146e1a91efac95416077485571722517 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Mon, 24 Jun 2024 16:55:08 -0700
Subject: [PATCH 1/2] Add __hlt intrinsic for Windows ARM.

---
 clang/include/clang/Basic/BuiltinsAArch64.def   |  1 +
 clang/lib/CodeGen/CGBuiltin.cpp |  5 +
 clang/lib/Headers/intrin.h  |  3 +++
 clang/test/CodeGen/arm64-microsoft-intrinsics.c |  7 +++
 llvm/include/llvm/IR/IntrinsicsAArch64.td   |  3 +++
 llvm/lib/Target/AArch64/AArch64InstrInfo.td |  3 ++-
 llvm/test/CodeGen/AArch64/arm64-hlt.ll  | 10 ++
 7 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/AArch64/arm64-hlt.ll

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index 5f53c98167dfb..668c4296208de 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -291,6 +291,7 @@ TARGET_HEADER_BUILTIN(_CountOneBits, "UiUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
 TARGET_HEADER_BUILTIN(__prefetch, "vvC*", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__hlt, "iUi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
 
 #undef BUILTIN
 #undef LANGBUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 08a89bd123d03..c646614333499 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -11475,6 +11475,11 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Builder.CreateCall(F, {Address, RW, Locality, Data});
   }
 
+  if (BuiltinID == AArch64::BI__hlt) {
+Function *F = CGM.getIntrinsic(Intrinsic::aarch64_hlt);
+return Builder.CreateCall(F, {EmitScalarExpr(E->getArg(0))});
+  }
+
   // Handle MSVC intrinsics before argument evaluation to prevent double
   // evaluation.
   if (std::optional MsvcIntId =
diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h
index 1227f45d5432b..a8a3463a78494 100644
--- a/clang/lib/Headers/intrin.h
+++ b/clang/lib/Headers/intrin.h
@@ -397,7 +397,10 @@ unsigned int _CountLeadingSigns64(__int64);
 unsigned int _CountOneBits(unsigned long);
 unsigned int _CountOneBits64(unsigned __int64);
 
+int __hlt(unsigned int);
+
 void __cdecl __prefetch(const void *);
+
 #endif
 
 
/**\
diff --git a/clang/test/CodeGen/arm64-microsoft-intrinsics.c 
b/clang/test/CodeGen/arm64-microsoft-intrinsics.c
index a354ed948ca5f..5d17cc1ca6162 100644
--- a/clang/test/CodeGen/arm64-microsoft-intrinsics.c
+++ b/clang/test/CodeGen/arm64-microsoft-intrinsics.c
@@ -127,6 +127,13 @@ void check__break() {
 // CHECK-MSVC: call void @llvm.aarch64.break(i32 0)
 // CHECK-LINUX: error: call to undeclared function '__break'
 
+void check__hlt() {
+  __hlt(0);
+}
+
+// CHECK-MSVC: call void @llvm.aarch64.hlt(i32 0)
+// CHECK-LINUX: error: call to undeclared function '__hlt'
+
 unsigned __int64 check__getReg(void) {
   unsigned volatile __int64 reg;
   reg = __getReg(18);
diff --git a/llvm/include/llvm/IR/IntrinsicsAArch64.td 
b/llvm/include/llvm/IR/IntrinsicsAArch64.td
index 9a71aaa9f4434..d7c3189280de7 100644
--- a/llvm/include/llvm/IR/IntrinsicsAArch64.td
+++ b/llvm/include/llvm/IR/IntrinsicsAArch64.td
@@ -57,6 +57,7 @@ def int_aarch64_frint64x
 : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ], [ LLVMMatchType<0> ],
 [ IntrNoMem ]>;
 
+
 
//===--===//
 // HINT
 
@@ -65,6 +66,8 @@ def int_aarch64_hint : DefaultAttrsIntrinsic<[], 
[llvm_i32_ty]>;
 def int_aarch64_break : Intrinsic<[], [llvm_i32_ty],
 [IntrNoMem, IntrHasSideEffects, IntrNoReturn, IntrCold, 
ImmArg>]>;
 
+def int_aarch64_hlt : Intrinsic<[], [llvm_i32_ty],
+[IntrNoMem, IntrHasSideEffects, IntrNoReturn, IntrCold, 
ImmArg>]>;
 
 def int_aarch64_prefetch : Intrinsic<[],
 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td 
b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 91e5bc3caa102..f4434525afecc 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -3076,7 +3076,8 @@ def BRK   : ExceptionGeneration<0b001, 0b00, "brk",
 def DCPS1 : ExceptionGeneration<0b101, 0b01, "dcps1">;
 def DCPS2 : ExceptionGeneration<0b101, 0b10, "dcps2">;
 def DCPS3 : ExceptionGeneration<0b101, 0b11, "dcps3">, Requires<[HasEL3]>;
-def HLT   : ExceptionGeneration<0b010, 0b00, "hlt">;
+def HLT   : ExceptionGeneration<0b010, 0b00, "hlt",
+[(int_aarch64_hlt timm32_0_65535:$imm)]>;
 def HVC   : ExceptionGeneration<0b000, 0b10, "hvc">;
 def SMC   : ExceptionGen

[clang] [llvm] Add __hlt intrinsic for Windows ARM. (PR #96578)

2024-06-24 Thread Amy Huang via cfe-commits

https://github.com/amykhuang edited 
https://github.com/llvm/llvm-project/pull/96578
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] Add __hlt intrinsic for Windows ARM. (PR #96578)

2024-06-24 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/96578

None

>From 1b436900146e1a91efac95416077485571722517 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Mon, 24 Jun 2024 16:55:08 -0700
Subject: [PATCH] Add __hlt intrinsic for Windows ARM.

---
 clang/include/clang/Basic/BuiltinsAArch64.def   |  1 +
 clang/lib/CodeGen/CGBuiltin.cpp |  5 +
 clang/lib/Headers/intrin.h  |  3 +++
 clang/test/CodeGen/arm64-microsoft-intrinsics.c |  7 +++
 llvm/include/llvm/IR/IntrinsicsAArch64.td   |  3 +++
 llvm/lib/Target/AArch64/AArch64InstrInfo.td |  3 ++-
 llvm/test/CodeGen/AArch64/arm64-hlt.ll  | 10 ++
 7 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/AArch64/arm64-hlt.ll

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index 5f53c98167dfb..668c4296208de 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -291,6 +291,7 @@ TARGET_HEADER_BUILTIN(_CountOneBits, "UiUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
 TARGET_HEADER_BUILTIN(__prefetch, "vvC*", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__hlt, "iUi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
 
 #undef BUILTIN
 #undef LANGBUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 08a89bd123d03..c646614333499 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -11475,6 +11475,11 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Builder.CreateCall(F, {Address, RW, Locality, Data});
   }
 
+  if (BuiltinID == AArch64::BI__hlt) {
+Function *F = CGM.getIntrinsic(Intrinsic::aarch64_hlt);
+return Builder.CreateCall(F, {EmitScalarExpr(E->getArg(0))});
+  }
+
   // Handle MSVC intrinsics before argument evaluation to prevent double
   // evaluation.
   if (std::optional MsvcIntId =
diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h
index 1227f45d5432b..a8a3463a78494 100644
--- a/clang/lib/Headers/intrin.h
+++ b/clang/lib/Headers/intrin.h
@@ -397,7 +397,10 @@ unsigned int _CountLeadingSigns64(__int64);
 unsigned int _CountOneBits(unsigned long);
 unsigned int _CountOneBits64(unsigned __int64);
 
+int __hlt(unsigned int);
+
 void __cdecl __prefetch(const void *);
+
 #endif
 
 
/**\
diff --git a/clang/test/CodeGen/arm64-microsoft-intrinsics.c 
b/clang/test/CodeGen/arm64-microsoft-intrinsics.c
index a354ed948ca5f..5d17cc1ca6162 100644
--- a/clang/test/CodeGen/arm64-microsoft-intrinsics.c
+++ b/clang/test/CodeGen/arm64-microsoft-intrinsics.c
@@ -127,6 +127,13 @@ void check__break() {
 // CHECK-MSVC: call void @llvm.aarch64.break(i32 0)
 // CHECK-LINUX: error: call to undeclared function '__break'
 
+void check__hlt() {
+  __hlt(0);
+}
+
+// CHECK-MSVC: call void @llvm.aarch64.hlt(i32 0)
+// CHECK-LINUX: error: call to undeclared function '__hlt'
+
 unsigned __int64 check__getReg(void) {
   unsigned volatile __int64 reg;
   reg = __getReg(18);
diff --git a/llvm/include/llvm/IR/IntrinsicsAArch64.td 
b/llvm/include/llvm/IR/IntrinsicsAArch64.td
index 9a71aaa9f4434..d7c3189280de7 100644
--- a/llvm/include/llvm/IR/IntrinsicsAArch64.td
+++ b/llvm/include/llvm/IR/IntrinsicsAArch64.td
@@ -57,6 +57,7 @@ def int_aarch64_frint64x
 : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ], [ LLVMMatchType<0> ],
 [ IntrNoMem ]>;
 
+
 
//===--===//
 // HINT
 
@@ -65,6 +66,8 @@ def int_aarch64_hint : DefaultAttrsIntrinsic<[], 
[llvm_i32_ty]>;
 def int_aarch64_break : Intrinsic<[], [llvm_i32_ty],
 [IntrNoMem, IntrHasSideEffects, IntrNoReturn, IntrCold, 
ImmArg>]>;
 
+def int_aarch64_hlt : Intrinsic<[], [llvm_i32_ty],
+[IntrNoMem, IntrHasSideEffects, IntrNoReturn, IntrCold, 
ImmArg>]>;
 
 def int_aarch64_prefetch : Intrinsic<[],
 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td 
b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 91e5bc3caa102..f4434525afecc 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -3076,7 +3076,8 @@ def BRK   : ExceptionGeneration<0b001, 0b00, "brk",
 def DCPS1 : ExceptionGeneration<0b101, 0b01, "dcps1">;
 def DCPS2 : ExceptionGeneration<0b101, 0b10, "dcps2">;
 def DCPS3 : ExceptionGeneration<0b101, 0b11, "dcps3">, Requires<[HasEL3]>;
-def HLT   : ExceptionGeneration<0b010, 0b00, "hlt">;
+def HLT   : ExceptionGeneration<0b010, 0b00, "hlt",
+[(int_aarch64_hlt timm32_0_65535:$imm)]>;
 def HVC   : ExceptionGeneration<0b000, 0b10, "hvc">;
 def SMC   : ExceptionG

[clang] [Clang][Driver] Expose `-fno-eliminate-unused-debug-types` to clang-cl (PR #95259)

2024-06-17 Thread Amy Huang via cfe-commits

amykhuang wrote:

Yes, feel free to take over that part, thanks!

https://github.com/llvm/llvm-project/pull/95259
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][Driver] Expose `-fno-eliminate-unused-debug-types` to clang-cl (PR #95259)

2024-06-12 Thread Amy Huang via cfe-commits

https://github.com/amykhuang approved this pull request.

Looks reasonable to me. 

https://github.com/llvm/llvm-project/pull/95259
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Enable unguarded availability diagnostic on instantiated template functions (PR #91699)

2024-06-06 Thread Amy Huang via cfe-commits

amykhuang wrote:

nevermind, that example is working as intended

https://github.com/llvm/llvm-project/pull/91699
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Enable unguarded availability diagnostic on instantiated template functions (PR #91699)

2024-06-06 Thread Amy Huang via cfe-commits

amykhuang wrote:

here's a reduced example of what we ran into in Chrome. I guess the attribute 
is being applied to a function that's passed to `f()`, and the warning points 
to the call in the definition of `f`. 

```
#define a(b) __attribute__((__availability__(android, introduced = b)))
#define c(b) (a(b), apply_to = function)

template  void f(callback cb) {
  cb();
}

#pragma clang attribute push c(29)
void test() {
  f([](){});
}
#pragma clang attribute pop
```

https://github.com/llvm/llvm-project/pull/91699
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Fix signature for __prefetch (PR #93235)

2024-05-23 Thread Amy Huang via cfe-commits

https://github.com/amykhuang approved this pull request.

Thanks for the fix

https://github.com/llvm/llvm-project/pull/93235
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Allow passing creduce options through creduce-clang-crash.py (PR #92141)

2024-05-14 Thread Amy Huang via cfe-commits

https://github.com/amykhuang approved this pull request.

lgtm!

https://github.com/llvm/llvm-project/pull/92141
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][C++23] Implement P2448R2: Relaxing some constexpr restrictions (PR #77753)

2024-03-13 Thread Amy Huang via cfe-commits

amykhuang wrote:

I looked at this a bit and the change that increases the constexpr restrictions 
is that `ext_defaulted_comparison_constexpr_mismatch` (which was added in 
https://reviews.llvm.org/D146090) became 
`err_incorrect_defaulted_comparison_constexpr`?

https://github.com/llvm/llvm-project/pull/77753
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Reapply "[Clang][C++23] Implement P2448R2 ..." (#85136) (PR #85145)

2024-03-13 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/85145
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][C++23] Implement P2448R2: Relaxing some constexpr restrictions (PR #77753)

2024-03-13 Thread Amy Huang via cfe-commits

amykhuang wrote:

Whoops, not very familiar with git pull requests, I guess. actually reapplying 
the commit now

https://github.com/llvm/llvm-project/pull/77753
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Reapply "[Clang][C++23] Implement P2448R2 ..." (#85136) (PR #85145)

2024-03-13 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/85145

This reverts commit 003e292f9895a9cf4e30688269efa668d1fcbb09 because there were 
dependent changes in the codebase that now fail. 

>From d8f21288633aefd1528133ccdf46c5dc790e4f1f Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Wed, 13 Mar 2024 22:55:31 +
Subject: [PATCH] Reapply "[Clang][C++23] Implement P2448R2 ..." (#85136)

This reverts commit 003e292f9895a9cf4e30688269efa668d1fcbb09.
---
 clang/docs/ReleaseNotes.rst   |   2 +
 .../clang/Basic/DiagnosticSemaKinds.td|  26 +--
 clang/lib/AST/DeclCXX.cpp |  13 +-
 clang/lib/Sema/SemaDeclCXX.cpp|  93 +-
 clang/test/AST/Interp/cxx23.cpp   |  59 ++-
 .../class.compare.default/p3.cpp  |  40 ++---
 .../class.compare.default/p4.cpp  |  20 +--
 .../dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp   |   8 +-
 .../dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp  |  10 +-
 .../CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp |  18 +-
 .../CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp |   8 +-
 .../dcl.fct.def/dcl.fct.def.default/p2.cpp|   6 +-
 clang/test/CXX/drs/dr13xx.cpp |  22 +--
 clang/test/CXX/drs/dr14xx.cpp |   6 +-
 clang/test/CXX/drs/dr15xx.cpp |  21 ++-
 clang/test/CXX/drs/dr16xx.cpp |  20 +--
 clang/test/CXX/drs/dr6xx.cpp  |  24 +--
 clang/test/CXX/expr/expr.const/p5-26.cpp  |   4 +-
 clang/test/CXX/special/class.copy/p13-0x.cpp  |   2 +-
 .../SemaCXX/constant-expression-cxx11.cpp |  38 +++--
 .../SemaCXX/constant-expression-cxx14.cpp |  33 ++--
 .../SemaCXX/constant-expression-cxx2b.cpp |  24 +--
 .../test/SemaCXX/cxx23-invalid-constexpr.cpp  | 159 ++
 clang/test/SemaCXX/cxx2a-consteval.cpp|   2 +-
 .../SemaCXX/deduced-return-type-cxx14.cpp |   8 +-
 .../addrspace-constructors.clcpp  |   2 +-
 clang/www/cxx_status.html |   9 +-
 27 files changed, 408 insertions(+), 269 deletions(-)
 create mode 100644 clang/test/SemaCXX/cxx23-invalid-constexpr.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index e018d38355945f..5fe3fd066df235 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -102,6 +102,8 @@ C++23 Feature Support
   materialize temporary object which is a prvalue in discarded-value 
expression.
 - Implemented `P1774R8: Portable assumptions `_.
 
+- Implemented `P2448R2: Relaxing some constexpr restrictions 
`_.
+
 C++2c Feature Support
 ^
 
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 605fbc52701df0..d7ab1635cf12bc 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -9617,13 +9617,10 @@ def err_defaulted_copy_assign_not_ref : Error<
   "the parameter for an explicitly-defaulted copy assignment operator must be 
an "
   "lvalue reference type">;
 def err_incorrect_defaulted_constexpr : Error<
-  "defaulted definition of %sub{select_special_member_kind}0 "
-  "is not constexpr">;
+  "defaulted definition of %sub{select_special_member_kind}0 cannot be marked 
%select{constexpr|consteval}1 "
+  "before C++23">;
 def err_incorrect_defaulted_constexpr_with_vb: Error<
   "%sub{select_special_member_kind}0 cannot be 'constexpr' in a class with 
virtual base class">;
-def err_incorrect_defaulted_consteval : Error<
-  "defaulted declaration of %sub{select_special_member_kind}0 "
-  "cannot be consteval because implicit definition is not constexpr">;
 def warn_defaulted_method_deleted : Warning<
   "explicitly defaulted %sub{select_special_member_kind}0 is implicitly "
   "deleted">, InGroup;
@@ -9734,21 +9731,12 @@ def 
note_defaulted_comparison_cannot_deduce_undeduced_auto : Note<
   "%select{|member|base class}0 %1 declared here">;
 def note_defaulted_comparison_cannot_deduce_callee : Note<
   "selected 'operator<=>' for %select{|member|base class}0 %1 declared here">;
-def ext_defaulted_comparison_constexpr_mismatch : Extension<
+def err_defaulted_comparison_constexpr_mismatch : Error<
   "defaulted definition of %select{%sub{select_defaulted_comparison_kind}1|"
-  "three-way comparison operator}0 that is "
-  "declared %select{constexpr|consteval}2 but"
-  "%select{|for which the corresponding implicit 'operator==' }0 "
-  "invokes a non-constexpr comparison function is a C++23 extension">,
-  InGroup>;
-def warn_cxx23_compat_defaulted_comparison_constexpr_mismatch : Warning<
-  "defaulted definition of %select{%sub{select_defaulted_comparison_kind}1|"
-  "three-way comparison operator}0 that is "
-  "declared %select{constexpr|consteval}2 but"
-  "%select{|for which the corresponding implicit 'operator==' }0 "
-  "invokes a non-constexpr comparison function is inc

[clang] Unrevert "[Clang][C++23] Implement P2448R2: Relaxing some constexpr re… (PR #85140)

2024-03-13 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/85140
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][C++23] Implement P2448R2: Relaxing some constexpr restrictions (PR #77753)

2024-03-13 Thread Amy Huang via cfe-commits

amykhuang wrote:

Nevermind, unreverted since there appear to be newer tests that use this patch. 

https://github.com/llvm/llvm-project/pull/77753
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Unrevert "[Clang][C++23] Implement P2448R2: Relaxing some constexpr re… (PR #85140)

2024-03-13 Thread Amy Huang via cfe-commits

https://github.com/amykhuang edited 
https://github.com/llvm/llvm-project/pull/85140
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Revert "[Clang][C++23] Implement P2448R2 ..." (PR #85136)

2024-03-13 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/85136
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][C++23] Implement P2448R2: Relaxing some constexpr restrictions (PR #77753)

2024-03-13 Thread Amy Huang via cfe-commits

amykhuang wrote:

I'm assuming this behavior is unintended? Sorry for the late revert

https://github.com/llvm/llvm-project/pull/77753
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Revert "[Clang][C++23] Implement P2448R2 ..." (PR #85136)

2024-03-13 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/85136

Revert "[Clang][C++23] Implement P2448R2: Relaxing some constexpr restrictions 
(#77753)"

This reverts commit 99500e8c08a4d941acb8a7eb00523296fb2acf7a because it causes 
a behavior change for std=c++20. See
https://github.com/llvm/llvm-project/pull/77753.

>From 2f67dfb012038678dd0b873394a55bd5c937f843 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Wed, 13 Mar 2024 21:40:12 +
Subject: [PATCH] Revert "[Clang][C++23] Implement P2448R2: Relaxing some
 constexpr restrictions (#77753)"

This reverts commit 99500e8c08a4d941acb8a7eb00523296fb2acf7a because it
causes a behavior change for std=c++20. See
https://github.com/llvm/llvm-project/pull/77753.
---
 clang/docs/ReleaseNotes.rst   |   2 -
 .../clang/Basic/DiagnosticSemaKinds.td|  26 ++-
 clang/lib/AST/DeclCXX.cpp |  13 +-
 clang/lib/Sema/SemaDeclCXX.cpp|  93 +-
 clang/test/AST/Interp/cxx23.cpp   |  59 +--
 .../class.compare.default/p3.cpp  |  40 +++--
 .../class.compare.default/p4.cpp  |  20 +--
 .../dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp   |   8 +-
 .../dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp  |  10 +-
 .../CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp |  18 +-
 .../CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp |   8 +-
 .../dcl.fct.def/dcl.fct.def.default/p2.cpp|   6 +-
 clang/test/CXX/drs/dr13xx.cpp |  22 +--
 clang/test/CXX/drs/dr14xx.cpp |   6 +-
 clang/test/CXX/drs/dr15xx.cpp |  21 +--
 clang/test/CXX/drs/dr16xx.cpp |  20 +--
 clang/test/CXX/drs/dr6xx.cpp  |  24 +--
 clang/test/CXX/expr/expr.const/p5-26.cpp  |   4 +-
 clang/test/CXX/special/class.copy/p13-0x.cpp  |   2 +-
 .../SemaCXX/constant-expression-cxx11.cpp |  38 ++---
 .../SemaCXX/constant-expression-cxx14.cpp |  33 ++--
 .../SemaCXX/constant-expression-cxx2b.cpp |  24 +--
 .../test/SemaCXX/cxx23-invalid-constexpr.cpp  | 159 --
 clang/test/SemaCXX/cxx2a-consteval.cpp|   2 +-
 .../SemaCXX/deduced-return-type-cxx14.cpp |   8 +-
 .../addrspace-constructors.clcpp  |   2 +-
 clang/www/cxx_status.html |   9 +-
 27 files changed, 269 insertions(+), 408 deletions(-)
 delete mode 100644 clang/test/SemaCXX/cxx23-invalid-constexpr.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 5fe3fd066df235..e018d38355945f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -102,8 +102,6 @@ C++23 Feature Support
   materialize temporary object which is a prvalue in discarded-value 
expression.
 - Implemented `P1774R8: Portable assumptions `_.
 
-- Implemented `P2448R2: Relaxing some constexpr restrictions 
`_.
-
 C++2c Feature Support
 ^
 
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index d7ab1635cf12bc..605fbc52701df0 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -9617,10 +9617,13 @@ def err_defaulted_copy_assign_not_ref : Error<
   "the parameter for an explicitly-defaulted copy assignment operator must be 
an "
   "lvalue reference type">;
 def err_incorrect_defaulted_constexpr : Error<
-  "defaulted definition of %sub{select_special_member_kind}0 cannot be marked 
%select{constexpr|consteval}1 "
-  "before C++23">;
+  "defaulted definition of %sub{select_special_member_kind}0 "
+  "is not constexpr">;
 def err_incorrect_defaulted_constexpr_with_vb: Error<
   "%sub{select_special_member_kind}0 cannot be 'constexpr' in a class with 
virtual base class">;
+def err_incorrect_defaulted_consteval : Error<
+  "defaulted declaration of %sub{select_special_member_kind}0 "
+  "cannot be consteval because implicit definition is not constexpr">;
 def warn_defaulted_method_deleted : Warning<
   "explicitly defaulted %sub{select_special_member_kind}0 is implicitly "
   "deleted">, InGroup;
@@ -9731,12 +9734,21 @@ def 
note_defaulted_comparison_cannot_deduce_undeduced_auto : Note<
   "%select{|member|base class}0 %1 declared here">;
 def note_defaulted_comparison_cannot_deduce_callee : Note<
   "selected 'operator<=>' for %select{|member|base class}0 %1 declared here">;
-def err_defaulted_comparison_constexpr_mismatch : Error<
+def ext_defaulted_comparison_constexpr_mismatch : Extension<
   "defaulted definition of %select{%sub{select_defaulted_comparison_kind}1|"
-  "three-way comparison operator}0 cannot be "
-  "declared %select{constexpr|consteval}2 because "
-  "%select{it|for which the corresponding implicit 'operator==' }0 "
-  "invokes a non-constexpr comparison function ">;
+  "three-way comparison operator}0 that is "
+  "declared %select{constexpr|consteval}2 but"
+  "%select{|for which the correspo

[clang] [Clang][C++23] Implement P2448R2: Relaxing some constexpr restrictions (PR #77753)

2024-03-13 Thread Amy Huang via cfe-commits

amykhuang wrote:

Hi, this is causing failures for Chrome, building with c++20:

```
$ cat t.cc
template  class StrongAlias {
  friend constexpr bool operator==(const StrongAlias &, const StrongAlias &) = 
default;
  Type value;
};

class Token {};
bool operator==(const Token&, const Token&);

StrongAlias a;

$ clang -std=c++20 t.cc
t.cc:2:3: error: defaulted definition of equality comparison operator cannot be 
declared constexpr because it invokes a non-constexpr comparison function 
2 |   friend constexpr bool operator==(const StrongAlias &, const 
StrongAlias &) = default;
  |   ^
t.cc:9:20: note: in instantiation of template class 'StrongAlias' 
requested here
9 | StrongAlias a;
  |^
t.cc:3:8: note: non-constexpr comparison function would be used to compare 
member 'value'
3 |   Type value;
  |^
t.cc:7:6: note: non-constexpr comparison function declared here
7 | bool operator==(const Token&, const Token&);
  |  ^
1 error generated.
```

https://github.com/llvm/llvm-project/pull/77753
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to msvc::no_unique_address causing assert when used with __declspec(empty_bases) (PR #74776)

2023-12-11 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/74776
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to msvc::no_unique_address causing assert when used with __declspec(empty_bases) (PR #74776)

2023-12-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/74776

no_unique_address makes it possible for a class to be empty and have non-zero 
virtual size, so just remove this assert.

Bug: https://github.com/llvm/llvm-project/issues/74442

>From c3dedfd535f037fb54a8e04640f9332e655a9a7d Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Thu, 7 Dec 2023 14:08:24 -0800
Subject: [PATCH] Fix to msvc::no_unique_address not interacting well with
 __declspec(empty_bases)

---
 clang/lib/AST/RecordLayoutBuilder.cpp |  4 +-
 .../Layout/ms-x86-declspec-empty_bases.cpp| 60 +++
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index f1f2275da44dc..73b248ffe5899 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2936,8 +2936,8 @@ void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase(
   }
 
   if (!FoundBase) {
-if (MDCUsesEBO && BaseDecl->isEmpty()) {
-  assert(BaseLayout.getNonVirtualSize() == CharUnits::Zero());
+if (MDCUsesEBO && BaseDecl->isEmpty() &&
+(BaseLayout.getNonVirtualSize() == CharUnits::Zero())) {
   BaseOffset = CharUnits::Zero();
 } else {
   // Otherwise, lay the base out at the end of the MDC.
diff --git a/clang/test/Layout/ms-x86-declspec-empty_bases.cpp 
b/clang/test/Layout/ms-x86-declspec-empty_bases.cpp
index cc13a980cb5db..4738ce5720f75 100644
--- a/clang/test/Layout/ms-x86-declspec-empty_bases.cpp
+++ b/clang/test/Layout/ms-x86-declspec-empty_bases.cpp
@@ -264,3 +264,63 @@ int _ = sizeof(G);
 // CHECK-NEXT:| [sizeof=12, align=4,
 // CHECK-NEXT:|  nvsize=12, nvalign=4]
 }
+
+namespace test5 {
+
+struct A {
+  int a;
+};
+struct B {
+  int b;
+};
+struct C {};
+struct __declspec(align(16)) D {};
+struct E {
+  [[msvc::no_unique_address]] C c;
+};
+struct __declspec(empty_bases) X : A, D, B, C, E {
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:  0 | struct test5::A
+// CHECK-NEXT:  0 |   int a
+// CHECK-NEXT:| [sizeof=4, align=4,
+// CHECK-NEXT:|  nvsize=4, nvalign=4]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:  0 | struct test5::D (empty)
+// CHECK-NEXT:| [sizeof=16, align=16,
+// CHECK-NEXT:|  nvsize=0, nvalign=16]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:  0 | struct test5::B
+// CHECK-NEXT:  0 |   int b
+// CHECK-NEXT:| [sizeof=4, align=4,
+// CHECK-NEXT:|  nvsize=4, nvalign=4]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:  0 | struct test5::C (empty)
+// CHECK-NEXT:| [sizeof=1, align=1,
+// CHECK-NEXT:|  nvsize=0, nvalign=1]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:  0 | struct test5::E (empty)
+// CHECK-NEXT:  0 |   struct test5::C c (empty)
+// CHECK-NEXT:| [sizeof=1, align=1,
+// CHECK-NEXT:|  nvsize=1, nvalign=1]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:  0 | struct test5::X
+// CHECK-NEXT:  0 |   struct test5::A (base)
+// CHECK-NEXT:  0 | int a
+// CHECK-NEXT:  0 |   struct test5::D (base) (empty)
+// CHECK-NEXT:  0 |   struct test5::C (base) (empty)
+// CHECK-NEXT:  4 |   struct test5::B (base)
+// CHECK-NEXT:  4 | int b
+// CHECK-NEXT:  8 |   struct test5::E (base) (empty)
+// CHECK-NEXT:  8 | struct test5::C c (empty)
+// CHECK-NEXT:| [sizeof=16, align=16,
+// CHECK-NEXT:|  nvsize=16, nvalign=16]
+
+int _ = sizeof(X);
+}

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-20 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/70877
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-16 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/70877

>From e24ee9cbc51d0f372c30512ce5722b2bc32e20d0 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Tue, 31 Oct 2023 16:45:17 -0700
Subject: [PATCH 1/2] Fix attribute plugins

---
 clang/lib/Sema/ParsedAttr.cpp | 15 ---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp
index f59b01efe7ed8f4..ad95a61d7587264 100644
--- a/clang/lib/Sema/ParsedAttr.cpp
+++ b/clang/lib/Sema/ParsedAttr.cpp
@@ -193,11 +193,20 @@ bool ParsedAttr::isTypeAttr() const { return 
getInfo().IsType; }
 bool ParsedAttr::isStmtAttr() const { return getInfo().IsStmt; }
 
 bool ParsedAttr::existsInTarget(const TargetInfo &Target) const {
-  return getInfo().existsInTarget(Target) &&
- getInfo().spellingExistsInTarget(Target,
-  getAttributeSpellingListIndex());
+  Kind K = getParsedKind();
+
+  // If the attribute has a target-specific spelling, check that it exists.
+  // Only call this if the attr is not ignored/unknown. For most targets, this
+  // function just returns true.
+  bool HasSpelling = K != IgnoredAttribute && K != UnknownAttribute &&
+ K != NoSemaHandlerAttribute;
+  bool TargetSpecificSpellingExists = !HasSpelling ||
+getInfo().spellingExistsInTarget(Target, getAttributeSpellingListIndex());
+
+  return getInfo().existsInTarget(Target) && TargetSpecificSpellingExists;
 }
 
+
 bool ParsedAttr::isKnownToGCC() const { return getInfo().IsKnownToGCC; }
 
 bool ParsedAttr::isSupportedByPragmaAttribute() const {

>From c75681d0817bed88773635eb6b91eb483db29a50 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Tue, 7 Nov 2023 14:51:06 -0800
Subject: [PATCH 2/2] clang-format

---
 clang/lib/Sema/ParsedAttr.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp
index ad95a61d7587264..06c213267c7ef5d 100644
--- a/clang/lib/Sema/ParsedAttr.cpp
+++ b/clang/lib/Sema/ParsedAttr.cpp
@@ -200,13 +200,13 @@ bool ParsedAttr::existsInTarget(const TargetInfo &Target) 
const {
   // function just returns true.
   bool HasSpelling = K != IgnoredAttribute && K != UnknownAttribute &&
  K != NoSemaHandlerAttribute;
-  bool TargetSpecificSpellingExists = !HasSpelling ||
-getInfo().spellingExistsInTarget(Target, getAttributeSpellingListIndex());
+  bool TargetSpecificSpellingExists =
+  !HasSpelling ||
+  getInfo().spellingExistsInTarget(Target, 
getAttributeSpellingListIndex());
 
   return getInfo().existsInTarget(Target) && TargetSpecificSpellingExists;
 }
 
-
 bool ParsedAttr::isKnownToGCC() const { return getInfo().IsKnownToGCC; }
 
 bool ParsedAttr::isSupportedByPragmaAttribute() const {

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-16 Thread Amy Huang via cfe-commits

amykhuang wrote:

Whoops, sorry about that, I guess I am failing to update my fork properly... 

https://github.com/llvm/llvm-project/pull/70877
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-15 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/70877

>From 8216d6bc5329d4fcb723db14e2c503cb718cb36d Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Tue, 31 Oct 2023 16:45:17 -0700
Subject: [PATCH 1/2] Fix attribute plugins

---
 clang/lib/Sema/ParsedAttr.cpp | 15 ---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp
index f59b01efe7ed8f4..ad95a61d7587264 100644
--- a/clang/lib/Sema/ParsedAttr.cpp
+++ b/clang/lib/Sema/ParsedAttr.cpp
@@ -193,11 +193,20 @@ bool ParsedAttr::isTypeAttr() const { return 
getInfo().IsType; }
 bool ParsedAttr::isStmtAttr() const { return getInfo().IsStmt; }
 
 bool ParsedAttr::existsInTarget(const TargetInfo &Target) const {
-  return getInfo().existsInTarget(Target) &&
- getInfo().spellingExistsInTarget(Target,
-  getAttributeSpellingListIndex());
+  Kind K = getParsedKind();
+
+  // If the attribute has a target-specific spelling, check that it exists.
+  // Only call this if the attr is not ignored/unknown. For most targets, this
+  // function just returns true.
+  bool HasSpelling = K != IgnoredAttribute && K != UnknownAttribute &&
+ K != NoSemaHandlerAttribute;
+  bool TargetSpecificSpellingExists = !HasSpelling ||
+getInfo().spellingExistsInTarget(Target, getAttributeSpellingListIndex());
+
+  return getInfo().existsInTarget(Target) && TargetSpecificSpellingExists;
 }
 
+
 bool ParsedAttr::isKnownToGCC() const { return getInfo().IsKnownToGCC; }
 
 bool ParsedAttr::isSupportedByPragmaAttribute() const {

>From 2ed7200e8853fb5c2b51f57129d20b359bb54173 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Tue, 7 Nov 2023 14:51:06 -0800
Subject: [PATCH 2/2] clang-format

---
 clang/lib/Sema/ParsedAttr.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp
index ad95a61d7587264..06c213267c7ef5d 100644
--- a/clang/lib/Sema/ParsedAttr.cpp
+++ b/clang/lib/Sema/ParsedAttr.cpp
@@ -200,13 +200,13 @@ bool ParsedAttr::existsInTarget(const TargetInfo &Target) 
const {
   // function just returns true.
   bool HasSpelling = K != IgnoredAttribute && K != UnknownAttribute &&
  K != NoSemaHandlerAttribute;
-  bool TargetSpecificSpellingExists = !HasSpelling ||
-getInfo().spellingExistsInTarget(Target, getAttributeSpellingListIndex());
+  bool TargetSpecificSpellingExists =
+  !HasSpelling ||
+  getInfo().spellingExistsInTarget(Target, 
getAttributeSpellingListIndex());
 
   return getInfo().existsInTarget(Target) && TargetSpecificSpellingExists;
 }
 
-
 bool ParsedAttr::isKnownToGCC() const { return getInfo().IsKnownToGCC; }
 
 bool ParsedAttr::isSupportedByPragmaAttribute() const {

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-15 Thread Amy Huang via cfe-commits

amykhuang wrote:

ping for review?

https://github.com/llvm/llvm-project/pull/70877
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/70877

>From 18369263a3160963b943cd8574edaa212b6d0996 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Tue, 31 Oct 2023 16:45:17 -0700
Subject: [PATCH 1/2] Fix attribute plugins

---
 clang/lib/Sema/ParsedAttr.cpp | 15 ---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp
index f59b01efe7ed8f4..ad95a61d7587264 100644
--- a/clang/lib/Sema/ParsedAttr.cpp
+++ b/clang/lib/Sema/ParsedAttr.cpp
@@ -193,11 +193,20 @@ bool ParsedAttr::isTypeAttr() const { return 
getInfo().IsType; }
 bool ParsedAttr::isStmtAttr() const { return getInfo().IsStmt; }
 
 bool ParsedAttr::existsInTarget(const TargetInfo &Target) const {
-  return getInfo().existsInTarget(Target) &&
- getInfo().spellingExistsInTarget(Target,
-  getAttributeSpellingListIndex());
+  Kind K = getParsedKind();
+
+  // If the attribute has a target-specific spelling, check that it exists.
+  // Only call this if the attr is not ignored/unknown. For most targets, this
+  // function just returns true.
+  bool HasSpelling = K != IgnoredAttribute && K != UnknownAttribute &&
+ K != NoSemaHandlerAttribute;
+  bool TargetSpecificSpellingExists = !HasSpelling ||
+getInfo().spellingExistsInTarget(Target, getAttributeSpellingListIndex());
+
+  return getInfo().existsInTarget(Target) && TargetSpecificSpellingExists;
 }
 
+
 bool ParsedAttr::isKnownToGCC() const { return getInfo().IsKnownToGCC; }
 
 bool ParsedAttr::isSupportedByPragmaAttribute() const {

>From f068257dac770959b130bc8b33eb4689e5dd47db Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Tue, 7 Nov 2023 14:51:06 -0800
Subject: [PATCH 2/2] clang-format

---
 clang/lib/Sema/ParsedAttr.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp
index ad95a61d7587264..06c213267c7ef5d 100644
--- a/clang/lib/Sema/ParsedAttr.cpp
+++ b/clang/lib/Sema/ParsedAttr.cpp
@@ -200,13 +200,13 @@ bool ParsedAttr::existsInTarget(const TargetInfo &Target) 
const {
   // function just returns true.
   bool HasSpelling = K != IgnoredAttribute && K != UnknownAttribute &&
  K != NoSemaHandlerAttribute;
-  bool TargetSpecificSpellingExists = !HasSpelling ||
-getInfo().spellingExistsInTarget(Target, getAttributeSpellingListIndex());
+  bool TargetSpecificSpellingExists =
+  !HasSpelling ||
+  getInfo().spellingExistsInTarget(Target, 
getAttributeSpellingListIndex());
 
   return getInfo().existsInTarget(Target) && TargetSpecificSpellingExists;
 }
 
-
 bool ParsedAttr::isKnownToGCC() const { return getInfo().IsKnownToGCC; }
 
 bool ParsedAttr::isSupportedByPragmaAttribute() const {

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-07 Thread Amy Huang via cfe-commits

amykhuang wrote:

Updated the PR description and the patch. The existing 
`clang/test/Frontend/plugin-attribute.cpp` seems sufficient for test coverage. 
(I guess it wasn't being tested on bots though, otherwise we would have seen 
it?)

https://github.com/llvm/llvm-project/pull/70877
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/70877

>From 18369263a3160963b943cd8574edaa212b6d0996 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Tue, 31 Oct 2023 16:45:17 -0700
Subject: [PATCH] Fix attribute plugins

---
 clang/lib/Sema/ParsedAttr.cpp | 15 ---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp
index f59b01efe7ed8f4..ad95a61d7587264 100644
--- a/clang/lib/Sema/ParsedAttr.cpp
+++ b/clang/lib/Sema/ParsedAttr.cpp
@@ -193,11 +193,20 @@ bool ParsedAttr::isTypeAttr() const { return 
getInfo().IsType; }
 bool ParsedAttr::isStmtAttr() const { return getInfo().IsStmt; }
 
 bool ParsedAttr::existsInTarget(const TargetInfo &Target) const {
-  return getInfo().existsInTarget(Target) &&
- getInfo().spellingExistsInTarget(Target,
-  getAttributeSpellingListIndex());
+  Kind K = getParsedKind();
+
+  // If the attribute has a target-specific spelling, check that it exists.
+  // Only call this if the attr is not ignored/unknown. For most targets, this
+  // function just returns true.
+  bool HasSpelling = K != IgnoredAttribute && K != UnknownAttribute &&
+ K != NoSemaHandlerAttribute;
+  bool TargetSpecificSpellingExists = !HasSpelling ||
+getInfo().spellingExistsInTarget(Target, getAttributeSpellingListIndex());
+
+  return getInfo().existsInTarget(Target) && TargetSpecificSpellingExists;
 }
 
+
 bool ParsedAttr::isKnownToGCC() const { return getInfo().IsKnownToGCC; }
 
 bool ParsedAttr::isSupportedByPragmaAttribute() const {

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang edited 
https://github.com/llvm/llvm-project/pull/70877
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-11-07 Thread Amy Huang via cfe-commits

amykhuang wrote:

Huh, apparently my no-unique-address patch did break existing plugin tests 
(e.g. clang/test/Frontend/plugin-attribute.cpp), and this patch doesn't fix it

https://github.com/llvm/llvm-project/pull/70877
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix to attribute plugins reaching an unreachable (PR #70877)

2023-10-31 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/70877

[0faee97](https://github.com/llvm/llvm-project/commit/0faee97a924adec76d5c7cd680c289ced51e6b5a)
 made the attribute plugin code hit an unreachable.

Bug: [70702](https://github.com/llvm/llvm-project/issues/70702)

>From bb896fbc4b7303bc0ef524bbff91e95610cb11ce Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Tue, 31 Oct 2023 16:45:17 -0700
Subject: [PATCH] Fix attribute plugins

---
 clang/lib/Sema/ParsedAttr.cpp | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Sema/ParsedAttr.cpp b/clang/lib/Sema/ParsedAttr.cpp
index f59b01efe7ed8f4..2d6d17e74f6e38d 100644
--- a/clang/lib/Sema/ParsedAttr.cpp
+++ b/clang/lib/Sema/ParsedAttr.cpp
@@ -193,9 +193,13 @@ bool ParsedAttr::isTypeAttr() const { return 
getInfo().IsType; }
 bool ParsedAttr::isStmtAttr() const { return getInfo().IsStmt; }
 
 bool ParsedAttr::existsInTarget(const TargetInfo &Target) const {
+  Kind K = getParsedKind();
+  bool HasSpelling = K != IgnoredAttribute && K != UnknownAttribute &&
+ K != NoSemaHandlerAttribute;
   return getInfo().existsInTarget(Target) &&
- getInfo().spellingExistsInTarget(Target,
-  getAttributeSpellingListIndex());
+ (HasSpelling &&
+  getInfo().spellingExistsInTarget(Target,
+  getAttributeSpellingListIndex()));
 }
 
 bool ParsedAttr::isKnownToGCC() const { return getInfo().IsKnownToGCC; }

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add __prefetch intrinsic (PR #67174)

2023-10-13 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/67174
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-28 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/67199
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-28 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/67199

>From b1f0feeaed93edfdd692858e9d63ab6bbb94c0a5 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 22 Sep 2023 14:40:14 -0700
Subject: [PATCH 1/4] Recommit "Implement [[msvc::no_unique_address]] (#65675)"

Change the attribute docs so that there is a separate one for the MSVC
attribute.

This reverts commit 71f9e7695b87298f9855d8890f0e6a3b89381eb5.
---
 clang/include/clang/Basic/Attr.td |  19 +-
 clang/include/clang/Basic/AttrDocs.td |   9 +
 clang/lib/AST/Decl.cpp|  11 +-
 clang/lib/AST/RecordLayoutBuilder.cpp |  53 ++-
 clang/lib/Parse/ParseDeclCXX.cpp  |   3 +-
 clang/lib/Sema/SemaDeclAttr.cpp   |  10 +
 clang/test/Layout/ms-no-unique-address.cpp| 381 ++
 clang/test/Preprocessor/has_attribute.cpp |   5 +-
 .../SemaCXX/cxx2a-ms-no-unique-address.cpp|  19 +
 9 files changed, 494 insertions(+), 16 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp
 create mode 100644 clang/test/SemaCXX/cxx2a-ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index 21a3b5226623cf2..3da91d25ec97347 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,24 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  // No spellings because instances of this attribute are created by
+  // MSNoUniqueAddress and ItaniumNoUniqueAddress
+  let Spellings = [];
+  let Documentation = [InternalOnly];
+}
+
+def MSNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  let Spellings = [CXX11<"msvc", "no_unique_address", 201803>];
+  let Documentation = [MSNoUniqueAddressDocs];
+}
+
+def ItaniumNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  let Spellings = [CXX11<"", "no_unique_address", 201803>];
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index b13baa46754cfd4..d16ce23c067982d 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1408,6 +1408,15 @@ in C++11 onwards.
   }];
 }
 
+def MSNoUniqueAddressDocs : Documentation {
+  let Category = DocCatField;
+  let Content = [{
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability with MSVC.
+  }];
+}
+
 def ObjCRequiresSuperDocs : Documentation {
   let Category = DocCatFunction;
   let Content = [{
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 08ae2087cfe70eb..07aee0d87c835a8 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4507,9 +4507,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
 
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
-  // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
-  // ABI will do.
-  return true;
+  if (!Ctx.getTargetInfo().getCXXABI().isMicrosoft())
+return true;
+
+  // MS ABI: has nonzero size if it is a class type with class type fields,
+  // whether or not they have nonzero size
+  return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  });
 }
 
 bool FieldDecl::isPotentiallyOverlapping() const {
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..f1f2275da44dcad 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2595,6 +2598,8 @@ struct MicrosoftRecordLayoutBuilder {
   llvm::SmallPtrSetImpl &HasVtorDispSet,
   const CXXRecordDecl *RD) const;
   const ASTContext &Context;
+  EmptySubobjectMap *EmptySubobjects;
+
   /// The size of the rec

[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-27 Thread Amy Huang via cfe-commits

https://github.com/amykhuang edited 
https://github.com/llvm/llvm-project/pull/67199
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-27 Thread Amy Huang via cfe-commits

amykhuang wrote:

Added a section for target specific spellings in 
`GenerateHasAttrSpellingStringSwitch`, and a check for "existsInTarget" in 
`ParseCXX11AttributeArgs`, and looks like all tests are passing now.

https://github.com/llvm/llvm-project/pull/67199
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-27 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/67199

>From b1f0feeaed93edfdd692858e9d63ab6bbb94c0a5 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 22 Sep 2023 14:40:14 -0700
Subject: [PATCH 1/3] Recommit "Implement [[msvc::no_unique_address]] (#65675)"

Change the attribute docs so that there is a separate one for the MSVC
attribute.

This reverts commit 71f9e7695b87298f9855d8890f0e6a3b89381eb5.
---
 clang/include/clang/Basic/Attr.td |  19 +-
 clang/include/clang/Basic/AttrDocs.td |   9 +
 clang/lib/AST/Decl.cpp|  11 +-
 clang/lib/AST/RecordLayoutBuilder.cpp |  53 ++-
 clang/lib/Parse/ParseDeclCXX.cpp  |   3 +-
 clang/lib/Sema/SemaDeclAttr.cpp   |  10 +
 clang/test/Layout/ms-no-unique-address.cpp| 381 ++
 clang/test/Preprocessor/has_attribute.cpp |   5 +-
 .../SemaCXX/cxx2a-ms-no-unique-address.cpp|  19 +
 9 files changed, 494 insertions(+), 16 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp
 create mode 100644 clang/test/SemaCXX/cxx2a-ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index 21a3b5226623cf2..3da91d25ec97347 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,24 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  // No spellings because instances of this attribute are created by
+  // MSNoUniqueAddress and ItaniumNoUniqueAddress
+  let Spellings = [];
+  let Documentation = [InternalOnly];
+}
+
+def MSNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  let Spellings = [CXX11<"msvc", "no_unique_address", 201803>];
+  let Documentation = [MSNoUniqueAddressDocs];
+}
+
+def ItaniumNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  let Spellings = [CXX11<"", "no_unique_address", 201803>];
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index b13baa46754cfd4..d16ce23c067982d 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1408,6 +1408,15 @@ in C++11 onwards.
   }];
 }
 
+def MSNoUniqueAddressDocs : Documentation {
+  let Category = DocCatField;
+  let Content = [{
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability with MSVC.
+  }];
+}
+
 def ObjCRequiresSuperDocs : Documentation {
   let Category = DocCatFunction;
   let Content = [{
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 08ae2087cfe70eb..07aee0d87c835a8 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4507,9 +4507,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
 
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
-  // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
-  // ABI will do.
-  return true;
+  if (!Ctx.getTargetInfo().getCXXABI().isMicrosoft())
+return true;
+
+  // MS ABI: has nonzero size if it is a class type with class type fields,
+  // whether or not they have nonzero size
+  return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  });
 }
 
 bool FieldDecl::isPotentiallyOverlapping() const {
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..f1f2275da44dcad 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2595,6 +2598,8 @@ struct MicrosoftRecordLayoutBuilder {
   llvm::SmallPtrSetImpl &HasVtorDispSet,
   const CXXRecordDecl *RD) const;
   const ASTContext &Context;
+  EmptySubobjectMap *EmptySubobjects;
+
   /// The size of the rec

[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-27 Thread Amy Huang via cfe-commits

amykhuang wrote:

hmm this passes most of the checks in SemaCXX/cxx2a-no-unique-address.cpp, but 
fails "attribute 'no_unique_address' cannot have an argument list". Also fails 
Preprocessor/has_attribute.cpp because both attributes are recognized on 
itanium and windows targets.

https://github.com/llvm/llvm-project/pull/67199
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-27 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/67199

>From b1f0feeaed93edfdd692858e9d63ab6bbb94c0a5 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 22 Sep 2023 14:40:14 -0700
Subject: [PATCH 1/2] Recommit "Implement [[msvc::no_unique_address]] (#65675)"

Change the attribute docs so that there is a separate one for the MSVC
attribute.

This reverts commit 71f9e7695b87298f9855d8890f0e6a3b89381eb5.
---
 clang/include/clang/Basic/Attr.td |  19 +-
 clang/include/clang/Basic/AttrDocs.td |   9 +
 clang/lib/AST/Decl.cpp|  11 +-
 clang/lib/AST/RecordLayoutBuilder.cpp |  53 ++-
 clang/lib/Parse/ParseDeclCXX.cpp  |   3 +-
 clang/lib/Sema/SemaDeclAttr.cpp   |  10 +
 clang/test/Layout/ms-no-unique-address.cpp| 381 ++
 clang/test/Preprocessor/has_attribute.cpp |   5 +-
 .../SemaCXX/cxx2a-ms-no-unique-address.cpp|  19 +
 9 files changed, 494 insertions(+), 16 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp
 create mode 100644 clang/test/SemaCXX/cxx2a-ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index 21a3b5226623cf2..3da91d25ec97347 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,24 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  // No spellings because instances of this attribute are created by
+  // MSNoUniqueAddress and ItaniumNoUniqueAddress
+  let Spellings = [];
+  let Documentation = [InternalOnly];
+}
+
+def MSNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  let Spellings = [CXX11<"msvc", "no_unique_address", 201803>];
+  let Documentation = [MSNoUniqueAddressDocs];
+}
+
+def ItaniumNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  let Spellings = [CXX11<"", "no_unique_address", 201803>];
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index b13baa46754cfd4..d16ce23c067982d 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1408,6 +1408,15 @@ in C++11 onwards.
   }];
 }
 
+def MSNoUniqueAddressDocs : Documentation {
+  let Category = DocCatField;
+  let Content = [{
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability with MSVC.
+  }];
+}
+
 def ObjCRequiresSuperDocs : Documentation {
   let Category = DocCatFunction;
   let Content = [{
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 08ae2087cfe70eb..07aee0d87c835a8 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4507,9 +4507,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
 
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
-  // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
-  // ABI will do.
-  return true;
+  if (!Ctx.getTargetInfo().getCXXABI().isMicrosoft())
+return true;
+
+  // MS ABI: has nonzero size if it is a class type with class type fields,
+  // whether or not they have nonzero size
+  return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  });
 }
 
 bool FieldDecl::isPotentiallyOverlapping() const {
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..f1f2275da44dcad 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2595,6 +2598,8 @@ struct MicrosoftRecordLayoutBuilder {
   llvm::SmallPtrSetImpl &HasVtorDispSet,
   const CXXRecordDecl *RD) const;
   const ASTContext &Context;
+  EmptySubobjectMap *EmptySubobjects;
+
   /// The size of the rec

[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-25 Thread Amy Huang via cfe-commits


@@ -1798,11 +1798,24 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  // No spellings because instances of this attribute are created by
+  // MSNoUniqueAddress and ItaniumNoUniqueAddress
+  let Spellings = [];
+  let Documentation = [InternalOnly];
+}
+
+def MSNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  let Spellings = [CXX11<"msvc", "no_unique_address", 201803>];
+  let Documentation = [MSNoUniqueAddressDocs];
+}
+
+def ItaniumNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {

amykhuang wrote:

Yeah, that makes sense; would it be better to name it "NoUniqueAddress" and 
then name the "parent" attribute something like "NoUniqueAddressGroup"?

https://github.com/llvm/llvm-project/pull/67199
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-22 Thread Amy Huang via cfe-commits

amykhuang wrote:

Previous commit attempt caused sphinx errors. Also, because we now have two 
attributes for the itanium and MSVC versions, there are two separate sections 
in the documentation, which I didn't realize before.

https://github.com/llvm/llvm-project/pull/67199
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-22 Thread Amy Huang via cfe-commits

https://github.com/amykhuang edited 
https://github.com/llvm/llvm-project/pull/67199
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Recommit "Implement [[msvc::no_unique_address]] (#65675)" (PR #67199)

2023-09-22 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/67199

Change the attribute docs so that there is a separate one for the MSVC
attribute.

This reverts commit 71f9e7695b87298f9855d8890f0e6a3b89381eb5.


>From b1f0feeaed93edfdd692858e9d63ab6bbb94c0a5 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 22 Sep 2023 14:40:14 -0700
Subject: [PATCH] Recommit "Implement [[msvc::no_unique_address]] (#65675)"

Change the attribute docs so that there is a separate one for the MSVC
attribute.

This reverts commit 71f9e7695b87298f9855d8890f0e6a3b89381eb5.
---
 clang/include/clang/Basic/Attr.td |  19 +-
 clang/include/clang/Basic/AttrDocs.td |   9 +
 clang/lib/AST/Decl.cpp|  11 +-
 clang/lib/AST/RecordLayoutBuilder.cpp |  53 ++-
 clang/lib/Parse/ParseDeclCXX.cpp  |   3 +-
 clang/lib/Sema/SemaDeclAttr.cpp   |  10 +
 clang/test/Layout/ms-no-unique-address.cpp| 381 ++
 clang/test/Preprocessor/has_attribute.cpp |   5 +-
 .../SemaCXX/cxx2a-ms-no-unique-address.cpp|  19 +
 9 files changed, 494 insertions(+), 16 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp
 create mode 100644 clang/test/SemaCXX/cxx2a-ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index 21a3b5226623cf2..3da91d25ec97347 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,24 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  // No spellings because instances of this attribute are created by
+  // MSNoUniqueAddress and ItaniumNoUniqueAddress
+  let Spellings = [];
+  let Documentation = [InternalOnly];
+}
+
+def MSNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  let Spellings = [CXX11<"msvc", "no_unique_address", 201803>];
+  let Documentation = [MSNoUniqueAddressDocs];
+}
+
+def ItaniumNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+  let Spellings = [CXX11<"", "no_unique_address", 201803>];
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index b13baa46754cfd4..d16ce23c067982d 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1408,6 +1408,15 @@ in C++11 onwards.
   }];
 }
 
+def MSNoUniqueAddressDocs : Documentation {
+  let Category = DocCatField;
+  let Content = [{
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability with MSVC.
+  }];
+}
+
 def ObjCRequiresSuperDocs : Documentation {
   let Category = DocCatFunction;
   let Content = [{
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 08ae2087cfe70eb..07aee0d87c835a8 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4507,9 +4507,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
 
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
-  // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
-  // ABI will do.
-  return true;
+  if (!Ctx.getTargetInfo().getCXXABI().isMicrosoft())
+return true;
+
+  // MS ABI: has nonzero size if it is a class type with class type fields,
+  // whether or not they have nonzero size
+  return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  });
 }
 
 bool FieldDecl::isPotentiallyOverlapping() const {
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..f1f2275da44dcad 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2595,6 +2598,8 @@ struct MicrosoftRecordLayoutBuilder {
   llvm::SmallPtrSetImpl &HasVtorDi

[clang] Revert "Implement [[msvc::no_unique_address]] (#65675)" (PR #67198)

2023-09-22 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/67198
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Revert "Implement [[msvc::no_unique_address]] (#65675)" (PR #67198)

2023-09-22 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/67198

This reverts commit 4a55d426967b9c70f5dea7b3a389e11393a4f4c4.

Reverting because this breaks sphinx documentation, and even with it
fixed the format of the attribute makes the no_unique_address
documentation show up twice.


>From 159cc6b5d3cea0c4b51bd5dac7728a3cfa379f28 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 22 Sep 2023 14:37:10 -0700
Subject: [PATCH] Revert "Implement [[msvc::no_unique_address]] (#65675)"

This reverts commit 4a55d426967b9c70f5dea7b3a389e11393a4f4c4.

Reverting because this breaks sphinx documentation, and even with it
fixed the format of the attribute makes the no_unique_address
documentation show up twice.
---
 clang/include/clang/Basic/Attr.td |  19 +-
 clang/include/clang/Basic/AttrDocs.td |   4 -
 clang/lib/AST/Decl.cpp|  11 +-
 clang/lib/AST/RecordLayoutBuilder.cpp |  53 +--
 clang/lib/Parse/ParseDeclCXX.cpp  |   3 +-
 clang/lib/Sema/SemaDeclAttr.cpp   |  10 -
 clang/test/Layout/ms-no-unique-address.cpp| 381 --
 clang/test/Preprocessor/has_attribute.cpp |   5 +-
 .../SemaCXX/cxx2a-ms-no-unique-address.cpp|  19 -
 9 files changed, 16 insertions(+), 489 deletions(-)
 delete mode 100644 clang/test/Layout/ms-no-unique-address.cpp
 delete mode 100644 clang/test/SemaCXX/cxx2a-ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index bb8d204f33dc531..21a3b5226623cf2 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,24 +1798,11 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr {
-  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
-  // No spellings because instances of this attribute are created by
-  // MSNoUniqueAddress and ItaniumNoUniqueAddress
-  let Spellings = [];
-  let Documentation = [NoUniqueAddressDocs];
-}
-
-def MSNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
-  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
-  let Spellings = [CXX11<"msvc", "no_unique_address", 201803>];
-  let Documentation = [NoUniqueAddressDocs];
-}
-
-def ItaniumNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {
-  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
+def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
   let Spellings = [CXX11<"", "no_unique_address", 201803>];
+  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
   let Documentation = [NoUniqueAddressDocs];
+  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index 18428d26b5dc8f2..b13baa46754cfd4 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1405,10 +1405,6 @@ Example usage:
 
 ``[[no_unique_address]]`` is a standard C++20 attribute. Clang supports its use
 in C++11 onwards.
-
-On MSVC targets, ``[[no_unique_address]]`` is ignored; use
-``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
-compatibility or stability.
   }];
 }
 
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 07aee0d87c835a8..08ae2087cfe70eb 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4507,14 +4507,9 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
 
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
-  if (!Ctx.getTargetInfo().getCXXABI().isMicrosoft())
-return true;
-
-  // MS ABI: has nonzero size if it is a class type with class type fields,
-  // whether or not they have nonzero size
-  return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
-return Field->getType()->getAs();
-  });
+  // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
+  // ABI will do.
+  return true;
 }
 
 bool FieldDecl::isPotentiallyOverlapping() const {
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index f1f2275da44dcad..8afd88ae7be27b3 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,10 +2545,7 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
-   EmptySubobjectMap *EmptySubobjects)
-  : Context(Context), EmptySubobjects(EmptySubobjects) {}
-
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2598,8 +2595,6 @@ struct MicrosoftRecordLayoutBuilder {

[clang] Fix attr docs from previous no-unique-adderss change (PR #67195)

2023-09-22 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/67195
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix attr docs from previous no-unique-adderss change (PR #67195)

2023-09-22 Thread Amy Huang via cfe-commits

https://github.com/amykhuang edited 
https://github.com/llvm/llvm-project/pull/67195
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Fix attr docs from previous no-unique-adderss change (PR #67195)

2023-09-22 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/67195

None

>From d5347c906ac7db40f9b31ad0c0bcd193df453e4e Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 22 Sep 2023 13:54:28 -0700
Subject: [PATCH] Fix attr docs from previous no-unique-adderss change

---
 clang/include/clang/Basic/Attr.td | 1 -
 1 file changed, 1 deletion(-)

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index bb8d204f33dc531..35eb6ff63132629 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1803,7 +1803,6 @@ def NoUniqueAddress : InheritableAttr {
   // No spellings because instances of this attribute are created by
   // MSNoUniqueAddress and ItaniumNoUniqueAddress
   let Spellings = [];
-  let Documentation = [NoUniqueAddressDocs];
 }
 
 def MSNoUniqueAddress : InheritableAttr, 
TargetSpecificAttr {

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-22 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add __prefetch intrinsic (PR #67174)

2023-09-22 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/67174

Implement __prefetch intrinsic. 

MSVC docs: 
https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics?view=msvc-170

Bug: https://github.com/llvm/llvm-project/issues/65405

>From c60ccb5cb84b7855b3a4a92993d16d55f5b43159 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Thu, 21 Sep 2023 17:14:41 -0700
Subject: [PATCH] [MSVC, ARM64] Add __prefetch intrinsic

---
 clang/include/clang/Basic/BuiltinsAArch64.def   |  2 ++
 clang/lib/CodeGen/CGBuiltin.cpp |  9 +
 clang/lib/Headers/intrin.h  |  2 ++
 clang/test/CodeGen/arm64-microsoft-intrinsics.c | 10 ++
 4 files changed, 23 insertions(+)

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index 12c7a371e0fbdb9..82a1ba3c82ad358 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -283,6 +283,8 @@ TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", 
INTRIN_H, ALL_MS_LAN
 TARGET_HEADER_BUILTIN(_CountOneBits, "UiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
+TARGET_HEADER_BUILTIN(__prefetch, "vv*", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
+
 #undef BUILTIN
 #undef LANGBUILTIN
 #undef TARGET_BUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 4a73403cb3b9a72..6944ff8f6ca745e 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -10834,6 +10834,15 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Result;
   }
 
+  if (BuiltinID == AArch64::BI__prefetch) {
+Value *Address = EmitScalarExpr(E->getArg(0));
+Value *RW = llvm::ConstantInt::get(Int32Ty, 0);
+Value *Locality = ConstantInt::get(Int32Ty, 3);
+Value *Data = llvm::ConstantInt::get(Int32Ty, 1);
+Function *F = CGM.getIntrinsic(Intrinsic::prefetch, Address->getType());
+return Builder.CreateCall(F, {Address, RW, Locality, Data});
+  }
+
   // Handle MSVC intrinsics before argument evaluation to prevent double
   // evaluation.
   if (std::optional MsvcIntId =
diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h
index 4678c527bfaab5a..9ebaea9fee94214 100644
--- a/clang/lib/Headers/intrin.h
+++ b/clang/lib/Headers/intrin.h
@@ -586,6 +586,8 @@ unsigned int _CountLeadingZeros(unsigned long);
 unsigned int _CountLeadingZeros64(unsigned _int64);
 unsigned int _CountOneBits(unsigned long);
 unsigned int _CountOneBits64(unsigned __int64);
+
+void __cdecl __prefetch(void *);
 #endif
 
 
/**\
diff --git a/clang/test/CodeGen/arm64-microsoft-intrinsics.c 
b/clang/test/CodeGen/arm64-microsoft-intrinsics.c
index b15defb0894e92e..44b2ee28fe56814 100644
--- a/clang/test/CodeGen/arm64-microsoft-intrinsics.c
+++ b/clang/test/CodeGen/arm64-microsoft-intrinsics.c
@@ -402,6 +402,16 @@ unsigned int check_CountOneBits64(unsigned __int64 arg1) {
 // CHECK-MSCOMPAT: ret i32 %[[VAR2]]
 // CHECK-LINUX: error: call to undeclared function '_CountOneBits64'
 
+void check__prefetch(void *arg1) {
+  return __prefetch(arg1);
+}
+
+// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca ptr, align 8
+// CHECK-MSCOMPAT: store ptr %[[ARG1]], ptr %[[ARG1]].addr, align 8
+// CHECK-MSCOMPAT: %[[VAR0:.*]] = load ptr, ptr %[[ARG1]].addr, align 8
+// CHECK-MSCOMPAT: call void @llvm.prefetch.p0(ptr %[[VAR0]], i32 0, i32 3, 
i32 1)
+// CHECK-MSCOMPAT: ret void
+
 
 // CHECK-MSCOMPAT: ![[MD2]] = !{!"x18"}
 // CHECK-MSCOMPAT: ![[MD3]] = !{!"sp"}

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-21 Thread Amy Huang via cfe-commits

https://github.com/amykhuang closed 
https://github.com/llvm/llvm-project/pull/66554
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-20 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/66554

>From de9c8618210103074e580105ce894e66dba782a9 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Thu, 7 Sep 2023 11:32:17 -0700
Subject: [PATCH 1/3] [MSVC, ARM64] Add _Copy* and _Count* intrinsics

---
 clang/include/clang/Basic/BuiltinsAArch64.def |  15 +-
 clang/lib/CodeGen/CGBuiltin.cpp   |  62 
 clang/lib/Headers/intrin.h|  14 ++
 .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++
 4 files changed, 228 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index eaae6c9ad846868..c4d34f8e15e8b8d 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 
 TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
 
-
 TARGET_HEADER_BUILTIN(__writex18byte,  "vUNiUc", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18word,  "vUNiUs", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
@@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word,  "UsUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
+TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
+TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
 #undef BUILTIN
 #undef LANGBUILTIN
 #undef TARGET_BUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index f727a0d5592effd..e27e74ed7a53db0 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -10779,6 +10779,68 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+return EmitScalarExpr(E->getArg(0));
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+  BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+  BuiltinID == AArch64::BI_CountLeadingZeros ||
+  BuiltinID == AArch64::BI_CountLeadingZeros64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+BuiltinID == AArch64::BI_CountLeadingOnes64)
+  Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
+
+Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
+Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)});
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+BuiltinID == AArch64::BI_CountLeadingZeros64)
+  Result = Builder.CreateTrunc(Result, Builder.getInt32Ty());
+return Result;
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingSigns ||
+  BuiltinID == AArch64::BI_CountLeadingSigns64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+Function *F;
+if (BuiltinID == AArch64::BI_CountLeadingSigns) {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls);
+  if (ArgType != Builder.getInt32Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ 
true);
+} else {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls64);
+  if (ArgType != Builder.getInt64Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ 
true);
+}
+Value *Result = Builder.CreateCall(F, Arg, "cls");
+if (BuiltinID == AArch64::BI_CountLeadingSigns64)
+  Result = Builder.CreateTrunc(Result, B

[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-20 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/66554

>From de9c8618210103074e580105ce894e66dba782a9 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Thu, 7 Sep 2023 11:32:17 -0700
Subject: [PATCH 1/3] [MSVC, ARM64] Add _Copy* and _Count* intrinsics

---
 clang/include/clang/Basic/BuiltinsAArch64.def |  15 +-
 clang/lib/CodeGen/CGBuiltin.cpp   |  62 
 clang/lib/Headers/intrin.h|  14 ++
 .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++
 4 files changed, 228 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index eaae6c9ad846868..c4d34f8e15e8b8d 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 
 TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
 
-
 TARGET_HEADER_BUILTIN(__writex18byte,  "vUNiUc", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18word,  "vUNiUs", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
@@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word,  "UsUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
+TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
+TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
 #undef BUILTIN
 #undef LANGBUILTIN
 #undef TARGET_BUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index f727a0d5592effd..e27e74ed7a53db0 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -10779,6 +10779,68 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+return EmitScalarExpr(E->getArg(0));
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+  BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+  BuiltinID == AArch64::BI_CountLeadingZeros ||
+  BuiltinID == AArch64::BI_CountLeadingZeros64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+BuiltinID == AArch64::BI_CountLeadingOnes64)
+  Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
+
+Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
+Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)});
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+BuiltinID == AArch64::BI_CountLeadingZeros64)
+  Result = Builder.CreateTrunc(Result, Builder.getInt32Ty());
+return Result;
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingSigns ||
+  BuiltinID == AArch64::BI_CountLeadingSigns64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+Function *F;
+if (BuiltinID == AArch64::BI_CountLeadingSigns) {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls);
+  if (ArgType != Builder.getInt32Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ 
true);
+} else {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls64);
+  if (ArgType != Builder.getInt64Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ 
true);
+}
+Value *Result = Builder.CreateCall(F, Arg, "cls");
+if (BuiltinID == AArch64::BI_CountLeadingSigns64)
+  Result = Builder.CreateTrunc(Result, B

[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-20 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/66554
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-20 Thread Amy Huang via cfe-commits


@@ -10779,6 +10779,70 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *RetTy = ConvertType(E->getType());
+return Builder.CreateBitCast(Arg, RetTy);
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+  BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+  BuiltinID == AArch64::BI_CountLeadingZeros ||
+  BuiltinID == AArch64::BI_CountLeadingZeros64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+BuiltinID == AArch64::BI_CountLeadingOnes64)
+  Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
+
+Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
+Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)});
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+BuiltinID == AArch64::BI_CountLeadingZeros64)
+  Result = Builder.CreateTrunc(Result, Builder.getInt32Ty());
+return Result;
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingSigns ||
+  BuiltinID == AArch64::BI_CountLeadingSigns64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+Function *F;
+if (BuiltinID == AArch64::BI_CountLeadingSigns) {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls);
+  if (ArgType != Builder.getInt32Ty())

amykhuang wrote:

Yep, thanks.

https://github.com/llvm/llvm-project/pull/66554
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-19 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/66554
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-19 Thread Amy Huang via cfe-commits


@@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word,  "UsUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
+TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
+TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")

amykhuang wrote:

Done

https://github.com/llvm/llvm-project/pull/66554
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-19 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/66554

>From de9c8618210103074e580105ce894e66dba782a9 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Thu, 7 Sep 2023 11:32:17 -0700
Subject: [PATCH 1/3] [MSVC, ARM64] Add _Copy* and _Count* intrinsics

---
 clang/include/clang/Basic/BuiltinsAArch64.def |  15 +-
 clang/lib/CodeGen/CGBuiltin.cpp   |  62 
 clang/lib/Headers/intrin.h|  14 ++
 .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++
 4 files changed, 228 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index eaae6c9ad846868..c4d34f8e15e8b8d 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 
 TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
 
-
 TARGET_HEADER_BUILTIN(__writex18byte,  "vUNiUc", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18word,  "vUNiUs", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
@@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word,  "UsUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
+TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
+TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
 #undef BUILTIN
 #undef LANGBUILTIN
 #undef TARGET_BUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index f727a0d5592effd..e27e74ed7a53db0 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -10779,6 +10779,68 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+return EmitScalarExpr(E->getArg(0));
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+  BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+  BuiltinID == AArch64::BI_CountLeadingZeros ||
+  BuiltinID == AArch64::BI_CountLeadingZeros64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+BuiltinID == AArch64::BI_CountLeadingOnes64)
+  Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
+
+Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
+Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)});
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+BuiltinID == AArch64::BI_CountLeadingZeros64)
+  Result = Builder.CreateTrunc(Result, Builder.getInt32Ty());
+return Result;
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingSigns ||
+  BuiltinID == AArch64::BI_CountLeadingSigns64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+Function *F;
+if (BuiltinID == AArch64::BI_CountLeadingSigns) {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls);
+  if (ArgType != Builder.getInt32Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ 
true);
+} else {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls64);
+  if (ArgType != Builder.getInt64Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ 
true);
+}
+Value *Result = Builder.CreateCall(F, Arg, "cls");
+if (BuiltinID == AArch64::BI_CountLeadingSigns64)
+  Result = Builder.CreateTrunc(Result, B

[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-19 Thread Amy Huang via cfe-commits


@@ -10779,6 +10779,70 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *RetTy = ConvertType(E->getType());
+return Builder.CreateBitCast(Arg, RetTy);
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+  BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+  BuiltinID == AArch64::BI_CountLeadingZeros ||
+  BuiltinID == AArch64::BI_CountLeadingZeros64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+BuiltinID == AArch64::BI_CountLeadingOnes64)
+  Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
+
+Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
+Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)});
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+BuiltinID == AArch64::BI_CountLeadingZeros64)
+  Result = Builder.CreateTrunc(Result, Builder.getInt32Ty());
+return Result;
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingSigns ||
+  BuiltinID == AArch64::BI_CountLeadingSigns64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+Function *F;
+if (BuiltinID == AArch64::BI_CountLeadingSigns) {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls);
+  if (ArgType != Builder.getInt32Ty())

amykhuang wrote:

Yeah, I'm a bit confused by this. It was coming up in the test case when 
building with `-triple arm64-darwin`.  It seemed everything was being converted 
to int64 at the beginning of the function? 

https://github.com/llvm/llvm-project/pull/66554
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-19 Thread Amy Huang via cfe-commits

amykhuang wrote:

Are there any other comments here? I think I've addressed all the existing ones.

https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-19 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-19 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/65675

>From 481337fde54dc4d7f68a604952a963c99913675d Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 21 Jul 2023 16:30:30 -0700
Subject: [PATCH 1/6] Implement [[msvc::no_unique_address]]

This attribute should match the behavior of MSVC's [[msvc::no_unique_address]] 
attribute.

Bug: https://github.com/llvm/llvm-project/issues/49358

Differential Revision: https://reviews.llvm.org/D157762
---
 clang/include/clang/Basic/Attr.td   |   8 +-
 clang/include/clang/Basic/AttrDocs.td   |   4 +
 clang/lib/AST/Decl.cpp  |   8 +
 clang/lib/AST/RecordLayoutBuilder.cpp   | 191 +--
 clang/lib/CodeGen/CGRecordLayoutBuilder.cpp |   1 +
 clang/lib/Sema/SemaDeclAttr.cpp |  17 +
 clang/test/Layout/ms-no-unique-address.cpp  | 338 
 7 files changed, 540 insertions(+), 27 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index c95db7e8049d47a..23e56cda0f67e9d 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,13 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Spellings = [CXX11<"", "no_unique_address", 201803>,
+   CXX11<"msvc", "no_unique_address", 201803>];
+  let Accessors = [Accessor<"isDefault", [CXX11<"", "no_unique_address", 
201803>]>,
+   Accessor<"isMSVC", [CXX11<"msvc", "no_unique_address", 
201803>]>];
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index f11ea89d14bad0d..21e6373611272b5 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1405,6 +1405,10 @@ Example usage:
 
 ``[[no_unique_address]]`` is a standard C++20 attribute. Clang supports its use
 in C++11 onwards.
+
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability.
   }];
 }
 
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 08ae2087cfe70eb..383be8318fc2145 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4505,6 +4505,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
   if (!CXXRD->isEmpty())
 return false;
 
+  // MS ABI: nonzero if class type with class type fields
+  if (Ctx.getTargetInfo().getCXXABI().isMicrosoft() &&
+  llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  })) {
+return false;
+  }
+
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
   // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..2152e69732d65c9 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2562,7 +2565,11 @@ struct MicrosoftRecordLayoutBuilder {
   void layoutNonVirtualBase(const CXXRecordDecl *RD,
 const CXXRecordDecl *BaseDecl,
 const ASTRecordLayout &BaseLayout,
-const ASTRecordLayout *&PreviousBaseLayout);
+const ASTRecordLayout *&PreviousBaseLayout,
+BaseSubobjectInfo *Base);
+  BaseSubobjectInfo *computeBaseSubobjectInfo(const CXXRecordDecl *RD,
+  bool IsVirtual,
+  BaseSubobjectInfo *Derived);
   void injectVFPtr(const CXXRecordDecl *RD);
   void injectVBPtr(const CXXRecordDecl *RD);
   /// Lays out the fields of the record.  Also rounds size up to
@@ -2595,6 +2602,12 @@ struct MicrosoftRecordLayoutBuilder {
   llvm::SmallPtrSetImpl &HasVtorDispSet,

[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-19 Thread Amy Huang via cfe-commits

amykhuang wrote:

> > We should consider whether we want to support `__msvc_no_unique_address__` 
> > or similar as an alternative spelling #61196
> 
> I think `[[__msvc__::__no_unique_address__]]` would be better. This is how 
> the clang and gnu attributes are handled too. I'm also fine with handling 
> this in a follow-up patch.

Sounds good, I can do this in a separate patch

https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-19 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-19 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-19 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/66554

>From f0375650be09359ac1a87dd7a60a9415a55cf837 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Thu, 7 Sep 2023 11:32:17 -0700
Subject: [PATCH 1/3] [MSVC, ARM64] Add _Copy* and _Count* intrinsics

---
 clang/include/clang/Basic/BuiltinsAArch64.def |  15 +-
 clang/lib/CodeGen/CGBuiltin.cpp   |  62 
 clang/lib/Headers/intrin.h|  14 ++
 .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++
 4 files changed, 228 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index eaae6c9ad846868..c4d34f8e15e8b8d 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 
 TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
 
-
 TARGET_HEADER_BUILTIN(__writex18byte,  "vUNiUc", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18word,  "vUNiUs", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
@@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word,  "UsUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
+TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
+TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
 #undef BUILTIN
 #undef LANGBUILTIN
 #undef TARGET_BUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index f727a0d5592effd..e27e74ed7a53db0 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -10779,6 +10779,68 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+return EmitScalarExpr(E->getArg(0));
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+  BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+  BuiltinID == AArch64::BI_CountLeadingZeros ||
+  BuiltinID == AArch64::BI_CountLeadingZeros64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+BuiltinID == AArch64::BI_CountLeadingOnes64)
+  Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
+
+Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
+Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)});
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+BuiltinID == AArch64::BI_CountLeadingZeros64)
+  Result = Builder.CreateTrunc(Result, Builder.getInt32Ty());
+return Result;
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingSigns ||
+  BuiltinID == AArch64::BI_CountLeadingSigns64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+Function *F;
+if (BuiltinID == AArch64::BI_CountLeadingSigns) {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls);
+  if (ArgType != Builder.getInt32Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ 
true);
+} else {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls64);
+  if (ArgType != Builder.getInt64Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ 
true);
+}
+Value *Result = Builder.CreateCall(F, Arg, "cls");
+if (BuiltinID == AArch64::BI_CountLeadingSigns64)
+  Result = Builder.CreateTrunc(Result, B

[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-19 Thread Amy Huang via cfe-commits


@@ -10752,6 +10752,68 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+return EmitScalarExpr(E->getArg(0));

amykhuang wrote:

Done

https://github.com/llvm/llvm-project/pull/66554
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-18 Thread Amy Huang via cfe-commits


@@ -10752,6 +10752,68 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+return EmitScalarExpr(E->getArg(0));

amykhuang wrote:

Oh, ok -- added a int to float cast. It seems like MSVC only emits an `fmov` 
for this code, so for an example snippet

```
double copy_double_from_int64(__int64 w) {
  return _CopyDoubleFromInt64((__int64) w);
}
```

MSVC assembly output looks like

```
sub   sp,sp,#0x10
str x0,[sp]
ldr x8,[sp]
fmov d0,x8
add   sp,sp,#0x10
ret
```

whereas clang assembly output (with the cast) looks like 

```
sub sp, sp, #16
str   x0, [sp, #8]
ldr  d0, [sp, #8]
scvtf   d0, d0
addsp, sp, #16
ret
```

https://github.com/llvm/llvm-project/pull/66554
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-15 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/66554

>From 2f18bc9802942e5fa08181026212ea711f9f16a9 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Thu, 7 Sep 2023 11:32:17 -0700
Subject: [PATCH] [MSVC, ARM64] Add _Copy* and _Count* intrinsics

---
 clang/include/clang/Basic/BuiltinsAArch64.def |  15 +-
 clang/lib/CodeGen/CGBuiltin.cpp   |  62 
 clang/lib/Headers/intrin.h|  14 ++
 .../test/CodeGen/arm64-microsoft-intrinsics.c | 138 ++
 4 files changed, 228 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index eaae6c9ad846868..c4d34f8e15e8b8d 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 
 TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
 
-
 TARGET_HEADER_BUILTIN(__writex18byte,  "vUNiUc", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18word,  "vUNiUs", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
@@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word,  "UsUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
+TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
+TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
 #undef BUILTIN
 #undef LANGBUILTIN
 #undef TARGET_BUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 037a2f9f7b15322..08d09c1c3d8e9de 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -10752,6 +10752,68 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+return EmitScalarExpr(E->getArg(0));
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+  BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+  BuiltinID == AArch64::BI_CountLeadingZeros ||
+  BuiltinID == AArch64::BI_CountLeadingZeros64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+BuiltinID == AArch64::BI_CountLeadingOnes64)
+  Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
+
+Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
+Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)});
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+BuiltinID == AArch64::BI_CountLeadingZeros64)
+  Result = Builder.CreateTrunc(Result, Builder.getInt32Ty());
+return Result;
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingSigns ||
+  BuiltinID == AArch64::BI_CountLeadingSigns64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+Function *F;
+if (BuiltinID == AArch64::BI_CountLeadingSigns) {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls);
+  if (ArgType != Builder.getInt32Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt32Ty(), /*isSigned*/ 
true);
+} else {
+  F = CGM.getIntrinsic(Intrinsic::aarch64_cls64);
+  if (ArgType != Builder.getInt64Ty())
+Arg =
+Builder.CreateIntCast(Arg, Builder.getInt64Ty(), /*isSigned*/ 
true);
+}
+Value *Result = Builder.CreateCall(F, Arg, "cls");
+if (BuiltinID == AArch64::BI_CountLeadingSigns64)
+  Result = Builder.CreateTrunc(Result, Build

[clang] [MSVC, ARM64] Add _Copy* and _Count* intrinsics (PR #66554)

2023-09-15 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/66554

Implement the _Count* and _Copy* Windows ARM intrinsics:

```
double _CopyDoubleFromInt64(__int64)
float _CopyFloatFromInt32(__int32)
__int32 _CopyInt32FromFloat(float)
__int64 _CopyInt64FromDouble(double)
unsigned int _CountLeadingOnes(unsigned long)
unsigned int _CountLeadingOnes64(unsigned __int64)
unsigned int _CountLeadingSigns(long)
unsigned int _CountLeadingSigns64(__int64)
unsigned int _CountLeadingZeros(unsigned long)
unsigned int _CountLeadingZeros64(unsigned __int64)
unsigned int _CountOneBits(unsigned long)
unsigned int _CountOneBits64(unsigned __int64)
```

Full list of intrinsics here: 
[https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics](https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics)

Bug: [65405](https://github.com/llvm/llvm-project/issues/65405)

>From bbd538659e363e7e7e57fd5e585bc90c2bc0d88b Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Thu, 7 Sep 2023 11:32:17 -0700
Subject: [PATCH] [MSVC, ARM64] Add _Copy* and _Count* intrinsics

---
 clang/include/clang/Basic/BuiltinsAArch64.def |  15 +-
 clang/lib/CodeGen/CGBuiltin.cpp   |  62 
 clang/lib/Headers/intrin.h|  14 ++
 .../test/CodeGen/arm64-microsoft-intrinsics.c | 140 ++
 4 files changed, 230 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index eaae6c9ad846868..c4d34f8e15e8b8d 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -259,7 +259,6 @@ TARGET_HEADER_BUILTIN(__umulh, "ULLiULLiULLi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 
 TARGET_HEADER_BUILTIN(__break, "vi", "nh", INTRIN_H, ALL_MS_LANGUAGES, "")
 
-
 TARGET_HEADER_BUILTIN(__writex18byte,  "vUNiUc", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18word,  "vUNiUs", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__writex18dword, "vUNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
@@ -270,6 +269,20 @@ TARGET_HEADER_BUILTIN(__readx18word,  "UsUNi", "nh", 
INTRIN_H, ALL_MS_LANGUAGES,
 TARGET_HEADER_BUILTIN(__readx18dword, "UNiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(__readx18qword, "ULLiUNi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
 
+TARGET_HEADER_BUILTIN(_CopyDoubleFromInt64, "dSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyFloatFromInt32, "fSi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt32FromFloat, "Sif", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CopyInt64FromDouble, "SLLid", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
+TARGET_HEADER_BUILTIN(_CountLeadingOnes, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingOnes64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns, "UiSLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingSigns64, "UiSLLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountLeadingZeros64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits, "UiULi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_CountOneBits64, "UiULLi", "nh", INTRIN_H, 
ALL_MS_LANGUAGES, "")
+
 #undef BUILTIN
 #undef LANGBUILTIN
 #undef TARGET_BUILTIN
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 037a2f9f7b15322..08d09c1c3d8e9de 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -10752,6 +10752,68 @@ Value 
*CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
 return Load;
   }
 
+  if (BuiltinID == AArch64::BI_CopyDoubleFromInt64 ||
+  BuiltinID == AArch64::BI_CopyFloatFromInt32 ||
+  BuiltinID == AArch64::BI_CopyInt32FromFloat ||
+  BuiltinID == AArch64::BI_CopyInt64FromDouble) {
+return EmitScalarExpr(E->getArg(0));
+  }
+
+  if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+  BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+  BuiltinID == AArch64::BI_CountLeadingZeros ||
+  BuiltinID == AArch64::BI_CountLeadingZeros64) {
+Value *Arg = EmitScalarExpr(E->getArg(0));
+llvm::Type *ArgType = Arg->getType();
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes ||
+BuiltinID == AArch64::BI_CountLeadingOnes64)
+  Arg = Builder.CreateXor(Arg, Constant::getAllOnesValue(ArgType));
+
+Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType);
+Value *Result = Builder.CreateCall(F, {Arg, Builder.getInt1(false)});
+
+if (BuiltinID == AArch64::BI_CountLeadingOnes64 ||
+BuiltinID == AArch64::BI_CountLeadingZeros64)
+  Result = Builder.CreateTrunc(Result, Builder.getInt32Ty());
+return Result;
+  }
+
+  if (BuiltinID == AArch64::BI_CountL

[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-13 Thread Amy Huang via cfe-commits


@@ -55,7 +55,7 @@ CXX11(unlikely)
 // CHECK: likely: 201803L
 // CHECK: maybe_unused: 201603L
 // ITANIUM: no_unique_address: 201803L
-// WINDOWS: no_unique_address: 0
+// WINDOWS: no_unique_address: 201803L 

amykhuang wrote:

Tried this and the inheritance part wasn't quite working (think that the 
NoUniqueAddress should be a class, but in that case, not sure how to parse the 
two attributes). I did a slightly different version where we have three 
attributes with no inheritance (MS, Itanium, and general) and just parse the MS 
and Itanium versions as the general version in SemaDeclAttr. It at least passes 
the tests that were broken before.

https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-13 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/65675:

>From 923a43cd6386f6e57023fd8928eed0dc0ab04d57 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 21 Jul 2023 16:30:30 -0700
Subject: [PATCH 1/3] Implement [[msvc::no_unique_address]]

This attribute should match the behavior of MSVC's [[msvc::no_unique_address]] 
attribute.

Bug: https://github.com/llvm/llvm-project/issues/49358

Differential Revision: https://reviews.llvm.org/D157762
---
 clang/include/clang/Basic/Attr.td   |   8 +-
 clang/include/clang/Basic/AttrDocs.td   |   4 +
 clang/lib/AST/Decl.cpp  |   8 +
 clang/lib/AST/RecordLayoutBuilder.cpp   | 191 +--
 clang/lib/CodeGen/CGRecordLayoutBuilder.cpp |   1 +
 clang/lib/Sema/SemaDeclAttr.cpp |  17 +
 clang/test/Layout/ms-no-unique-address.cpp  | 338 
 7 files changed, 540 insertions(+), 27 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index c95db7e8049d47a..23e56cda0f67e9d 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,13 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Spellings = [CXX11<"", "no_unique_address", 201803>,
+   CXX11<"msvc", "no_unique_address", 201803>];
+  let Accessors = [Accessor<"isDefault", [CXX11<"", "no_unique_address", 
201803>]>,
+   Accessor<"isMSVC", [CXX11<"msvc", "no_unique_address", 
201803>]>];
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index f11ea89d14bad0d..21e6373611272b5 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1405,6 +1405,10 @@ Example usage:
 
 ``[[no_unique_address]]`` is a standard C++20 attribute. Clang supports its use
 in C++11 onwards.
+
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability.
   }];
 }
 
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 60c80f2b075336b..d1770330070a519 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4505,6 +4505,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
   if (!CXXRD->isEmpty())
 return false;
 
+  // MS ABI: nonzero if class type with class type fields
+  if (Ctx.getTargetInfo().getCXXABI().isMicrosoft() &&
+  llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  })) {
+return false;
+  }
+
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
   // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..2152e69732d65c9 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2562,7 +2565,11 @@ struct MicrosoftRecordLayoutBuilder {
   void layoutNonVirtualBase(const CXXRecordDecl *RD,
 const CXXRecordDecl *BaseDecl,
 const ASTRecordLayout &BaseLayout,
-const ASTRecordLayout *&PreviousBaseLayout);
+const ASTRecordLayout *&PreviousBaseLayout,
+BaseSubobjectInfo *Base);
+  BaseSubobjectInfo *computeBaseSubobjectInfo(const CXXRecordDecl *RD,
+  bool IsVirtual,
+  BaseSubobjectInfo *Derived);
   void injectVFPtr(const CXXRecordDecl *RD);
   void injectVBPtr(const CXXRecordDecl *RD);
   /// Lays out the fields of the record.  Also rounds size up to
@@ -2595,6 +2602,12 @@ struct MicrosoftRecordLayoutBuilder {
   llvm::SmallPtrSetImpl &HasVtorDispSet,

[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/65675:

>From 923a43cd6386f6e57023fd8928eed0dc0ab04d57 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 21 Jul 2023 16:30:30 -0700
Subject: [PATCH 1/3] Implement [[msvc::no_unique_address]]

This attribute should match the behavior of MSVC's [[msvc::no_unique_address]] 
attribute.

Bug: https://github.com/llvm/llvm-project/issues/49358

Differential Revision: https://reviews.llvm.org/D157762
---
 clang/include/clang/Basic/Attr.td   |   8 +-
 clang/include/clang/Basic/AttrDocs.td   |   4 +
 clang/lib/AST/Decl.cpp  |   8 +
 clang/lib/AST/RecordLayoutBuilder.cpp   | 191 +--
 clang/lib/CodeGen/CGRecordLayoutBuilder.cpp |   1 +
 clang/lib/Sema/SemaDeclAttr.cpp |  17 +
 clang/test/Layout/ms-no-unique-address.cpp  | 338 
 7 files changed, 540 insertions(+), 27 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index c95db7e8049d47a..23e56cda0f67e9d 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,13 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Spellings = [CXX11<"", "no_unique_address", 201803>,
+   CXX11<"msvc", "no_unique_address", 201803>];
+  let Accessors = [Accessor<"isDefault", [CXX11<"", "no_unique_address", 
201803>]>,
+   Accessor<"isMSVC", [CXX11<"msvc", "no_unique_address", 
201803>]>];
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index f11ea89d14bad0d..21e6373611272b5 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1405,6 +1405,10 @@ Example usage:
 
 ``[[no_unique_address]]`` is a standard C++20 attribute. Clang supports its use
 in C++11 onwards.
+
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability.
   }];
 }
 
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 60c80f2b075336b..d1770330070a519 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4505,6 +4505,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
   if (!CXXRD->isEmpty())
 return false;
 
+  // MS ABI: nonzero if class type with class type fields
+  if (Ctx.getTargetInfo().getCXXABI().isMicrosoft() &&
+  llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  })) {
+return false;
+  }
+
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
   // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..2152e69732d65c9 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2562,7 +2565,11 @@ struct MicrosoftRecordLayoutBuilder {
   void layoutNonVirtualBase(const CXXRecordDecl *RD,
 const CXXRecordDecl *BaseDecl,
 const ASTRecordLayout &BaseLayout,
-const ASTRecordLayout *&PreviousBaseLayout);
+const ASTRecordLayout *&PreviousBaseLayout,
+BaseSubobjectInfo *Base);
+  BaseSubobjectInfo *computeBaseSubobjectInfo(const CXXRecordDecl *RD,
+  bool IsVirtual,
+  BaseSubobjectInfo *Derived);
   void injectVFPtr(const CXXRecordDecl *RD);
   void injectVBPtr(const CXXRecordDecl *RD);
   /// Lays out the fields of the record.  Also rounds size up to
@@ -2595,6 +2602,12 @@ struct MicrosoftRecordLayoutBuilder {
   llvm::SmallPtrSetImpl &HasVtorDispSet,

[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/65675:

>From 923a43cd6386f6e57023fd8928eed0dc0ab04d57 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 21 Jul 2023 16:30:30 -0700
Subject: [PATCH 1/3] Implement [[msvc::no_unique_address]]

This attribute should match the behavior of MSVC's [[msvc::no_unique_address]] 
attribute.

Bug: https://github.com/llvm/llvm-project/issues/49358

Differential Revision: https://reviews.llvm.org/D157762
---
 clang/include/clang/Basic/Attr.td   |   8 +-
 clang/include/clang/Basic/AttrDocs.td   |   4 +
 clang/lib/AST/Decl.cpp  |   8 +
 clang/lib/AST/RecordLayoutBuilder.cpp   | 191 +--
 clang/lib/CodeGen/CGRecordLayoutBuilder.cpp |   1 +
 clang/lib/Sema/SemaDeclAttr.cpp |  17 +
 clang/test/Layout/ms-no-unique-address.cpp  | 338 
 7 files changed, 540 insertions(+), 27 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index c95db7e8049d47a..23e56cda0f67e9d 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,13 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Spellings = [CXX11<"", "no_unique_address", 201803>,
+   CXX11<"msvc", "no_unique_address", 201803>];
+  let Accessors = [Accessor<"isDefault", [CXX11<"", "no_unique_address", 
201803>]>,
+   Accessor<"isMSVC", [CXX11<"msvc", "no_unique_address", 
201803>]>];
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index f11ea89d14bad0d..21e6373611272b5 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1405,6 +1405,10 @@ Example usage:
 
 ``[[no_unique_address]]`` is a standard C++20 attribute. Clang supports its use
 in C++11 onwards.
+
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability.
   }];
 }
 
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 60c80f2b075336b..d1770330070a519 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4505,6 +4505,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
   if (!CXXRD->isEmpty())
 return false;
 
+  // MS ABI: nonzero if class type with class type fields
+  if (Ctx.getTargetInfo().getCXXABI().isMicrosoft() &&
+  llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  })) {
+return false;
+  }
+
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
   // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..2152e69732d65c9 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2562,7 +2565,11 @@ struct MicrosoftRecordLayoutBuilder {
   void layoutNonVirtualBase(const CXXRecordDecl *RD,
 const CXXRecordDecl *BaseDecl,
 const ASTRecordLayout &BaseLayout,
-const ASTRecordLayout *&PreviousBaseLayout);
+const ASTRecordLayout *&PreviousBaseLayout,
+BaseSubobjectInfo *Base);
+  BaseSubobjectInfo *computeBaseSubobjectInfo(const CXXRecordDecl *RD,
+  bool IsVirtual,
+  BaseSubobjectInfo *Derived);
   void injectVFPtr(const CXXRecordDecl *RD);
   void injectVBPtr(const CXXRecordDecl *RD);
   /// Lays out the fields of the record.  Also rounds size up to
@@ -2595,6 +2602,12 @@ struct MicrosoftRecordLayoutBuilder {
   llvm::SmallPtrSetImpl &HasVtorDispSet,

[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits


@@ -4505,6 +4505,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
   if (!CXXRD->isEmpty())
 return false;
 
+  // MS ABI: nonzero if class type with class type fields

amykhuang wrote:

As far as I can tell the cases above still apply to MSVC so I think on 4489 
it's correct to account for both spellings. Not sure what you mean about the 
comment? The existing comment above the `isEmpty` line describes what that 
checks for

https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits


@@ -2999,17 +3139,17 @@ void MicrosoftRecordLayoutBuilder::layoutBitField(const 
FieldDecl *FD) {
 auto NewSize = Context.toCharUnitsFromBits(
 llvm::alignDown(FieldBitOffset, Context.toBits(Info.Alignment)) +
 Context.toBits(Info.Size));
-Size = std::max(Size, NewSize);
+DataSize = Size = std::max(Size, NewSize);

amykhuang wrote:

Removed cascading assignments

https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits

https://github.com/amykhuang updated 
https://github.com/llvm/llvm-project/pull/65675:

>From 923a43cd6386f6e57023fd8928eed0dc0ab04d57 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 21 Jul 2023 16:30:30 -0700
Subject: [PATCH 1/2] Implement [[msvc::no_unique_address]]

This attribute should match the behavior of MSVC's [[msvc::no_unique_address]] 
attribute.

Bug: https://github.com/llvm/llvm-project/issues/49358

Differential Revision: https://reviews.llvm.org/D157762
---
 clang/include/clang/Basic/Attr.td   |   8 +-
 clang/include/clang/Basic/AttrDocs.td   |   4 +
 clang/lib/AST/Decl.cpp  |   8 +
 clang/lib/AST/RecordLayoutBuilder.cpp   | 191 +--
 clang/lib/CodeGen/CGRecordLayoutBuilder.cpp |   1 +
 clang/lib/Sema/SemaDeclAttr.cpp |  17 +
 clang/test/Layout/ms-no-unique-address.cpp  | 338 
 7 files changed, 540 insertions(+), 27 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index c95db7e8049d47a..23e56cda0f67e9d 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,13 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Spellings = [CXX11<"", "no_unique_address", 201803>,
+   CXX11<"msvc", "no_unique_address", 201803>];
+  let Accessors = [Accessor<"isDefault", [CXX11<"", "no_unique_address", 
201803>]>,
+   Accessor<"isMSVC", [CXX11<"msvc", "no_unique_address", 
201803>]>];
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index f11ea89d14bad0d..21e6373611272b5 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1405,6 +1405,10 @@ Example usage:
 
 ``[[no_unique_address]]`` is a standard C++20 attribute. Clang supports its use
 in C++11 onwards.
+
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability.
   }];
 }
 
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 60c80f2b075336b..d1770330070a519 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4505,6 +4505,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
   if (!CXXRD->isEmpty())
 return false;
 
+  // MS ABI: nonzero if class type with class type fields
+  if (Ctx.getTargetInfo().getCXXABI().isMicrosoft() &&
+  llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  })) {
+return false;
+  }
+
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
   // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..2152e69732d65c9 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2562,7 +2565,11 @@ struct MicrosoftRecordLayoutBuilder {
   void layoutNonVirtualBase(const CXXRecordDecl *RD,
 const CXXRecordDecl *BaseDecl,
 const ASTRecordLayout &BaseLayout,
-const ASTRecordLayout *&PreviousBaseLayout);
+const ASTRecordLayout *&PreviousBaseLayout,
+BaseSubobjectInfo *Base);
+  BaseSubobjectInfo *computeBaseSubobjectInfo(const CXXRecordDecl *RD,
+  bool IsVirtual,
+  BaseSubobjectInfo *Derived);
   void injectVFPtr(const CXXRecordDecl *RD);
   void injectVBPtr(const CXXRecordDecl *RD);
   /// Lays out the fields of the record.  Also rounds size up to
@@ -2595,6 +2602,12 @@ struct MicrosoftRecordLayoutBuilder {
   llvm::SmallPtrSetImpl &HasVtorDispSet,

[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-12 Thread Amy Huang via cfe-commits


@@ -2937,14 +2964,97 @@ void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase(
   BaseOffset = CharUnits::Zero();
 } else {
   // Otherwise, lay the base out at the end of the MDC.
-  BaseOffset = Size = Size.alignTo(Info.Alignment);
+  BaseOffset = DataSize = Size = Size.alignTo(Info.Alignment);
 }
+
+// Place in EmptySubobjects map but don't check the position? MSVC seems to
+// not allow fields to overlap at the end of a virtual base, but they can
+// overlap with other bass.
+EmptySubobjects->CanPlaceBaseAtOffset(Base, BaseOffset);
   }
+
   Bases.insert(std::make_pair(BaseDecl, BaseOffset));
   Size += BaseLayout.getNonVirtualSize();
+  DataSize = Size;
   PreviousBaseLayout = &BaseLayout;
 }
 
+BaseSubobjectInfo *MicrosoftRecordLayoutBuilder::computeBaseSubobjectInfo(
+const CXXRecordDecl *RD, bool IsVirtual, BaseSubobjectInfo *Derived) {
+  // This is copied directly from 
ItaniumRecordLayoutBuilder::ComputeBaseSubobjectInfo.

amykhuang wrote:

Actually going to remove this altogether. Makes it less consistent with MSVC's 
behavior but MSVC appears to avoid overlapping fields with bases only when 
no_unique_address is used, which seems weird. 

https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-08 Thread Amy Huang via cfe-commits


@@ -3055,7 +3195,7 @@ void MicrosoftRecordLayoutBuilder::injectVBPtr(const 
CXXRecordDecl *RD) {
 // It is possible that there were no fields or bases located after vbptr,
 // so the size was not adjusted before.
 if (Size < FieldStart)
-  Size = FieldStart;
+  DataSize = Size = FieldStart;

amykhuang wrote:

I realized I can reduce the places that DataSize is set, and I think it's more 
readable this way? 

https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-08 Thread Amy Huang via cfe-commits

https://github.com/amykhuang resolved 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang edited 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang review_requested 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang review_requested 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang review_requested 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang labeled 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang review_requested 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang review_requested 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang review_requested 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang created 
https://github.com/llvm/llvm-project/pull/65675:

This implements the [[msvc::no_unique_address]] attribute.

There is not ABI compatibility in this patch because the attribute is 
relatively new and there's still some uncertainty in the MSVC version.

Bug: https://github.com/llvm/llvm-project/issues/49358

>From 923a43cd6386f6e57023fd8928eed0dc0ab04d57 Mon Sep 17 00:00:00 2001
From: Amy Huang 
Date: Fri, 21 Jul 2023 16:30:30 -0700
Subject: [PATCH] Implement [[msvc::no_unique_address]]

This attribute should match the behavior of MSVC's [[msvc::no_unique_address]] 
attribute.

Bug: https://github.com/llvm/llvm-project/issues/49358

Differential Revision: https://reviews.llvm.org/D157762
---
 clang/include/clang/Basic/Attr.td   |   8 +-
 clang/include/clang/Basic/AttrDocs.td   |   4 +
 clang/lib/AST/Decl.cpp  |   8 +
 clang/lib/AST/RecordLayoutBuilder.cpp   | 191 +--
 clang/lib/CodeGen/CGRecordLayoutBuilder.cpp |   1 +
 clang/lib/Sema/SemaDeclAttr.cpp |  17 +
 clang/test/Layout/ms-no-unique-address.cpp  | 338 
 7 files changed, 540 insertions(+), 27 deletions(-)
 create mode 100644 clang/test/Layout/ms-no-unique-address.cpp

diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index c95db7e8049d47a..23e56cda0f67e9d 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -1798,11 +1798,13 @@ def ArmMveStrictPolymorphism : TypeAttr, 
TargetSpecificAttr {
   let Documentation = [ArmMveStrictPolymorphismDocs];
 }
 
-def NoUniqueAddress : InheritableAttr, TargetSpecificAttr 
{
-  let Spellings = [CXX11<"", "no_unique_address", 201803>];
+def NoUniqueAddress : InheritableAttr {
+  let Spellings = [CXX11<"", "no_unique_address", 201803>,
+   CXX11<"msvc", "no_unique_address", 201803>];
+  let Accessors = [Accessor<"isDefault", [CXX11<"", "no_unique_address", 
201803>]>,
+   Accessor<"isMSVC", [CXX11<"msvc", "no_unique_address", 
201803>]>];
   let Subjects = SubjectList<[NonBitField], ErrorDiag>;
   let Documentation = [NoUniqueAddressDocs];
-  let SimpleHandler = 1;
 }
 
 def ReturnsTwice : InheritableAttr {
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index f11ea89d14bad0d..21e6373611272b5 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -1405,6 +1405,10 @@ Example usage:
 
 ``[[no_unique_address]]`` is a standard C++20 attribute. Clang supports its use
 in C++11 onwards.
+
+On MSVC targets, ``[[no_unique_address]]`` is ignored; use
+``[[msvc::no_unique_address]]`` instead. Currently there is no guarantee of ABI
+compatibility or stability.
   }];
 }
 
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 60c80f2b075336b..d1770330070a519 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -4505,6 +4505,14 @@ bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
   if (!CXXRD->isEmpty())
 return false;
 
+  // MS ABI: nonzero if class type with class type fields
+  if (Ctx.getTargetInfo().getCXXABI().isMicrosoft() &&
+  llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
+return Field->getType()->getAs();
+  })) {
+return false;
+  }
+
   // Otherwise, [...] the circumstances under which the object has zero size
   // are implementation-defined.
   // FIXME: This might be Itanium ABI specific; we don't yet know what the MS
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp 
b/clang/lib/AST/RecordLayoutBuilder.cpp
index 8afd88ae7be27b3..2152e69732d65c9 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2545,7 +2545,10 @@ struct MicrosoftRecordLayoutBuilder {
 CharUnits Alignment;
   };
   typedef llvm::DenseMap BaseOffsetsMapTy;
-  MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
+  MicrosoftRecordLayoutBuilder(const ASTContext &Context,
+   EmptySubobjectMap *EmptySubobjects)
+  : Context(Context), EmptySubobjects(EmptySubobjects) {}
+
 private:
   MicrosoftRecordLayoutBuilder(const MicrosoftRecordLayoutBuilder &) = delete;
   void operator=(const MicrosoftRecordLayoutBuilder &) = delete;
@@ -2562,7 +2565,11 @@ struct MicrosoftRecordLayoutBuilder {
   void layoutNonVirtualBase(const CXXRecordDecl *RD,
 const CXXRecordDecl *BaseDecl,
 const ASTRecordLayout &BaseLayout,
-const ASTRecordLayout *&PreviousBaseLayout);
+const ASTRecordLayout *&PreviousBaseLayout,
+BaseSubobjectInfo *Base);
+  BaseSubobjectInfo *computeBaseSubobjectInfo(const CXXRecordDecl *RD,
+  bool IsVirtual,
+  BaseSubobjectInfo *Derived);
   void i

[clang] Implement [[msvc::no_unique_address]] (PR #65675)

2023-09-07 Thread Amy Huang via cfe-commits

https://github.com/amykhuang labeled 
https://github.com/llvm/llvm-project/pull/65675
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 27dab4d - Reland "Try to implement lambdas with inalloca parameters by forwarding without use of inallocas."t

2023-07-26 Thread Amy Huang via cfe-commits

Author: Amy Huang
Date: 2023-07-26T16:13:36-07:00
New Revision: 27dab4d305acb6e0935e014c061c5317016ae2b3

URL: 
https://github.com/llvm/llvm-project/commit/27dab4d305acb6e0935e014c061c5317016ae2b3
DIFF: 
https://github.com/llvm/llvm-project/commit/27dab4d305acb6e0935e014c061c5317016ae2b3.diff

LOG: Reland "Try to implement lambdas with inalloca parameters by forwarding 
without use of inallocas."t

This reverts commit 8ed7aa59f489715d39d32e72a787b8e75cfda151.

Differential Revision: https://reviews.llvm.org/D154007

Added: 


Modified: 
clang/include/clang/CodeGen/CGFunctionInfo.h
clang/lib/CodeGen/CGCall.cpp
clang/lib/CodeGen/CGCall.h
clang/lib/CodeGen/CGClass.cpp
clang/lib/CodeGen/CGDeclCXX.cpp
clang/lib/CodeGen/CodeGenABITypes.cpp
clang/lib/CodeGen/CodeGenFunction.cpp
clang/lib/CodeGen/CodeGenFunction.h
clang/lib/CodeGen/CodeGenTypes.h
clang/lib/CodeGen/Targets/X86.cpp
clang/test/CodeGenCXX/inalloca-lambda.cpp

Removed: 




diff  --git a/clang/include/clang/CodeGen/CGFunctionInfo.h 
b/clang/include/clang/CodeGen/CGFunctionInfo.h
index 39c7a578c8c4e0..b8971d5793f361 100644
--- a/clang/include/clang/CodeGen/CGFunctionInfo.h
+++ b/clang/include/clang/CodeGen/CGFunctionInfo.h
@@ -567,6 +567,10 @@ class CGFunctionInfo final
   /// Whether this is a chain call.
   unsigned ChainCall : 1;
 
+  /// Whether this function is called by forwarding arguments.
+  /// This doesn't support inalloca or varargs.
+  unsigned DelegateCall : 1;
+
   /// Whether this function is a CMSE nonsecure call
   unsigned CmseNSCall : 1;
 
@@ -616,14 +620,11 @@ class CGFunctionInfo final
   CGFunctionInfo() : Required(RequiredArgs::All) {}
 
 public:
-  static CGFunctionInfo *create(unsigned llvmCC,
-bool instanceMethod,
-bool chainCall,
-const FunctionType::ExtInfo &extInfo,
-ArrayRef paramInfos,
-CanQualType resultType,
-ArrayRef argTypes,
-RequiredArgs required);
+  static CGFunctionInfo *
+  create(unsigned llvmCC, bool instanceMethod, bool chainCall,
+ bool delegateCall, const FunctionType::ExtInfo &extInfo,
+ ArrayRef paramInfos, CanQualType resultType,
+ ArrayRef argTypes, RequiredArgs required);
   void operator delete(void *p) { ::operator delete(p); }
 
   // Friending class TrailingObjects is apparently not good enough for MSVC,
@@ -663,6 +664,8 @@ class CGFunctionInfo final
 
   bool isChainCall() const { return ChainCall; }
 
+  bool isDelegateCall() const { return DelegateCall; }
+
   bool isCmseNSCall() const { return CmseNSCall; }
 
   bool isNoReturn() const { return NoReturn; }
@@ -749,6 +752,7 @@ class CGFunctionInfo final
 ID.AddInteger(getASTCallingConvention());
 ID.AddBoolean(InstanceMethod);
 ID.AddBoolean(ChainCall);
+ID.AddBoolean(DelegateCall);
 ID.AddBoolean(NoReturn);
 ID.AddBoolean(ReturnsRetained);
 ID.AddBoolean(NoCallerSavedRegs);
@@ -766,17 +770,16 @@ class CGFunctionInfo final
 for (const auto &I : arguments())
   I.type.Profile(ID);
   }
-  static void Profile(llvm::FoldingSetNodeID &ID,
-  bool InstanceMethod,
-  bool ChainCall,
+  static void Profile(llvm::FoldingSetNodeID &ID, bool InstanceMethod,
+  bool ChainCall, bool IsDelegateCall,
   const FunctionType::ExtInfo &info,
   ArrayRef paramInfos,
-  RequiredArgs required,
-  CanQualType resultType,
+  RequiredArgs required, CanQualType resultType,
   ArrayRef argTypes) {
 ID.AddInteger(info.getCC());
 ID.AddBoolean(InstanceMethod);
 ID.AddBoolean(ChainCall);
+ID.AddBoolean(IsDelegateCall);
 ID.AddBoolean(info.getNoReturn());
 ID.AddBoolean(info.getProducesResult());
 ID.AddBoolean(info.getNoCallerSavedRegs());

diff  --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index bd272e016e9267..51f43b0797fd0f 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -112,8 +112,7 @@ 
CodeGenTypes::arrangeFreeFunctionType(CanQual FTNP) {
   // When translating an unprototyped function type, always use a
   // variadic type.
   return arrangeLLVMFunctionInfo(FTNP->getReturnType().getUnqualifiedType(),
- /*instanceMethod=*/false,
- /*chainCall=*/false, std::nullopt,
+ FnInfoOpts::None, std::nullopt,
  FTNP->getExtInfo(), {}, RequiredArgs(0));
 }
 
@@ -189,10 +188,10 @@ arrangeLLVMFunctionInfo(CodeGenTypes &CGT, bool 
instanceMethod,
   appendParameterTypes(CGT, prefix, paramIn

  1   2   >