HLSL uses Microsoft-style attributes [attr], which clang mostly
ignores. For HLSL we need to handle known Microsoft attributes, and to
maintain C/C++ as-is we ignore unknown attributes.
To utilize this new code path, this change adds the HLSL numthreads
attribute.
I think it would be fair to link to the Microsoft docs here:
https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/sm5-attributes-numthreads
We've done this elsewhere for Microsoft attributes.