| // RUN: llvm-tblgen %s -o - 2>&1 >/dev/null | FileCheck %s -DFILE=%s | |
| // CHECK: [[FILE]]:[[@LINE+1]]:1: note: Debug message | |
| dump "Debug message"; | |
| def op; | |
| class A { | |
| string A = "some text"; | |
| dag X =(op op); | |
| } | |
| def a : A; | |
| // CHECK: [[FILE]]:[[@LINE+5]]:1: note: The Value of A is: | |
| // CHECK-NEXT: a { // A | |
| // CHECK-NEXT: string A = "some text"; | |
| // CHECK-NEXT: dag X = (op op); | |
| // CHECK-NEXT: } | |
| dump "The Value of A is: \n" # !repr(a); | |
| def b : A; | |
| // CHECK: [[FILE]]:[[@LINE+4]]:1: note: b { // A | |
| // CHECK-NEXT: string A = "some text"; | |
| // CHECK-NEXT: dag X = (op op); | |
| // CHECK-NEXT: } | |
| dump b; | |
| defvar value_A = "some other text"; | |
| // CHECK: [[FILE]]:[[@LINE+1]]:1: note: some other text | |
| dump value_A; | |
| defvar value_B = 12; | |
| def X; | |
| // CHECK: [[FILE]]:[[@LINE+3]]:1: note: got a pair of values ["some other text" : 12], and an empty record: | |
| // CHECK-NEXT: X { | |
| // CHECK-NEXT: } | |
| dump "got a pair of values [" # !repr(value_A) # " : " # !repr(value_B) # "], " # "and an empty record:\n" # !repr(X); | |
| multiclass MC<dag s> { | |
| // CHECK: [[FILE]]:[[@LINE+1]]:3: note: s = (op a) | |
| dump "s = " # !repr(s); | |
| // CHECK: [[FILE]]:[[@LINE+4]]:3: note: args[0] = a { // A | |
| // CHECK-NEXT: string A = "some text"; | |
| // CHECK-NEXT: dag X = (op op); | |
| // CHECK-NEXT: } | |
| dump "args[0] = " # !repr(!getdagarg<A>(s,0)); | |
| def A; | |
| } | |
| defm X : MC<(op a)>; | |
| multiclass MMC<dag s> { | |
| // CHECK: [[FILE]]:[[@LINE+1]]:3: note: the operand of s is op | |
| dump "the operand of s is " # !getdagop(s); | |
| // CHECK: [[FILE]]:[[@LINE-13]]:3: note: s = (op a, a) | |
| // CHECK: [[FILE]]:[[@LINE-9]]:3: note: args[0] = a { // A | |
| // CHECK-NEXT: string A = "some text"; | |
| // CHECK-NEXT: dag X = (op op); | |
| // CHECK-NEXT: } | |
| defm : MC<s>; | |
| } | |
| defm XX : MMC<(op a, a)>; | |
| foreach i = [-1, 2] in { | |
| // CHECK: [[FILE]]:[[@LINE+4]]:3: note: i = -1 (negative) | |
| // CHECK: [[FILE]]:[[@LINE+8]]:5: note: i + 1 <= 0 | |
| // CHECK: [[FILE]]:[[@LINE+2]]:3: note: i = 2 (positive) | |
| // CHECK: [[FILE]]:[[@LINE+4]]:5: note: i + 1 > 0 (i + 1 = 3) | |
| dump "i = " # !repr(i) # !if(!ge(i,0), " (positive)", " (negative)"); | |
| defvar ip1 = !add(i, 1); | |
| if !gt(ip1,0) then { | |
| dump "i + 1 > 0 (i + 1 = " # !repr(ip1) # ")"; | |
| } else { | |
| dump "i + 1 <= 0" ; | |
| } | |
| } | |
| class Code<code val> { | |
| dump "val = " # !repr(val); | |
| code Val = val; | |
| int number = 0; | |
| } | |
| // CHECK: [[FILE]]:[[@LINE-4]]:3: note: val = [{a = a +1;}] | |
| def IncrementA : Code<[{a = a +1;}]>; | |
| class InheritFromCode : Code<[{f(x);}]>{ | |
| let number = 33; | |
| dump "number = " # !repr(number); | |
| } | |
| // CHECK: [[FILE]]:[[@LINE-10]]:3: note: val = [{f(x);}] | |
| // CHECK: [[FILE]]:[[@LINE-3]]:3: note: number = 33 | |
| def ModeCode : InheritFromCode; | |
| class BaseClassForSet; | |
| multiclass DefineSubSet { | |
| def _One : BaseClassForSet; | |
| def _Two : BaseClassForSet; | |
| } | |
| defset list<BaseClassForSet> TheSet = { | |
| defm Subset: DefineSubSet; | |
| def Three : BaseClassForSet; | |
| } | |
| // CHECK: [[FILE]]:[[@LINE+1]]:1: note: TheSet = [Subset_One, Subset_Two, Three] | |
| dump "TheSet = " # !repr(TheSet); | |
| // CHECK: [[FILE]]:[[@LINE+1]]:1: note: 0 | |
| dump !repr(!exists<BaseClassForSet>("non-existent-record")); |