ext_inst.cldebug100_test.cpp 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070
  1. // Copyright (c) 2017-2019 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <string>
  15. #include <vector>
  16. #include "OpenCLDebugInfo100.h"
  17. #include "gmock/gmock.h"
  18. #include "source/util/string_utils.h"
  19. #include "test/test_fixture.h"
  20. #include "test/unit_spirv.h"
  21. // This file tests the correctness of encoding and decoding of instructions
  22. // involving the OpenCL.DebugInfo.100 extended instruction set.
  23. // Validation is not checked here.
  24. namespace spvtools {
  25. namespace {
  26. using spvtest::Concatenate;
  27. using spvtest::MakeInstruction;
  28. using testing::Eq;
  29. using utils::MakeVector;
  30. // Test values of enums vs. what is written in the spec.
  31. TEST(ExtInstCLDebugInfo, InstructionValues) {
  32. EXPECT_EQ(0, OpenCLDebugInfo100DebugInfoNone);
  33. EXPECT_EQ(1, OpenCLDebugInfo100DebugCompilationUnit);
  34. EXPECT_EQ(2, OpenCLDebugInfo100DebugTypeBasic);
  35. EXPECT_EQ(3, OpenCLDebugInfo100DebugTypePointer);
  36. EXPECT_EQ(4, OpenCLDebugInfo100DebugTypeQualifier);
  37. EXPECT_EQ(5, OpenCLDebugInfo100DebugTypeArray);
  38. EXPECT_EQ(6, OpenCLDebugInfo100DebugTypeVector);
  39. EXPECT_EQ(7, OpenCLDebugInfo100DebugTypedef);
  40. EXPECT_EQ(8, OpenCLDebugInfo100DebugTypeFunction);
  41. EXPECT_EQ(9, OpenCLDebugInfo100DebugTypeEnum);
  42. EXPECT_EQ(10, OpenCLDebugInfo100DebugTypeComposite);
  43. EXPECT_EQ(11, OpenCLDebugInfo100DebugTypeMember);
  44. EXPECT_EQ(12, OpenCLDebugInfo100DebugTypeInheritance);
  45. EXPECT_EQ(13, OpenCLDebugInfo100DebugTypePtrToMember);
  46. EXPECT_EQ(14, OpenCLDebugInfo100DebugTypeTemplate);
  47. EXPECT_EQ(15, OpenCLDebugInfo100DebugTypeTemplateParameter);
  48. EXPECT_EQ(16, OpenCLDebugInfo100DebugTypeTemplateTemplateParameter);
  49. EXPECT_EQ(17, OpenCLDebugInfo100DebugTypeTemplateParameterPack);
  50. EXPECT_EQ(18, OpenCLDebugInfo100DebugGlobalVariable);
  51. EXPECT_EQ(19, OpenCLDebugInfo100DebugFunctionDeclaration);
  52. EXPECT_EQ(20, OpenCLDebugInfo100DebugFunction);
  53. EXPECT_EQ(21, OpenCLDebugInfo100DebugLexicalBlock);
  54. EXPECT_EQ(22, OpenCLDebugInfo100DebugLexicalBlockDiscriminator);
  55. EXPECT_EQ(23, OpenCLDebugInfo100DebugScope);
  56. EXPECT_EQ(24, OpenCLDebugInfo100DebugNoScope);
  57. EXPECT_EQ(25, OpenCLDebugInfo100DebugInlinedAt);
  58. EXPECT_EQ(26, OpenCLDebugInfo100DebugLocalVariable);
  59. EXPECT_EQ(27, OpenCLDebugInfo100DebugInlinedVariable);
  60. EXPECT_EQ(28, OpenCLDebugInfo100DebugDeclare);
  61. EXPECT_EQ(29, OpenCLDebugInfo100DebugValue);
  62. EXPECT_EQ(30, OpenCLDebugInfo100DebugOperation);
  63. EXPECT_EQ(31, OpenCLDebugInfo100DebugExpression);
  64. EXPECT_EQ(32, OpenCLDebugInfo100DebugMacroDef);
  65. EXPECT_EQ(33, OpenCLDebugInfo100DebugMacroUndef);
  66. EXPECT_EQ(34, OpenCLDebugInfo100DebugImportedEntity);
  67. EXPECT_EQ(35, OpenCLDebugInfo100DebugSource);
  68. }
  69. TEST(ExtInstCLDebugInfo, InfoFlagValues) {
  70. EXPECT_EQ(1 << 0, OpenCLDebugInfo100FlagIsProtected);
  71. EXPECT_EQ(1 << 1, OpenCLDebugInfo100FlagIsPrivate);
  72. EXPECT_EQ(((1 << 0) | (1 << 1)), OpenCLDebugInfo100FlagIsPublic);
  73. EXPECT_EQ(1 << 2, OpenCLDebugInfo100FlagIsLocal);
  74. EXPECT_EQ(1 << 3, OpenCLDebugInfo100FlagIsDefinition);
  75. EXPECT_EQ(1 << 4, OpenCLDebugInfo100FlagFwdDecl);
  76. EXPECT_EQ(1 << 5, OpenCLDebugInfo100FlagArtificial);
  77. EXPECT_EQ(1 << 6, OpenCLDebugInfo100FlagExplicit);
  78. EXPECT_EQ(1 << 7, OpenCLDebugInfo100FlagPrototyped);
  79. EXPECT_EQ(1 << 8, OpenCLDebugInfo100FlagObjectPointer);
  80. EXPECT_EQ(1 << 9, OpenCLDebugInfo100FlagStaticMember);
  81. EXPECT_EQ(1 << 10, OpenCLDebugInfo100FlagIndirectVariable);
  82. EXPECT_EQ(1 << 11, OpenCLDebugInfo100FlagLValueReference);
  83. EXPECT_EQ(1 << 12, OpenCLDebugInfo100FlagRValueReference);
  84. EXPECT_EQ(1 << 13, OpenCLDebugInfo100FlagIsOptimized);
  85. EXPECT_EQ(1 << 14, OpenCLDebugInfo100FlagIsEnumClass);
  86. EXPECT_EQ(1 << 15, OpenCLDebugInfo100FlagTypePassByValue);
  87. EXPECT_EQ(1 << 16, OpenCLDebugInfo100FlagTypePassByReference);
  88. }
  89. TEST(ExtInstCLDebugInfo, BaseTypeAttributeEndodingValues) {
  90. EXPECT_EQ(0, OpenCLDebugInfo100Unspecified);
  91. EXPECT_EQ(1, OpenCLDebugInfo100Address);
  92. EXPECT_EQ(2, OpenCLDebugInfo100Boolean);
  93. EXPECT_EQ(3, OpenCLDebugInfo100Float);
  94. EXPECT_EQ(4, OpenCLDebugInfo100Signed);
  95. EXPECT_EQ(5, OpenCLDebugInfo100SignedChar);
  96. EXPECT_EQ(6, OpenCLDebugInfo100Unsigned);
  97. EXPECT_EQ(7, OpenCLDebugInfo100UnsignedChar);
  98. }
  99. TEST(ExtInstCLDebugInfo, CompositeTypeValues) {
  100. EXPECT_EQ(0, OpenCLDebugInfo100Class);
  101. EXPECT_EQ(1, OpenCLDebugInfo100Structure);
  102. EXPECT_EQ(2, OpenCLDebugInfo100Union);
  103. }
  104. TEST(ExtInstCLDebugInfo, TypeQualifierValues) {
  105. EXPECT_EQ(0, OpenCLDebugInfo100ConstType);
  106. EXPECT_EQ(1, OpenCLDebugInfo100VolatileType);
  107. EXPECT_EQ(2, OpenCLDebugInfo100RestrictType);
  108. EXPECT_EQ(3, OpenCLDebugInfo100AtomicType);
  109. }
  110. TEST(ExtInstCLDebugInfo, DebugOperationValues) {
  111. EXPECT_EQ(0, OpenCLDebugInfo100Deref);
  112. EXPECT_EQ(1, OpenCLDebugInfo100Plus);
  113. EXPECT_EQ(2, OpenCLDebugInfo100Minus);
  114. EXPECT_EQ(3, OpenCLDebugInfo100PlusUconst);
  115. EXPECT_EQ(4, OpenCLDebugInfo100BitPiece);
  116. EXPECT_EQ(5, OpenCLDebugInfo100Swap);
  117. EXPECT_EQ(6, OpenCLDebugInfo100Xderef);
  118. EXPECT_EQ(7, OpenCLDebugInfo100StackValue);
  119. EXPECT_EQ(8, OpenCLDebugInfo100Constu);
  120. EXPECT_EQ(9, OpenCLDebugInfo100Fragment);
  121. }
  122. TEST(ExtInstCLDebugInfo, ImportedEntityValues) {
  123. EXPECT_EQ(0, OpenCLDebugInfo100ImportedModule);
  124. EXPECT_EQ(1, OpenCLDebugInfo100ImportedDeclaration);
  125. }
  126. // Test round trip through assembler and disassembler.
  127. struct InstructionCase {
  128. uint32_t opcode;
  129. std::string name;
  130. std::string operands;
  131. std::vector<uint32_t> expected_operands;
  132. };
  133. using ExtInstCLDebugInfo100RoundTripTest =
  134. spvtest::TextToBinaryTestBase<::testing::TestWithParam<InstructionCase>>;
  135. using ExtInstCLDebugInfo100RoundTripTestExplicit = spvtest::TextToBinaryTest;
  136. TEST_P(ExtInstCLDebugInfo100RoundTripTest, ParameterizedExtInst) {
  137. const std::string input =
  138. "%1 = OpExtInstImport \"OpenCL.DebugInfo.100\"\n"
  139. "%3 = OpExtInst %2 %1 " +
  140. GetParam().name + GetParam().operands + "\n";
  141. // First make sure it assembles correctly.
  142. std::cout << input << std::endl;
  143. EXPECT_THAT(
  144. CompiledInstructions(input),
  145. Eq(Concatenate(
  146. {MakeInstruction(spv::Op::OpExtInstImport, {1},
  147. MakeVector("OpenCL.DebugInfo.100")),
  148. MakeInstruction(spv::Op::OpExtInst, {2, 3, 1, GetParam().opcode},
  149. GetParam().expected_operands)})))
  150. << input;
  151. // Now check the round trip through the disassembler.
  152. EXPECT_THAT(EncodeAndDecodeSuccessfully(input), input) << input;
  153. }
  154. #define EPREFIX "Debug"
  155. #define CASE_0(Enum) \
  156. { \
  157. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, "", {} \
  158. }
  159. #define CASE_ILL(Enum, L0, L1) \
  160. { \
  161. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  162. " %4 " #L0 " " #L1, { \
  163. 4, L0, L1 \
  164. } \
  165. }
  166. #define CASE_IL(Enum, L0) \
  167. { \
  168. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " %4 " #L0, { \
  169. 4, L0 \
  170. } \
  171. }
  172. #define CASE_I(Enum) \
  173. { \
  174. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " %4", { 4 } \
  175. }
  176. #define CASE_II(Enum) \
  177. { \
  178. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " %4 %5", { 4, 5 } \
  179. }
  180. #define CASE_III(Enum) \
  181. { \
  182. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " %4 %5 %6", { \
  183. 4, 5, 6 \
  184. } \
  185. }
  186. #define CASE_IIII(Enum) \
  187. { \
  188. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " %4 %5 %6 %7", { \
  189. 4, 5, 6, 7 \
  190. } \
  191. }
  192. #define CASE_IIIII(Enum) \
  193. { \
  194. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " %4 %5 %6 %7 %8", \
  195. { \
  196. 4, 5, 6, 7, 8 \
  197. } \
  198. }
  199. #define CASE_IIIIII(Enum) \
  200. { \
  201. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  202. " %4 %5 %6 %7 %8 %9", { \
  203. 4, 5, 6, 7, 8, 9 \
  204. } \
  205. }
  206. #define CASE_IIIIIII(Enum) \
  207. { \
  208. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  209. " %4 %5 %6 %7 %8 %9 %10", { \
  210. 4, 5, 6, 7, 8, 9, 10 \
  211. } \
  212. }
  213. #define CASE_IIILLI(Enum, L0, L1) \
  214. { \
  215. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  216. " %4 %5 %6 " #L0 " " #L1 " %7", { \
  217. 4, 5, 6, L0, L1, 7 \
  218. } \
  219. }
  220. #define CASE_IIILLIF(Enum, L0, L1, Fstr, Fnum) \
  221. { \
  222. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  223. " %4 %5 %6 " #L0 " " #L1 " %7 " Fstr, { \
  224. 4, 5, 6, L0, L1, 7, Fnum \
  225. } \
  226. }
  227. #define CASE_IIILLIFL(Enum, L0, L1, Fstr, Fnum, L2) \
  228. { \
  229. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  230. " %4 %5 %6 " #L0 " " #L1 " %7 " Fstr " " #L2, { \
  231. 4, 5, 6, L0, L1, 7, Fnum, L2 \
  232. } \
  233. }
  234. #define CASE_IIILLIL(Enum, L0, L1, L2) \
  235. { \
  236. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  237. " %4 %5 %6 " #L0 " " #L1 " %7 " #L2, { \
  238. 4, 5, 6, L0, L1, 7, L2 \
  239. } \
  240. }
  241. #define CASE_IE(Enum, E0) \
  242. { \
  243. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " %4 " #E0, { \
  244. 4, uint32_t(OpenCLDebugInfo100##E0) \
  245. } \
  246. }
  247. #define CASE_IEIILLI(Enum, E0, L1, L2) \
  248. { \
  249. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  250. " %4 " #E0 " %5 %6 " #L1 " " #L2 " %7", { \
  251. 4, uint32_t(OpenCLDebugInfo100##E0), 5, 6, L1, L2, 7 \
  252. } \
  253. }
  254. #define CASE_IIE(Enum, E0) \
  255. { \
  256. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " %4 %5 " #E0, { \
  257. 4, 5, uint32_t(OpenCLDebugInfo100##E0) \
  258. } \
  259. }
  260. #define CASE_ISF(Enum, S0, Fstr, Fnum) \
  261. { \
  262. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  263. " %4 " #S0 " " Fstr, { \
  264. 4, uint32_t(spv::StorageClass::S0), Fnum \
  265. } \
  266. }
  267. #define CASE_LII(Enum, L0) \
  268. { \
  269. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " " #L0 " %4 %5", \
  270. { \
  271. L0, 4, 5 \
  272. } \
  273. }
  274. #define CASE_LLIe(Enum, L0, L1, RawEnumName, RawEnumValue) \
  275. { \
  276. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  277. " " #L0 " " #L1 " %4 " RawEnumName, { \
  278. L0, L1, 4, (uint32_t)RawEnumValue \
  279. } \
  280. }
  281. #define CASE_ILI(Enum, L0) \
  282. { \
  283. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " %4 " #L0 " %5", \
  284. { \
  285. 4, L0, 5 \
  286. } \
  287. }
  288. #define CASE_ILII(Enum, L0) \
  289. { \
  290. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  291. " %4 " #L0 " %5 %6", { \
  292. 4, L0, 5, 6 \
  293. } \
  294. }
  295. #define CASE_ILLII(Enum, L0, L1) \
  296. { \
  297. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  298. " %4 " #L0 " " #L1 " %5 %6", { \
  299. 4, L0, L1, 5, 6 \
  300. } \
  301. }
  302. #define CASE_IIILLIIF(Enum, L0, L1, Fstr, Fnum) \
  303. { \
  304. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  305. " %4 %5 %6 " #L0 " " #L1 " %7 %8 " Fstr, { \
  306. 4, 5, 6, L0, L1, 7, 8, Fnum \
  307. } \
  308. }
  309. #define CASE_IIILLIIFII(Enum, L0, L1, Fstr, Fnum) \
  310. { \
  311. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  312. " %4 %5 %6 " #L0 " " #L1 " %7 %8 " Fstr " %9 %10", { \
  313. 4, 5, 6, L0, L1, 7, 8, Fnum, 9, 10 \
  314. } \
  315. }
  316. #define CASE_IIILLIIFIIII(Enum, L0, L1, Fstr, Fnum) \
  317. { \
  318. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  319. " %4 %5 %6 " #L0 " " #L1 " %7 %8 " Fstr " %9 %10 %11 %12", { \
  320. 4, 5, 6, L0, L1, 7, 8, Fnum, 9, 10, 11, 12 \
  321. } \
  322. }
  323. #define CASE_IIILLIIFIIIIII(Enum, L0, L1, Fstr, Fnum) \
  324. { \
  325. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  326. " %4 %5 %6 " #L0 " " #L1 " %7 %8 " Fstr " %9 %10 %11 %12 %13 %14", { \
  327. 4, 5, 6, L0, L1, 7, 8, Fnum, 9, 10, 11, 12, 13, 14 \
  328. } \
  329. }
  330. #define CASE_IEILLIIIF(Enum, E0, L0, L1, Fstr, Fnum) \
  331. { \
  332. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  333. " %4 " #E0 " %5 " #L0 " " #L1 " %6 %7 %8 " Fstr, { \
  334. 4, uint32_t(OpenCLDebugInfo100##E0), 5, L0, L1, 6, 7, 8, Fnum \
  335. } \
  336. }
  337. #define CASE_IEILLIIIFI(Enum, E0, L0, L1, Fstr, Fnum) \
  338. { \
  339. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  340. " %4 " #E0 " %5 " #L0 " " #L1 " %6 %7 %8 " Fstr " %9", { \
  341. 4, uint32_t(OpenCLDebugInfo100##E0), 5, L0, L1, 6, 7, 8, Fnum, 9 \
  342. } \
  343. }
  344. #define CASE_IEILLIIIFII(Enum, E0, L0, L1, Fstr, Fnum) \
  345. { \
  346. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  347. " %4 " #E0 " %5 " #L0 " " #L1 " %6 %7 %8 " Fstr " %9 %10", { \
  348. 4, uint32_t(OpenCLDebugInfo100##E0), 5, L0, L1, 6, 7, 8, Fnum, 9, 10 \
  349. } \
  350. }
  351. #define CASE_IEILLIIIFIII(Enum, E0, L0, L1, Fstr, Fnum) \
  352. { \
  353. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  354. " %4 " #E0 " %5 " #L0 " " #L1 " %6 %7 %8 " Fstr " %9 %10 %11", { \
  355. 4, uint32_t(OpenCLDebugInfo100##E0), 5, L0, L1, 6, 7, 8, Fnum, 9, 10, 11 \
  356. } \
  357. }
  358. #define CASE_IEILLIIIFIIII(Enum, E0, L0, L1, Fstr, Fnum) \
  359. { \
  360. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  361. " %4 " #E0 " %5 " #L0 " " #L1 " %6 %7 %8 " Fstr " %9 %10 %11 %12", { \
  362. 4, uint32_t(OpenCLDebugInfo100##E0), 5, L0, L1, 6, 7, 8, Fnum, 9, 10, \
  363. 11, 12 \
  364. } \
  365. }
  366. #define CASE_IIILLIIIF(Enum, L0, L1, Fstr, Fnum) \
  367. { \
  368. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  369. " %4 %5 %6 " #L0 " " #L1 " %7 %8 %9 " Fstr, { \
  370. 4, 5, 6, L0, L1, 7, 8, 9, Fnum \
  371. } \
  372. }
  373. #define CASE_IIILLIIIFI(Enum, L0, L1, Fstr, Fnum) \
  374. { \
  375. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  376. " %4 %5 %6 " #L0 " " #L1 " %7 %8 %9 " Fstr " %10", { \
  377. 4, 5, 6, L0, L1, 7, 8, 9, Fnum, 10 \
  378. } \
  379. }
  380. #define CASE_IIIIF(Enum, Fstr, Fnum) \
  381. { \
  382. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  383. " %4 %5 %6 %7 " Fstr, { \
  384. 4, 5, 6, 7, Fnum \
  385. } \
  386. }
  387. #define CASE_IIILL(Enum, L0, L1) \
  388. { \
  389. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  390. " %4 %5 %6 " #L0 " " #L1, { \
  391. 4, 5, 6, L0, L1 \
  392. } \
  393. }
  394. #define CASE_IIIILL(Enum, L0, L1) \
  395. { \
  396. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  397. " %4 %5 %6 %7 " #L0 " " #L1, { \
  398. 4, 5, 6, 7, L0, L1 \
  399. } \
  400. }
  401. #define CASE_IILLI(Enum, L0, L1) \
  402. { \
  403. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  404. " %4 %5 " #L0 " " #L1 " %6", { \
  405. 4, 5, L0, L1, 6 \
  406. } \
  407. }
  408. #define CASE_IILLII(Enum, L0, L1) \
  409. { \
  410. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  411. " %4 %5 " #L0 " " #L1 " %6 %7", { \
  412. 4, 5, L0, L1, 6, 7 \
  413. } \
  414. }
  415. #define CASE_IILLIII(Enum, L0, L1) \
  416. { \
  417. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  418. " %4 %5 " #L0 " " #L1 " %6 %7 %8", { \
  419. 4, 5, L0, L1, 6, 7, 8 \
  420. } \
  421. }
  422. #define CASE_IILLIIII(Enum, L0, L1) \
  423. { \
  424. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  425. " %4 %5 " #L0 " " #L1 " %6 %7 %8 %9", { \
  426. 4, 5, L0, L1, 6, 7, 8, 9 \
  427. } \
  428. }
  429. #define CASE_IIILLIIFLI(Enum, L0, L1, Fstr, Fnum, L2) \
  430. { \
  431. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  432. " %4 %5 %6 " #L0 " " #L1 " %7 %8 " Fstr " " #L2 " %9", { \
  433. 4, 5, 6, L0, L1, 7, 8, Fnum, L2, 9 \
  434. } \
  435. }
  436. #define CASE_IIILLIIFLII(Enum, L0, L1, Fstr, Fnum, L2) \
  437. { \
  438. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  439. " %4 %5 %6 " #L0 " " #L1 " %7 %8 " Fstr " " #L2 " %9 %10", { \
  440. 4, 5, 6, L0, L1, 7, 8, Fnum, L2, 9, 10 \
  441. } \
  442. }
  443. #define CASE_E(Enum, E0) \
  444. { \
  445. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " " #E0, { \
  446. uint32_t(OpenCLDebugInfo100##E0) \
  447. } \
  448. }
  449. #define CASE_EI(Enum, E0) \
  450. { \
  451. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " " #E0 " %4", { \
  452. uint32_t(OpenCLDebugInfo100##E0), 4 \
  453. } \
  454. }
  455. #define CASE_EII(Enum, E0) \
  456. { \
  457. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " " #E0 " %4 %5", \
  458. { \
  459. uint32_t(OpenCLDebugInfo100##E0), 4, 5 \
  460. } \
  461. }
  462. #define CASE_EIII(Enum, E0) \
  463. { \
  464. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  465. " " #E0 " %4 %5 %6", { \
  466. uint32_t(OpenCLDebugInfo100##E0), 4, 5, 6 \
  467. } \
  468. }
  469. #define CASE_EIIII(Enum, E0) \
  470. { \
  471. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  472. " " #E0 " %4 %5 %6 %7", { \
  473. uint32_t(OpenCLDebugInfo100##E0), 4, 5, 6, 7 \
  474. } \
  475. }
  476. #define CASE_EIIIII(Enum, E0) \
  477. { \
  478. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  479. " " #E0 " %4 %5 %6 %7 %8", { \
  480. uint32_t(OpenCLDebugInfo100##E0), 4, 5, 6, 7, 8 \
  481. } \
  482. }
  483. #define CASE_EL(Enum, E0, L0) \
  484. { \
  485. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, " " #E0 " " #L0, { \
  486. uint32_t(OpenCLDebugInfo100##E0), L0 \
  487. } \
  488. }
  489. #define CASE_ELL(Enum, E0, L0, L1) \
  490. { \
  491. uint32_t(OpenCLDebugInfo100Debug##Enum), EPREFIX #Enum, \
  492. " " #E0 " " #L0 " " #L1, { \
  493. uint32_t(OpenCLDebugInfo100##E0), L0, L1 \
  494. } \
  495. }
  496. // OpenCL.DebugInfo.100 4.1 Missing Debugging Information
  497. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugInfoNone,
  498. ExtInstCLDebugInfo100RoundTripTest,
  499. ::testing::ValuesIn(std::vector<InstructionCase>({
  500. CASE_0(InfoNone), // enum value 0
  501. })));
  502. // OpenCL.DebugInfo.100 4.2 Compilation Unit
  503. INSTANTIATE_TEST_SUITE_P(
  504. OpenCLDebugInfo100DebugCompilationUnit, ExtInstCLDebugInfo100RoundTripTest,
  505. ::testing::ValuesIn(std::vector<InstructionCase>({
  506. CASE_LLIe(CompilationUnit, 100, 42, "HLSL", spv::SourceLanguage::HLSL),
  507. })));
  508. INSTANTIATE_TEST_SUITE_P(
  509. OpenCLDebugInfo100DebugSource, ExtInstCLDebugInfo100RoundTripTest,
  510. ::testing::ValuesIn(std::vector<InstructionCase>({
  511. // TODO(dneto): Should this be a list of sourc texts,
  512. // to accommodate length limits?
  513. CASE_I(Source),
  514. CASE_II(Source),
  515. })));
  516. // OpenCL.DebugInfo.100 4.3 Type instructions
  517. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypeBasic,
  518. ExtInstCLDebugInfo100RoundTripTest,
  519. ::testing::ValuesIn(std::vector<InstructionCase>({
  520. CASE_IIE(TypeBasic, Unspecified),
  521. CASE_IIE(TypeBasic, Address),
  522. CASE_IIE(TypeBasic, Boolean),
  523. CASE_IIE(TypeBasic, Float),
  524. CASE_IIE(TypeBasic, Signed),
  525. CASE_IIE(TypeBasic, SignedChar),
  526. CASE_IIE(TypeBasic, Unsigned),
  527. CASE_IIE(TypeBasic, UnsignedChar),
  528. })));
  529. // The FlagIsPublic is value is (1 << 0) | (1 << 2) which is the same
  530. // as the bitwise-OR of FlagIsProtected and FlagIsPrivate.
  531. // The disassembler will emit the compound expression instead.
  532. // There is no simple fix for this. This enum is not really a mask
  533. // for the bottom two bits.
  534. TEST_F(ExtInstCLDebugInfo100RoundTripTestExplicit, FlagIsPublic) {
  535. const std::string prefix =
  536. "%1 = OpExtInstImport \"DebugInfo\"\n"
  537. "%3 = OpExtInst %2 %1 DebugTypePointer %4 Private ";
  538. const std::string input = prefix + "FlagIsPublic\n";
  539. const std::string expected = prefix + "FlagIsProtected|FlagIsPrivate\n";
  540. // First make sure it assembles correctly.
  541. EXPECT_THAT(CompiledInstructions(input),
  542. Eq(Concatenate(
  543. {MakeInstruction(spv::Op::OpExtInstImport, {1},
  544. MakeVector("DebugInfo")),
  545. MakeInstruction(spv::Op::OpExtInst,
  546. {2, 3, 1, OpenCLDebugInfo100DebugTypePointer,
  547. 4, uint32_t(spv::StorageClass::Private),
  548. OpenCLDebugInfo100FlagIsPublic})})))
  549. << input;
  550. // Now check the round trip through the disassembler.
  551. EXPECT_THAT(EncodeAndDecodeSuccessfully(input), Eq(expected)) << input;
  552. }
  553. INSTANTIATE_TEST_SUITE_P(
  554. OpenCLDebugInfo100DebugTypePointer, ExtInstCLDebugInfo100RoundTripTest,
  555. ::testing::ValuesIn(std::vector<InstructionCase>({
  556. //// Use each flag independently.
  557. CASE_ISF(TypePointer, Private, "FlagIsProtected",
  558. uint32_t(OpenCLDebugInfo100FlagIsProtected)),
  559. CASE_ISF(TypePointer, Private, "FlagIsPrivate",
  560. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  561. // FlagIsPublic is tested above.
  562. CASE_ISF(TypePointer, Private, "FlagIsLocal",
  563. uint32_t(OpenCLDebugInfo100FlagIsLocal)),
  564. CASE_ISF(TypePointer, Private, "FlagIsDefinition",
  565. uint32_t(OpenCLDebugInfo100FlagIsDefinition)),
  566. CASE_ISF(TypePointer, Private, "FlagFwdDecl",
  567. uint32_t(OpenCLDebugInfo100FlagFwdDecl)),
  568. CASE_ISF(TypePointer, Private, "FlagArtificial",
  569. uint32_t(OpenCLDebugInfo100FlagArtificial)),
  570. CASE_ISF(TypePointer, Private, "FlagExplicit",
  571. uint32_t(OpenCLDebugInfo100FlagExplicit)),
  572. CASE_ISF(TypePointer, Private, "FlagPrototyped",
  573. uint32_t(OpenCLDebugInfo100FlagPrototyped)),
  574. CASE_ISF(TypePointer, Private, "FlagObjectPointer",
  575. uint32_t(OpenCLDebugInfo100FlagObjectPointer)),
  576. CASE_ISF(TypePointer, Private, "FlagStaticMember",
  577. uint32_t(OpenCLDebugInfo100FlagStaticMember)),
  578. CASE_ISF(TypePointer, Private, "FlagIndirectVariable",
  579. uint32_t(OpenCLDebugInfo100FlagIndirectVariable)),
  580. CASE_ISF(TypePointer, Private, "FlagLValueReference",
  581. uint32_t(OpenCLDebugInfo100FlagLValueReference)),
  582. CASE_ISF(TypePointer, Private, "FlagIsOptimized",
  583. uint32_t(OpenCLDebugInfo100FlagIsOptimized)),
  584. CASE_ISF(TypePointer, Private, "FlagIsEnumClass",
  585. uint32_t(OpenCLDebugInfo100FlagIsEnumClass)),
  586. CASE_ISF(TypePointer, Private, "FlagTypePassByValue",
  587. uint32_t(OpenCLDebugInfo100FlagTypePassByValue)),
  588. CASE_ISF(TypePointer, Private, "FlagTypePassByReference",
  589. uint32_t(OpenCLDebugInfo100FlagTypePassByReference)),
  590. //// Use flags in combination, and try different storage classes.
  591. CASE_ISF(TypePointer, Function, "FlagIsProtected|FlagIsPrivate",
  592. uint32_t(OpenCLDebugInfo100FlagIsProtected) |
  593. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  594. CASE_ISF(
  595. TypePointer, Workgroup,
  596. "FlagIsPrivate|FlagFwdDecl|FlagIndirectVariable|FlagIsOptimized",
  597. uint32_t(OpenCLDebugInfo100FlagIsPrivate) |
  598. uint32_t(OpenCLDebugInfo100FlagFwdDecl) |
  599. uint32_t(OpenCLDebugInfo100FlagIndirectVariable) |
  600. uint32_t(OpenCLDebugInfo100FlagIsOptimized)),
  601. })));
  602. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypeQualifier,
  603. ExtInstCLDebugInfo100RoundTripTest,
  604. ::testing::ValuesIn(std::vector<InstructionCase>({
  605. CASE_IE(TypeQualifier, ConstType),
  606. CASE_IE(TypeQualifier, VolatileType),
  607. CASE_IE(TypeQualifier, RestrictType),
  608. CASE_IE(TypeQualifier, AtomicType),
  609. })));
  610. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypeArray,
  611. ExtInstCLDebugInfo100RoundTripTest,
  612. ::testing::ValuesIn(std::vector<InstructionCase>({
  613. CASE_II(TypeArray),
  614. CASE_III(TypeArray),
  615. CASE_IIII(TypeArray),
  616. CASE_IIIII(TypeArray),
  617. })));
  618. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypeVector,
  619. ExtInstCLDebugInfo100RoundTripTest,
  620. ::testing::ValuesIn(std::vector<InstructionCase>({
  621. CASE_IL(TypeVector, 2),
  622. CASE_IL(TypeVector, 3),
  623. CASE_IL(TypeVector, 4),
  624. CASE_IL(TypeVector, 16),
  625. })));
  626. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypedef,
  627. ExtInstCLDebugInfo100RoundTripTest,
  628. ::testing::ValuesIn(std::vector<InstructionCase>({
  629. CASE_IIILLI(Typedef, 12, 13),
  630. CASE_IIILLI(Typedef, 14, 99),
  631. })));
  632. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypeFunction,
  633. ExtInstCLDebugInfo100RoundTripTest,
  634. ::testing::ValuesIn(std::vector<InstructionCase>({
  635. CASE_EI(TypeFunction, FlagIsProtected),
  636. CASE_EII(TypeFunction, FlagIsDefinition),
  637. CASE_EIII(TypeFunction, FlagArtificial),
  638. CASE_EIIII(TypeFunction, FlagExplicit),
  639. CASE_EIIIII(TypeFunction, FlagIsPrivate),
  640. })));
  641. INSTANTIATE_TEST_SUITE_P(
  642. OpenCLDebugInfo100DebugTypeEnum, ExtInstCLDebugInfo100RoundTripTest,
  643. ::testing::ValuesIn(std::vector<InstructionCase>({
  644. CASE_IIILLIIFII(
  645. TypeEnum, 12, 13,
  646. "FlagIsPrivate|FlagFwdDecl|FlagIndirectVariable|FlagIsOptimized",
  647. uint32_t(OpenCLDebugInfo100FlagIsPrivate) |
  648. uint32_t(OpenCLDebugInfo100FlagFwdDecl) |
  649. uint32_t(OpenCLDebugInfo100FlagIndirectVariable) |
  650. uint32_t(OpenCLDebugInfo100FlagIsOptimized)),
  651. CASE_IIILLIIFIIII(TypeEnum, 17, 18, "FlagStaticMember",
  652. uint32_t(OpenCLDebugInfo100FlagStaticMember)),
  653. CASE_IIILLIIFIIIIII(TypeEnum, 99, 1, "FlagStaticMember",
  654. uint32_t(OpenCLDebugInfo100FlagStaticMember)),
  655. })));
  656. INSTANTIATE_TEST_SUITE_P(
  657. OpenCLDebugInfo100DebugTypeComposite, ExtInstCLDebugInfo100RoundTripTest,
  658. ::testing::ValuesIn(std::vector<InstructionCase>({
  659. CASE_IEILLIIIF(
  660. TypeComposite, Class, 12, 13,
  661. "FlagIsPrivate|FlagFwdDecl|FlagIndirectVariable|FlagIsOptimized",
  662. uint32_t(OpenCLDebugInfo100FlagIsPrivate) |
  663. uint32_t(OpenCLDebugInfo100FlagFwdDecl) |
  664. uint32_t(OpenCLDebugInfo100FlagIndirectVariable) |
  665. uint32_t(OpenCLDebugInfo100FlagIsOptimized)),
  666. // Cover all tag values: Class, Structure, Union
  667. CASE_IEILLIIIF(TypeComposite, Class, 12, 13, "FlagIsPrivate",
  668. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  669. CASE_IEILLIIIF(TypeComposite, Structure, 12, 13, "FlagIsPrivate",
  670. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  671. CASE_IEILLIIIF(TypeComposite, Union, 12, 13, "FlagIsPrivate",
  672. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  673. // Now add members
  674. CASE_IEILLIIIFI(TypeComposite, Class, 9, 10, "FlagIsPrivate",
  675. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  676. CASE_IEILLIIIFII(TypeComposite, Class, 9, 10, "FlagIsPrivate",
  677. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  678. CASE_IEILLIIIFIII(TypeComposite, Class, 9, 10, "FlagIsPrivate",
  679. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  680. CASE_IEILLIIIFIIII(TypeComposite, Class, 9, 10, "FlagIsPrivate",
  681. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  682. })));
  683. INSTANTIATE_TEST_SUITE_P(
  684. OpenCLDebugInfo100DebugTypeMember, ExtInstCLDebugInfo100RoundTripTest,
  685. ::testing::ValuesIn(std::vector<InstructionCase>({
  686. CASE_IIILLIIIF(TypeMember, 12, 13, "FlagIsPrivate",
  687. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  688. CASE_IIILLIIIF(TypeMember, 99, 100, "FlagIsPrivate|FlagFwdDecl",
  689. uint32_t(OpenCLDebugInfo100FlagIsPrivate) |
  690. uint32_t(OpenCLDebugInfo100FlagFwdDecl)),
  691. // Add the optional Id argument.
  692. CASE_IIILLIIIFI(TypeMember, 12, 13, "FlagIsPrivate",
  693. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  694. })));
  695. INSTANTIATE_TEST_SUITE_P(
  696. OpenCLDebugInfo100DebugTypeInheritance, ExtInstCLDebugInfo100RoundTripTest,
  697. ::testing::ValuesIn(std::vector<InstructionCase>({
  698. CASE_IIIIF(TypeInheritance, "FlagIsPrivate",
  699. uint32_t(OpenCLDebugInfo100FlagIsPrivate)),
  700. CASE_IIIIF(TypeInheritance, "FlagIsPrivate|FlagFwdDecl",
  701. uint32_t(OpenCLDebugInfo100FlagIsPrivate) |
  702. uint32_t(OpenCLDebugInfo100FlagFwdDecl)),
  703. })));
  704. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypePtrToMember,
  705. ExtInstCLDebugInfo100RoundTripTest,
  706. ::testing::ValuesIn(std::vector<InstructionCase>({
  707. CASE_II(TypePtrToMember),
  708. })));
  709. // OpenCL.DebugInfo.100 4.4 Templates
  710. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypeTemplate,
  711. ExtInstCLDebugInfo100RoundTripTest,
  712. ::testing::ValuesIn(std::vector<InstructionCase>({
  713. CASE_II(TypeTemplate),
  714. CASE_III(TypeTemplate),
  715. CASE_IIII(TypeTemplate),
  716. CASE_IIIII(TypeTemplate),
  717. })));
  718. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypeTemplateParameter,
  719. ExtInstCLDebugInfo100RoundTripTest,
  720. ::testing::ValuesIn(std::vector<InstructionCase>({
  721. CASE_IIIILL(TypeTemplateParameter, 1, 2),
  722. CASE_IIIILL(TypeTemplateParameter, 99, 102),
  723. CASE_IIIILL(TypeTemplateParameter, 10, 7),
  724. })));
  725. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypeTemplateTemplateParameter,
  726. ExtInstCLDebugInfo100RoundTripTest,
  727. ::testing::ValuesIn(std::vector<InstructionCase>({
  728. CASE_IIILL(TypeTemplateTemplateParameter, 1, 2),
  729. CASE_IIILL(TypeTemplateTemplateParameter, 99, 102),
  730. CASE_IIILL(TypeTemplateTemplateParameter, 10, 7),
  731. })));
  732. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugTypeTemplateParameterPack,
  733. ExtInstCLDebugInfo100RoundTripTest,
  734. ::testing::ValuesIn(std::vector<InstructionCase>({
  735. CASE_IILLI(TypeTemplateParameterPack, 1, 2),
  736. CASE_IILLII(TypeTemplateParameterPack, 99, 102),
  737. CASE_IILLIII(TypeTemplateParameterPack, 10, 7),
  738. CASE_IILLIIII(TypeTemplateParameterPack, 10, 7),
  739. })));
  740. // OpenCL.DebugInfo.100 4.5 Global Variables
  741. INSTANTIATE_TEST_SUITE_P(
  742. OpenCLDebugInfo100DebugGlobalVariable, ExtInstCLDebugInfo100RoundTripTest,
  743. ::testing::ValuesIn(std::vector<InstructionCase>({
  744. CASE_IIILLIIIF(GlobalVariable, 1, 2, "FlagIsOptimized",
  745. uint32_t(OpenCLDebugInfo100FlagIsOptimized)),
  746. CASE_IIILLIIIF(GlobalVariable, 42, 43, "FlagIsOptimized",
  747. uint32_t(OpenCLDebugInfo100FlagIsOptimized)),
  748. CASE_IIILLIIIFI(GlobalVariable, 1, 2, "FlagIsOptimized",
  749. uint32_t(OpenCLDebugInfo100FlagIsOptimized)),
  750. CASE_IIILLIIIFI(GlobalVariable, 42, 43, "FlagIsOptimized",
  751. uint32_t(OpenCLDebugInfo100FlagIsOptimized)),
  752. })));
  753. // OpenCL.DebugInfo.100 4.6 Functions
  754. INSTANTIATE_TEST_SUITE_P(
  755. OpenCLDebugInfo100DebugFunctionDeclaration,
  756. ExtInstCLDebugInfo100RoundTripTest,
  757. ::testing::ValuesIn(std::vector<InstructionCase>({
  758. CASE_IIILLIIF(FunctionDeclaration, 1, 2, "FlagIsOptimized",
  759. uint32_t(OpenCLDebugInfo100FlagIsOptimized)),
  760. CASE_IIILLIIF(FunctionDeclaration, 42, 43, "FlagFwdDecl",
  761. uint32_t(OpenCLDebugInfo100FlagFwdDecl)),
  762. })));
  763. INSTANTIATE_TEST_SUITE_P(
  764. OpenCLDebugInfo100DebugFunction, ExtInstCLDebugInfo100RoundTripTest,
  765. ::testing::ValuesIn(std::vector<InstructionCase>({
  766. CASE_IIILLIIFLI(Function, 1, 2, "FlagIsOptimized",
  767. uint32_t(OpenCLDebugInfo100FlagIsOptimized), 3),
  768. CASE_IIILLIIFLI(Function, 42, 43, "FlagFwdDecl",
  769. uint32_t(OpenCLDebugInfo100FlagFwdDecl), 44),
  770. // Add the optional declaration Id.
  771. CASE_IIILLIIFLII(Function, 1, 2, "FlagIsOptimized",
  772. uint32_t(OpenCLDebugInfo100FlagIsOptimized), 3),
  773. CASE_IIILLIIFLII(Function, 42, 43, "FlagFwdDecl",
  774. uint32_t(OpenCLDebugInfo100FlagFwdDecl), 44),
  775. })));
  776. // OpenCL.DebugInfo.100 4.7 Local Information
  777. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugLexicalBlock,
  778. ExtInstCLDebugInfo100RoundTripTest,
  779. ::testing::ValuesIn(std::vector<InstructionCase>({
  780. CASE_ILLII(LexicalBlock, 1, 2),
  781. CASE_ILLII(LexicalBlock, 42, 43),
  782. })));
  783. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugLexicalBlockDiscriminator,
  784. ExtInstCLDebugInfo100RoundTripTest,
  785. ::testing::ValuesIn(std::vector<InstructionCase>({
  786. CASE_ILI(LexicalBlockDiscriminator, 1),
  787. CASE_ILI(LexicalBlockDiscriminator, 42),
  788. })));
  789. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugScope,
  790. ExtInstCLDebugInfo100RoundTripTest,
  791. ::testing::ValuesIn(std::vector<InstructionCase>({
  792. CASE_I(Scope),
  793. CASE_II(Scope),
  794. })));
  795. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugNoScope,
  796. ExtInstCLDebugInfo100RoundTripTest,
  797. ::testing::ValuesIn(std::vector<InstructionCase>({
  798. CASE_0(NoScope),
  799. })));
  800. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugInlinedAt,
  801. ExtInstCLDebugInfo100RoundTripTest,
  802. ::testing::ValuesIn(std::vector<InstructionCase>({
  803. CASE_LII(InlinedAt, 1),
  804. CASE_LII(InlinedAt, 42),
  805. })));
  806. // OpenCL.DebugInfo.100 4.8 Local Variables
  807. INSTANTIATE_TEST_SUITE_P(
  808. OpenCLDebugInfo100DebugLocalVariable, ExtInstCLDebugInfo100RoundTripTest,
  809. ::testing::ValuesIn(std::vector<InstructionCase>({
  810. CASE_IIILLIF(LocalVariable, 1, 2, "FlagIsPrivate",
  811. OpenCLDebugInfo100FlagIsPrivate),
  812. CASE_IIILLIF(LocalVariable, 4, 5, "FlagIsProtected",
  813. OpenCLDebugInfo100FlagIsProtected),
  814. CASE_IIILLIFL(LocalVariable, 9, 99, "FlagIsProtected",
  815. OpenCLDebugInfo100FlagIsProtected, 195),
  816. CASE_IIILLIFL(LocalVariable, 19, 199, "FlagIsPrivate",
  817. OpenCLDebugInfo100FlagIsPrivate, 195),
  818. })));
  819. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugInlinedVariable,
  820. ExtInstCLDebugInfo100RoundTripTest,
  821. ::testing::ValuesIn(std::vector<InstructionCase>({
  822. CASE_II(InlinedVariable),
  823. })));
  824. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugDebugDeclare,
  825. ExtInstCLDebugInfo100RoundTripTest,
  826. ::testing::ValuesIn(std::vector<InstructionCase>({
  827. CASE_III(Declare),
  828. })));
  829. INSTANTIATE_TEST_SUITE_P(
  830. OpenCLDebugInfo100DebugDebugValue, ExtInstCLDebugInfo100RoundTripTest,
  831. ::testing::ValuesIn(std::vector<InstructionCase>({
  832. CASE_IIII(Value),
  833. CASE_IIIII(Value),
  834. CASE_IIIIII(Value),
  835. // Test up to 3 id parameters. We can always try more.
  836. CASE_IIIIIII(Value),
  837. })));
  838. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugDebugOperation,
  839. ExtInstCLDebugInfo100RoundTripTest,
  840. ::testing::ValuesIn(std::vector<InstructionCase>({
  841. CASE_E(Operation, Deref),
  842. CASE_E(Operation, Plus),
  843. CASE_E(Operation, Minus),
  844. CASE_EL(Operation, PlusUconst, 1),
  845. CASE_EL(Operation, PlusUconst, 42),
  846. CASE_ELL(Operation, BitPiece, 1, 2),
  847. CASE_ELL(Operation, BitPiece, 4, 5),
  848. CASE_E(Operation, Swap),
  849. CASE_E(Operation, Xderef),
  850. CASE_E(Operation, StackValue),
  851. CASE_EL(Operation, Constu, 1),
  852. CASE_EL(Operation, Constu, 42),
  853. CASE_ELL(Operation, Fragment, 100, 200),
  854. CASE_ELL(Operation, Fragment, 8, 9),
  855. })));
  856. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugDebugExpression,
  857. ExtInstCLDebugInfo100RoundTripTest,
  858. ::testing::ValuesIn(std::vector<InstructionCase>({
  859. CASE_0(Expression),
  860. CASE_I(Expression),
  861. CASE_II(Expression),
  862. CASE_III(Expression),
  863. CASE_IIII(Expression),
  864. CASE_IIIII(Expression),
  865. CASE_IIIIII(Expression),
  866. CASE_IIIIIII(Expression),
  867. })));
  868. // OpenCL.DebugInfo.100 4.9 Macros
  869. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugMacroDef,
  870. ExtInstCLDebugInfo100RoundTripTest,
  871. ::testing::ValuesIn(std::vector<InstructionCase>({
  872. CASE_ILI(MacroDef, 1),
  873. CASE_ILI(MacroDef, 42),
  874. CASE_ILII(MacroDef, 1),
  875. CASE_ILII(MacroDef, 42),
  876. })));
  877. INSTANTIATE_TEST_SUITE_P(OpenCLDebugInfo100DebugMacroUndef,
  878. ExtInstCLDebugInfo100RoundTripTest,
  879. ::testing::ValuesIn(std::vector<InstructionCase>({
  880. CASE_ILI(MacroUndef, 1),
  881. CASE_ILI(MacroUndef, 42),
  882. })));
  883. // OpenCL.DebugInfo.100 4.10 Imported Entities
  884. INSTANTIATE_TEST_SUITE_P(
  885. OpenCLDebugInfo100DebugImportedEntity, ExtInstCLDebugInfo100RoundTripTest,
  886. ::testing::ValuesIn(std::vector<InstructionCase>({
  887. // ID Name
  888. // Literal Tag
  889. // ID Source
  890. // ID Entity
  891. // Literal Number Line
  892. // Literal Number Column
  893. // ID Parent
  894. CASE_IEIILLI(ImportedEntity, ImportedModule, 67, 68),
  895. CASE_IEIILLI(ImportedEntity, ImportedDeclaration, 42, 43),
  896. })));
  897. #undef EPREFIX
  898. #undef CASE_0
  899. #undef CASE_ILL
  900. #undef CASE_IL
  901. #undef CASE_I
  902. #undef CASE_II
  903. #undef CASE_III
  904. #undef CASE_IIII
  905. #undef CASE_IIIII
  906. #undef CASE_IIIIII
  907. #undef CASE_IIIIIII
  908. #undef CASE_IIILLI
  909. #undef CASE_IIILLIL
  910. #undef CASE_IE
  911. #undef CASE_IEIILLI
  912. #undef CASE_IIE
  913. #undef CASE_ISF
  914. #undef CASE_LII
  915. #undef CASE_LLIe
  916. #undef CASE_ILI
  917. #undef CASE_ILII
  918. #undef CASE_ILLII
  919. #undef CASE_IIILLIF
  920. #undef CASE_IIILLIFL
  921. #undef CASE_IIILLIIF
  922. #undef CASE_IIILLIIFII
  923. #undef CASE_IIILLIIFIIII
  924. #undef CASE_IIILLIIFIIIIII
  925. #undef CASE_IEILLIIIF
  926. #undef CASE_IEILLIIIFI
  927. #undef CASE_IEILLIIIFII
  928. #undef CASE_IEILLIIIFIII
  929. #undef CASE_IEILLIIIFIIII
  930. #undef CASE_IIILLIIIF
  931. #undef CASE_IIILLIIIFI
  932. #undef CASE_IIIIF
  933. #undef CASE_IIILL
  934. #undef CASE_IIIILL
  935. #undef CASE_IILLI
  936. #undef CASE_IILLII
  937. #undef CASE_IILLIII
  938. #undef CASE_IILLIIII
  939. #undef CASE_IIILLIIFLI
  940. #undef CASE_IIILLIIFLII
  941. #undef CASE_E
  942. #undef CASE_EI
  943. #undef CASE_EII
  944. #undef CASE_EIII
  945. #undef CASE_EIIII
  946. #undef CASE_EIIIII
  947. #undef CASE_EL
  948. #undef CASE_ELL
  949. } // namespace
  950. } // namespace spvtools