From f6a5f91a54fe18ee77325c8e6bd2fc1fb935cd1e Mon Sep 17 00:00:00 2001 From: YexuanXiao Date: Fri, 2 May 2025 09:12:08 +0800 Subject: [PATCH 01/15] Fix #5453 to enable handling of over 64 processors [`GetActiveProcessorCount`](https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-getactiveprocessorcount) [Raymond Chen's claim](https://devblogs.microsoft.com/oldnewthing/20200824-00/?p=104116) --- stl/src/cthread.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 731f9296cb4..79fb7994b82 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -103,9 +103,7 @@ _CRTIMP2_PURE _Thrd_id_t __cdecl _Thrd_id() noexcept { // return unique id for c } _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // return number of processors - SYSTEM_INFO info; - GetNativeSystemInfo(&info); - return info.dwNumberOfProcessors; + return GetActiveProcessorCount(ALL_PROCESSOR_GROUPS); } // TRANSITION, ABI: _Thrd_create() is preserved for binary compatibility From 968f5d1e0da0ffc1891989e0659f01ec5e4ae2db Mon Sep 17 00:00:00 2001 From: YexuanXiao Date: Sat, 3 May 2025 23:57:42 +0800 Subject: [PATCH 02/15] Use GetLogicalProcessorInformationEx --- stl/src/cthread.cpp | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 79fb7994b82..677b4eb05a4 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -103,7 +103,45 @@ _CRTIMP2_PURE _Thrd_id_t __cdecl _Thrd_id() noexcept { // return unique id for c } _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // return number of processors - return GetActiveProcessorCount(ALL_PROCESSOR_GROUPS); + // Most devices have only one processor group and thus have the same buffer_size +#if defined(_M_X64) || defined(_M_ARM64) // 16 bytes per group + constexpr int stack_buffer_size = 48; +#elif defined(_M_IX86) || defined(_M_ARM) // 12 bytes per group + constexpr int stack_buffer_size = 44; +#else + constexpr int stack_buffer_size = 0; +#endif + unsigned char buffer[stack_buffer_size]; + using buffer_ptr_t = PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; + DWORD buffer_size = stack_buffer_size; + + const auto try_query = [](buffer_ptr_t buffer_ptr, PDWORD buffer_size) _STATIC_CALL_OPERATOR { + unsigned int count = 0; + _ASSERT(buffer_ptr != nullptr); + + if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, buffer_size) == TRUE) { + for (WORD i = 0; i != buffer_ptr->Processor.GroupCount; ++i) { + // Mask is 8 bytes on ARM64 and X64, and 4 bytes on X86 and ARM32. + count += std::popcount(buffer_ptr->Processor.GroupMask[i].Mask); + } + } + + return count; + }; + + if (auto count = try_query(reinterpret_cast(&buffer), &buffer_size); count != 0) { + return count; + } + + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { + _STD unique_ptr new_buffer(::new (_STD nothrow) unsigned char[buffer_size]); + + if (new_buffer != nullptr) { + return try_query(reinterpret_cast(new_buffer.get()), &buffer_size); + } + } + + return 0; } // TRANSITION, ABI: _Thrd_create() is preserved for binary compatibility From c8f3af4221f2a55878b4a87e26de521b33676671 Mon Sep 17 00:00:00 2001 From: YexuanXiao Date: Sun, 4 May 2025 00:02:16 +0800 Subject: [PATCH 03/15] Add missing header files --- stl/src/cthread.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 677b4eb05a4..8c7b35ac650 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -1,10 +1,12 @@ // Copyright (c) Microsoft Corporation. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +#include #include #include #include #include +#include #include #include From 66016db8a05898ca9ed012d8f6ea503ceff19ca2 Mon Sep 17 00:00:00 2001 From: YexuanXiao Date: Sun, 4 May 2025 00:23:46 +0800 Subject: [PATCH 04/15] Align the stack buffer and add noexcept to the lambda --- stl/src/cthread.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 8c7b35ac650..80642504eec 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -113,17 +113,17 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re #else constexpr int stack_buffer_size = 0; #endif - unsigned char buffer[stack_buffer_size]; + alignas(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) unsigned char buffer[stack_buffer_size]; using buffer_ptr_t = PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; DWORD buffer_size = stack_buffer_size; - const auto try_query = [](buffer_ptr_t buffer_ptr, PDWORD buffer_size) _STATIC_CALL_OPERATOR { + const auto try_query = [](buffer_ptr_t buffer_ptr, PDWORD buffer_size) _STATIC_CALL_OPERATOR noexcept { unsigned int count = 0; _ASSERT(buffer_ptr != nullptr); if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, buffer_size) == TRUE) { for (WORD i = 0; i != buffer_ptr->Processor.GroupCount; ++i) { - // Mask is 8 bytes on ARM64 and X64, and 4 bytes on X86 and ARM32. + // Mask is 8 bytes on ARM64 and X64, and 4 bytes on X86 and ARM32 count += std::popcount(buffer_ptr->Processor.GroupMask[i].Mask); } } From 27fc44e462eac448da6113670a8183fcea8158bf Mon Sep 17 00:00:00 2001 From: YexuanXiao Date: Sun, 4 May 2025 01:50:08 +0800 Subject: [PATCH 05/15] Use the #error directive to report unknown architectures --- stl/src/cthread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 80642504eec..ab2dc8efad2 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -111,7 +111,7 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re #elif defined(_M_IX86) || defined(_M_ARM) // 12 bytes per group constexpr int stack_buffer_size = 44; #else - constexpr int stack_buffer_size = 0; +#error Unknown architecture #endif alignas(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) unsigned char buffer[stack_buffer_size]; using buffer_ptr_t = PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; From 924ea74bae22d83e4a1586688c22f57f68f8eed7 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 8 May 2025 02:03:03 -0700 Subject: [PATCH 06/15] Consistency: `std::` => `_STD` --- stl/src/cthread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index ab2dc8efad2..166552ae26f 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -124,7 +124,7 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, buffer_size) == TRUE) { for (WORD i = 0; i != buffer_ptr->Processor.GroupCount; ++i) { // Mask is 8 bytes on ARM64 and X64, and 4 bytes on X86 and ARM32 - count += std::popcount(buffer_ptr->Processor.GroupMask[i].Mask); + count += _STD popcount(buffer_ptr->Processor.GroupMask[i].Mask); } } From 3494728654d82bfa7ba0c958cbc092b2c820263f Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 8 May 2025 02:08:36 -0700 Subject: [PATCH 07/15] Directly test the `BOOL` returned by `GetLogicalProcessorInformationEx`. --- stl/src/cthread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 166552ae26f..0c31bdf7381 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -121,7 +121,7 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re unsigned int count = 0; _ASSERT(buffer_ptr != nullptr); - if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, buffer_size) == TRUE) { + if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, buffer_size)) { for (WORD i = 0; i != buffer_ptr->Processor.GroupCount; ++i) { // Mask is 8 bytes on ARM64 and X64, and 4 bytes on X86 and ARM32 count += _STD popcount(buffer_ptr->Processor.GroupMask[i].Mask); From dad053ab05773a81fbf0b1f69cf0acc7d1343a3a Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 8 May 2025 02:15:55 -0700 Subject: [PATCH 08/15] Drop comment about the size of `Mask`; `popcount` handles this. --- stl/src/cthread.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 0c31bdf7381..da5d554fe39 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -123,7 +123,6 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, buffer_size)) { for (WORD i = 0; i != buffer_ptr->Processor.GroupCount; ++i) { - // Mask is 8 bytes on ARM64 and X64, and 4 bytes on X86 and ARM32 count += _STD popcount(buffer_ptr->Processor.GroupMask[i].Mask); } } From 0cf6aa25285924f20b74b05632cc505f81881e19 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 8 May 2025 02:32:13 -0700 Subject: [PATCH 09/15] Detect 64-bit / 32-bit variation with `_WIN64`. --- stl/src/cthread.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index da5d554fe39..7249e3e5e45 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -106,13 +106,12 @@ _CRTIMP2_PURE _Thrd_id_t __cdecl _Thrd_id() noexcept { // return unique id for c _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // return number of processors // Most devices have only one processor group and thus have the same buffer_size -#if defined(_M_X64) || defined(_M_ARM64) // 16 bytes per group - constexpr int stack_buffer_size = 48; -#elif defined(_M_IX86) || defined(_M_ARM) // 12 bytes per group - constexpr int stack_buffer_size = 44; -#else -#error Unknown architecture -#endif +#ifdef _WIN64 + constexpr int stack_buffer_size = 48; // 16 bytes per group +#else // ^^^ 64-bit / 32-bit vvv + constexpr int stack_buffer_size = 44; // 12 bytes per group +#endif // ^^^ 32-bit ^^^ + alignas(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) unsigned char buffer[stack_buffer_size]; using buffer_ptr_t = PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; DWORD buffer_size = stack_buffer_size; From c9e6c963bc4ccc658b248779a9b5545e4b29c7f3 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 8 May 2025 03:10:07 -0700 Subject: [PATCH 10/15] Restructure control flow with a loop instead of a lambda. This clearly establishes a loop invariant that `buffer_ptr` is non-null, so we don't need to assert it (whereas in the lambda, the assertion was more useful). Now we only need the type `PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX` twice, so we don't need to introduce an alias `buffer_ptr_t`. This eliminates the (confusing to me) difference between `DWORD buffer_size` outside and `PDWORD buffer_size` inside the lambda. We can now scope `unsigned int count = 0;` to the successful case where we need it. In my opinion, this makes the possible function exits clearer, because they're tested in a flat sequence: we succeed, we experience a true failure, or we can't allocate. --- stl/src/cthread.cpp | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 7249e3e5e45..42477b05153 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -113,35 +113,31 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re #endif // ^^^ 32-bit ^^^ alignas(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) unsigned char buffer[stack_buffer_size]; - using buffer_ptr_t = PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; - DWORD buffer_size = stack_buffer_size; + auto buffer_ptr = reinterpret_cast(&buffer); + DWORD buffer_size = stack_buffer_size; + _STD unique_ptr new_buffer; - const auto try_query = [](buffer_ptr_t buffer_ptr, PDWORD buffer_size) _STATIC_CALL_OPERATOR noexcept { - unsigned int count = 0; - _ASSERT(buffer_ptr != nullptr); - - if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, buffer_size)) { + for (;;) { + if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, &buffer_size)) { + unsigned int count = 0; for (WORD i = 0; i != buffer_ptr->Processor.GroupCount; ++i) { count += _STD popcount(buffer_ptr->Processor.GroupMask[i].Mask); } + return count; } - return count; - }; - - if (auto count = try_query(reinterpret_cast(&buffer), &buffer_size); count != 0) { - return count; - } + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + return 0; + } - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { - _STD unique_ptr new_buffer(::new (_STD nothrow) unsigned char[buffer_size]); + new_buffer.reset(::new (_STD nothrow) unsigned char[buffer_size]); - if (new_buffer != nullptr) { - return try_query(reinterpret_cast(new_buffer.get()), &buffer_size); + if (!new_buffer) { + return 0; } - } - return 0; + buffer_ptr = reinterpret_cast(new_buffer.get()); + } } // TRANSITION, ABI: _Thrd_create() is preserved for binary compatibility From 2f05336e5bb5edfe62c8c263570035f7f2fffbb5 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 8 May 2025 03:11:43 -0700 Subject: [PATCH 11/15] `buffer` => `stack_buffer` --- stl/src/cthread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 42477b05153..4535ccfe845 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -112,8 +112,8 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re constexpr int stack_buffer_size = 44; // 12 bytes per group #endif // ^^^ 32-bit ^^^ - alignas(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) unsigned char buffer[stack_buffer_size]; - auto buffer_ptr = reinterpret_cast(&buffer); + alignas(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) unsigned char stack_buffer[stack_buffer_size]; + auto buffer_ptr = reinterpret_cast(&stack_buffer); DWORD buffer_size = stack_buffer_size; _STD unique_ptr new_buffer; From da4724c92fc7544cc064b36e4c711280f843626a Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 8 May 2025 03:13:26 -0700 Subject: [PATCH 12/15] `count` => `logical_processors` --- stl/src/cthread.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 4535ccfe845..0c8badf902e 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -119,11 +119,11 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re for (;;) { if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, &buffer_size)) { - unsigned int count = 0; + unsigned int logical_processors = 0; for (WORD i = 0; i != buffer_ptr->Processor.GroupCount; ++i) { - count += _STD popcount(buffer_ptr->Processor.GroupMask[i].Mask); + logical_processors += _STD popcount(buffer_ptr->Processor.GroupMask[i].Mask); } - return count; + return logical_processors; } if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { From 06b7eae58afc7a97c7c7bd628b8379bc6ddafb60 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 8 May 2025 04:02:38 -0700 Subject: [PATCH 13/15] Handle multiple sockets. --- stl/src/cthread.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 0c8badf902e..53c9928b4b5 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -113,16 +113,27 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re #endif // ^^^ 32-bit ^^^ alignas(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) unsigned char stack_buffer[stack_buffer_size]; - auto buffer_ptr = reinterpret_cast(&stack_buffer); - DWORD buffer_size = stack_buffer_size; + unsigned char* buffer_ptr = stack_buffer; + DWORD buffer_size = stack_buffer_size; _STD unique_ptr new_buffer; for (;;) { - if (GetLogicalProcessorInformationEx(RelationProcessorPackage, buffer_ptr, &buffer_size)) { + if (GetLogicalProcessorInformationEx(RelationProcessorPackage, + reinterpret_cast(buffer_ptr), &buffer_size)) { unsigned int logical_processors = 0; - for (WORD i = 0; i != buffer_ptr->Processor.GroupCount; ++i) { - logical_processors += _STD popcount(buffer_ptr->Processor.GroupMask[i].Mask); + + while (buffer_size > 0) { + const auto structure_ptr = reinterpret_cast(buffer_ptr); + const auto structure_size = structure_ptr->Size; + + for (WORD i = 0; i != structure_ptr->Processor.GroupCount; ++i) { + logical_processors += _STD popcount(structure_ptr->Processor.GroupMask[i].Mask); + } + + buffer_ptr += structure_size; + buffer_size -= structure_size; } + return logical_processors; } @@ -136,7 +147,7 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re return 0; } - buffer_ptr = reinterpret_cast(new_buffer.get()); + buffer_ptr = new_buffer.get(); } } From 29bb4fe524015a301bd54cbe5f2bc7be74e3c9b2 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 8 May 2025 04:22:18 -0700 Subject: [PATCH 14/15] Add comments. --- stl/src/cthread.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/stl/src/cthread.cpp b/stl/src/cthread.cpp index 53c9928b4b5..f4e53aaaf99 100644 --- a/stl/src/cthread.cpp +++ b/stl/src/cthread.cpp @@ -105,7 +105,7 @@ _CRTIMP2_PURE _Thrd_id_t __cdecl _Thrd_id() noexcept { // return unique id for c } _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // return number of processors - // Most devices have only one processor group and thus have the same buffer_size + // Most devices have only one processor group and thus have the same buffer_size. #ifdef _WIN64 constexpr int stack_buffer_size = 48; // 16 bytes per group #else // ^^^ 64-bit / 32-bit vvv @@ -117,19 +117,24 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re DWORD buffer_size = stack_buffer_size; _STD unique_ptr new_buffer; + // https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getlogicalprocessorinformationex + // The buffer "receives a sequence of variable-sized SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX structures". for (;;) { if (GetLogicalProcessorInformationEx(RelationProcessorPackage, reinterpret_cast(buffer_ptr), &buffer_size)) { unsigned int logical_processors = 0; while (buffer_size > 0) { + // Each structure in the buffer describes a processor package (aka socket)... const auto structure_ptr = reinterpret_cast(buffer_ptr); const auto structure_size = structure_ptr->Size; + // ... which contains one or more processor groups. for (WORD i = 0; i != structure_ptr->Processor.GroupCount; ++i) { logical_processors += _STD popcount(structure_ptr->Processor.GroupMask[i].Mask); } + // Step forward to the next structure in the buffer. buffer_ptr += structure_size; buffer_size -= structure_size; } @@ -138,13 +143,13 @@ _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept { // re } if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - return 0; + return 0; // API failure } new_buffer.reset(::new (_STD nothrow) unsigned char[buffer_size]); if (!new_buffer) { - return 0; + return 0; // allocation failure } buffer_ptr = new_buffer.get(); From c4c52f02e55cebf82193bd37bae6d76311c49a3c Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 9 May 2025 14:49:09 -0700 Subject: [PATCH 15/15] Fix the ARM64EC internal build. --- stl/msbuild/stl_base/msvcp.settings.targets | 1 + 1 file changed, 1 insertion(+) diff --git a/stl/msbuild/stl_base/msvcp.settings.targets b/stl/msbuild/stl_base/msvcp.settings.targets index ea0f763c3da..825cf4929eb 100644 --- a/stl/msbuild/stl_base/msvcp.settings.targets +++ b/stl/msbuild/stl_base/msvcp.settings.targets @@ -71,6 +71,7 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +