VerifierTest.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // VerifierTest.cpp //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // //
  9. ///////////////////////////////////////////////////////////////////////////////
  10. #include <memory>
  11. #include <vector>
  12. #include <string>
  13. #include "CompilationResult.h"
  14. #include "HLSLTestData.h"
  15. #include "llvm/Support/ManagedStatic.h"
  16. #include "dxc/Support/HLSLOptions.h"
  17. #include "llvm/Support/FileSystem.h"
  18. #include <fstream>
  19. #include "WexTestClass.h"
  20. #include "HlslTestUtils.h"
  21. using namespace std;
  22. MODULE_SETUP(TestModuleSetup);
  23. MODULE_CLEANUP(TestModuleCleanup);
  24. // The test fixture.
  25. class VerifierTest
  26. {
  27. public:
  28. BEGIN_TEST_CLASS(VerifierTest)
  29. TEST_CLASS_PROPERTY(L"Parallel", L"true")
  30. TEST_METHOD_PROPERTY(L"Priority", L"0")
  31. END_TEST_CLASS()
  32. TEST_METHOD(RunAttributes);
  33. TEST_METHOD(RunConstExpr);
  34. TEST_METHOD(RunConstAssign);
  35. TEST_METHOD(RunConstDefault);
  36. TEST_METHOD(RunCppErrors);
  37. TEST_METHOD(RunCXX11Attributes);
  38. TEST_METHOD(RunEnums);
  39. TEST_METHOD(RunFunctions);
  40. TEST_METHOD(RunIndexingOperator);
  41. TEST_METHOD(RunIntrinsicExamples);
  42. TEST_METHOD(RunMatrixAssignments);
  43. TEST_METHOD(RunMatrixSyntax);
  44. TEST_METHOD(RunMatrixSyntaxExactPrecision);
  45. TEST_METHOD(RunMoreOperators);
  46. TEST_METHOD(RunObjectOperators);
  47. TEST_METHOD(RunPackReg);
  48. TEST_METHOD(RunRayTracings);
  49. TEST_METHOD(RunScalarAssignments);
  50. TEST_METHOD(RunScalarAssignmentsExactPrecision);
  51. TEST_METHOD(RunScalarOperatorsAssign);
  52. TEST_METHOD(RunScalarOperatorsAssignExactPrecision);
  53. TEST_METHOD(RunScalarOperators);
  54. TEST_METHOD(RunScalarOperatorsExactPrecision);
  55. TEST_METHOD(RunString);
  56. TEST_METHOD(RunStructAssignments);
  57. TEST_METHOD(RunTemplateChecks);
  58. TEST_METHOD(RunVarmodsSyntax);
  59. TEST_METHOD(RunVectorAssignments);
  60. TEST_METHOD(RunVectorSyntaxMix);
  61. TEST_METHOD(RunVectorSyntax);
  62. TEST_METHOD(RunVectorSyntaxExactPrecision);
  63. TEST_METHOD(RunTypemodsSyntax);
  64. TEST_METHOD(RunSemantics);
  65. TEST_METHOD(RunImplicitCasts);
  66. TEST_METHOD(RunDerivedToBaseCasts);
  67. TEST_METHOD(RunLiterals);
  68. TEST_METHOD(RunEffectsSyntax);
  69. TEST_METHOD(RunVectorConditional);
  70. TEST_METHOD(RunUint4Add3);
  71. TEST_METHOD(RunBadInclude);
  72. TEST_METHOD(RunWave);
  73. void CheckVerifies(const wchar_t* path) {
  74. WEX::TestExecution::SetVerifyOutput verifySettings(WEX::TestExecution::VerifyOutputSettings::LogOnlyFailures);
  75. const char startMarker[] = "%clang_cc1";
  76. const char endMarker[] = "%s";
  77. char firstLine[200];
  78. memset(firstLine, 0, sizeof(firstLine));
  79. char* commandLine;
  80. //
  81. // Very simple processing for now.
  82. // See utils\lit\lit\TestRunner.py for the more thorough implementation.
  83. //
  84. // The first line for HLSL tests will always look like this:
  85. // // RUN: %clang_cc1 -fsyntax-only -Wno-unused-value -ffreestanding -verify %s
  86. //
  87. // We turn this into ' -fsyntax-only -Wno-unused-value -ffreestanding -verify ' by offseting after %clang_cc1
  88. // and chopping off everything after '%s'.
  89. //
  90. {
  91. ifstream infile(path);
  92. ASSERT_EQ(false, infile.bad());
  93. infile.getline(firstLine, _countof(firstLine));
  94. char* found = strstr(firstLine, startMarker);
  95. ASSERT_NE(nullptr, found);
  96. commandLine = found + strlen(startMarker);
  97. char* fileArgument = strstr(commandLine, endMarker);
  98. ASSERT_NE(nullptr, fileArgument);
  99. *fileArgument = '\0';
  100. }
  101. CW2A asciiPath(path);
  102. CompilationResult result = CompilationResult::CreateForCommandLine(commandLine, asciiPath);
  103. if (!result.ParseSucceeded()) {
  104. std::stringstream ss;
  105. ss << "for program " << asciiPath << " with errors:\n" << result.GetTextForErrors();
  106. CA2W pszW(ss.str().c_str());
  107. ::WEX::Logging::Log::Comment(pszW);
  108. }
  109. VERIFY_IS_TRUE(result.ParseSucceeded());
  110. }
  111. void CheckVerifiesHLSL(LPCWSTR name) {
  112. // Having a test per file makes it very easy to filter from the command line.
  113. CheckVerifies(hlsl_test::GetPathToHlslDataFile(name).c_str());
  114. }
  115. };
  116. bool TestModuleSetup() {
  117. if (llvm::sys::fs::SetupPerThreadFileSystem())
  118. return false;
  119. // Use this module-level function to set up LLVM dependencies.
  120. if (hlsl::options::initHlslOptTable()) {
  121. return false;
  122. }
  123. return true;
  124. }
  125. bool TestModuleCleanup() {
  126. // Use this module-level function to set up LLVM dependencies.
  127. // In particular, clean up managed static allocations used by
  128. // parsing options with the LLVM library.
  129. ::hlsl::options::cleanupHlslOptTable();
  130. llvm::sys::fs::CleanupPerThreadFileSystem();
  131. ::llvm::llvm_shutdown();
  132. return true;
  133. }
  134. TEST_F(VerifierTest, RunAttributes) {
  135. CheckVerifiesHLSL(L"attributes.hlsl");
  136. }
  137. TEST_F(VerifierTest, RunConstExpr) {
  138. CheckVerifiesHLSL(L"const-expr.hlsl");
  139. }
  140. TEST_F(VerifierTest, RunConstAssign) {
  141. CheckVerifiesHLSL(L"const-assign.hlsl");
  142. }
  143. TEST_F(VerifierTest, RunConstDefault) {
  144. CheckVerifiesHLSL(L"const-default.hlsl");
  145. }
  146. TEST_F(VerifierTest, RunCppErrors) {
  147. CheckVerifiesHLSL(L"cpp-errors.hlsl");
  148. }
  149. TEST_F(VerifierTest, RunCXX11Attributes) {
  150. CheckVerifiesHLSL(L"cxx11-attributes.hlsl");
  151. }
  152. TEST_F(VerifierTest, RunEnums) {
  153. CheckVerifiesHLSL(L"enums.hlsl");
  154. }
  155. TEST_F(VerifierTest, RunFunctions) {
  156. CheckVerifiesHLSL(L"functions.hlsl");
  157. }
  158. TEST_F(VerifierTest, RunIndexingOperator) {
  159. CheckVerifiesHLSL(L"indexing-operator.hlsl");
  160. }
  161. TEST_F(VerifierTest, RunIntrinsicExamples) {
  162. CheckVerifiesHLSL(L"intrinsic-examples.hlsl");
  163. }
  164. TEST_F(VerifierTest, RunMatrixAssignments) {
  165. CheckVerifiesHLSL(L"matrix-assignments.hlsl");
  166. }
  167. TEST_F(VerifierTest, RunMatrixSyntax) {
  168. CheckVerifiesHLSL(L"matrix-syntax.hlsl");
  169. }
  170. TEST_F(VerifierTest, RunMatrixSyntaxExactPrecision) {
  171. CheckVerifiesHLSL(L"matrix-syntax-exact-precision.hlsl");
  172. }
  173. TEST_F(VerifierTest, RunMoreOperators) {
  174. CheckVerifiesHLSL(L"more-operators.hlsl");
  175. }
  176. TEST_F(VerifierTest, RunObjectOperators) {
  177. CheckVerifiesHLSL(L"object-operators.hlsl");
  178. }
  179. TEST_F(VerifierTest, RunPackReg) {
  180. CheckVerifiesHLSL(L"packreg.hlsl");
  181. }
  182. TEST_F(VerifierTest, RunRayTracings) {
  183. CheckVerifiesHLSL(L"raytracings.hlsl");
  184. }
  185. TEST_F(VerifierTest, RunScalarAssignments) {
  186. CheckVerifiesHLSL(L"scalar-assignments.hlsl");
  187. }
  188. TEST_F(VerifierTest, RunScalarAssignmentsExactPrecision) {
  189. CheckVerifiesHLSL(L"scalar-assignments-exact-precision.hlsl");
  190. }
  191. TEST_F(VerifierTest, RunScalarOperatorsAssign) {
  192. CheckVerifiesHLSL(L"scalar-operators-assign.hlsl");
  193. }
  194. TEST_F(VerifierTest, RunScalarOperatorsAssignExactPrecision) {
  195. CheckVerifiesHLSL(L"scalar-operators-assign-exact-precision.hlsl");
  196. }
  197. TEST_F(VerifierTest, RunScalarOperators) {
  198. CheckVerifiesHLSL(L"scalar-operators.hlsl");
  199. }
  200. TEST_F(VerifierTest, RunScalarOperatorsExactPrecision) {
  201. CheckVerifiesHLSL(L"scalar-operators-exact-precision.hlsl");
  202. }
  203. TEST_F(VerifierTest, RunString) {
  204. CheckVerifiesHLSL(L"string.hlsl");
  205. }
  206. TEST_F(VerifierTest, RunStructAssignments) {
  207. CheckVerifiesHLSL(L"struct-assignments.hlsl");
  208. }
  209. TEST_F(VerifierTest, RunTemplateChecks) {
  210. CheckVerifiesHLSL(L"template-checks.hlsl");
  211. }
  212. TEST_F(VerifierTest, RunVarmodsSyntax) {
  213. CheckVerifiesHLSL(L"varmods-syntax.hlsl");
  214. }
  215. TEST_F(VerifierTest, RunVectorAssignments) {
  216. CheckVerifiesHLSL(L"vector-assignments.hlsl");
  217. }
  218. TEST_F(VerifierTest, RunVectorSyntaxMix) {
  219. CheckVerifiesHLSL(L"vector-syntax-mix.hlsl");
  220. }
  221. TEST_F(VerifierTest, RunVectorSyntax) {
  222. CheckVerifiesHLSL(L"vector-syntax.hlsl");
  223. }
  224. TEST_F(VerifierTest, RunVectorSyntaxExactPrecision) {
  225. CheckVerifiesHLSL(L"vector-syntax-exact-precision.hlsl");
  226. }
  227. TEST_F(VerifierTest, RunTypemodsSyntax) {
  228. CheckVerifiesHLSL(L"typemods-syntax.hlsl");
  229. }
  230. TEST_F(VerifierTest, RunSemantics) {
  231. CheckVerifiesHLSL(L"semantics.hlsl");
  232. }
  233. TEST_F(VerifierTest, RunImplicitCasts) {
  234. CheckVerifiesHLSL(L"implicit-casts.hlsl");
  235. }
  236. TEST_F(VerifierTest, RunDerivedToBaseCasts) {
  237. CheckVerifiesHLSL(L"derived-to-base.hlsl");
  238. }
  239. TEST_F(VerifierTest, RunLiterals) {
  240. CheckVerifiesHLSL(L"literals.hlsl");
  241. }
  242. TEST_F(VerifierTest, RunEffectsSyntax) {
  243. CheckVerifiesHLSL(L"effects-syntax.hlsl");
  244. }
  245. TEST_F(VerifierTest, RunVectorConditional) {
  246. CheckVerifiesHLSL(L"vector-conditional.hlsl");
  247. }
  248. TEST_F(VerifierTest, RunUint4Add3) {
  249. CheckVerifiesHLSL(L"uint4_add3.hlsl");
  250. }
  251. TEST_F(VerifierTest, RunBadInclude) {
  252. CheckVerifiesHLSL(L"bad-include.hlsl");
  253. }
  254. TEST_F(VerifierTest, RunWave) {
  255. CheckVerifiesHLSL(L"wave.hlsl");
  256. }