103 lines
2.9 KiB
TableGen
103 lines
2.9 KiB
TableGen
// 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);
|