1// RUN: llvm-tblgen %s | FileCheck %s 2 3class PrintString<string s> { 4 string S = s; 5} 6 7def op; 8def case_01 : PrintString<!repr((op op, op))>; 9// CHECK-LABEL: def case_01 { // PrintString 10// CHECK-NEXT: string S = "(op op, op)"; 11// CHECK-NEXT: } 12 13def case_02 : PrintString<!repr(32)>; 14// CHECK-LABEL: def case_02 { // PrintString 15// CHECK-NEXT: string S = "32"; 16// CHECK-NEXT: } 17 18multiclass Multi<int i, bits<3> b> { 19 defvar IncI = !repr(!add(i,1)); 20 def _IncI : PrintString<IncI>; 21 def _b : PrintString<!repr(b)>; 22} 23 24defm case_03 : Multi<2, 0b111>; 25// CHECK-LABEL: def case_03_IncI { // PrintString 26// CHECK-NEXT: string S = "3"; 27// CHECK-NEXT: } 28// CHECK-LABEL: def case_03_b { // PrintString 29// CHECK-NEXT: string S = "{ 1, 1, 1 }"; 30// CHECK-NEXT: } 31 32def case_04 : PrintString<!repr(!foreach(i, [1,2,3], !mul(i,2)))>; 33// CHECK-LABEL: def case_04 { // PrintString 34// CHECK-NEXT: string S = "[2, 4, 6]"; 35// CHECK-NEXT: } 36 37// Show the dumping of full records... 38def case_05 : PrintString<!repr(case_04)>; 39// CHECK-LABEL: def case_05 { // PrintString 40// CHECK-NEXT: string S = "case_04 { // PrintString 41// CHECK-NEXT: string S = "[2, 4, 6]"; 42// CHECK-NEXT: } 43// CHECK-NEXT: "; 44// CHECK-NEXT: } 45 46// ... and how !repr differs compared to !cast<string>. 47def case_06 : PrintString<!cast<string>(case_04)>; 48// CHECK-LABEL: def case_06 { // PrintString 49// CHECK-NEXT: string S = "case_04"; 50// CHECK-NEXT: } 51 52