mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
7cabd2e787
Add some data structures to represent for loops. These will be referenced during object processing to do any needed iteration and instantiation. Add foreach keyword support to the lexer. Add a mode to indicate that we're parsing a foreach loop. This allows the value parser to early-out when processing the foreach value list. Add a routine to parse foreach iteration declarations. This is separate from ParseDeclaration because the type of the named value (the iterator) doesn't match the type of the initializer value (the value list). It also needs to add two values to the foreach record: the iterator and the value list. Add parsing support for foreach. Add the code to process foreach loops and create defs based on iterator values. Allow foreach loops to be matched at the top level. When parsing an IDValue check if it is a foreach loop iterator for one of the active loops. If so, return a VarInit for it. Add Emacs keyword support for foreach. Add VIM keyword support for foreach. Add tests to check foreach operation. Add TableGen documentation for foreach. Support foreach with multiple objects. Support non-braced foreach body with one object. Do not require types for the foreach declaration. Assume the iterator type from the iteration list element type. llvm-svn: 151164
77 lines
1.4 KiB
TableGen
77 lines
1.4 KiB
TableGen
// RUN: llvm-tblgen %s | FileCheck %s
|
|
// XFAIL: vg_leak
|
|
|
|
class Register<string name, int idx> {
|
|
string Name = name;
|
|
int Index = idx;
|
|
}
|
|
|
|
foreach i = [0, 1, 2, 3, 4, 5, 6, 7] in {
|
|
def R#i : Register<"R"#i, i>;
|
|
def F#i : Register<"F"#i, i>;
|
|
}
|
|
|
|
// CHECK: def F0
|
|
// CHECK: string Name = "F0";
|
|
// CHECK: int Index = 0;
|
|
|
|
// CHECK: def F1
|
|
// CHECK: string Name = "F1";
|
|
// CHECK: int Index = 1;
|
|
|
|
// CHECK: def F2
|
|
// CHECK: string Name = "F2";
|
|
// CHECK: int Index = 2;
|
|
|
|
// CHECK: def F3
|
|
// CHECK: string Name = "F3";
|
|
// CHECK: int Index = 3;
|
|
|
|
// CHECK: def F4
|
|
// CHECK: string Name = "F4";
|
|
// CHECK: int Index = 4;
|
|
|
|
// CHECK: def F5
|
|
// CHECK: string Name = "F5";
|
|
// CHECK: int Index = 5;
|
|
|
|
// CHECK: def F6
|
|
// CHECK: string Name = "F6";
|
|
// CHECK: int Index = 6;
|
|
|
|
// CHECK: def F7
|
|
// CHECK: string Name = "F7";
|
|
// CHECK: int Index = 7;
|
|
|
|
// CHECK: def R0
|
|
// CHECK: string Name = "R0";
|
|
// CHECK: int Index = 0;
|
|
|
|
// CHECK: def R1
|
|
// CHECK: string Name = "R1";
|
|
// CHECK: int Index = 1;
|
|
|
|
// CHECK: def R2
|
|
// CHECK: string Name = "R2";
|
|
// CHECK: int Index = 2;
|
|
|
|
// CHECK: def R3
|
|
// CHECK: string Name = "R3";
|
|
// CHECK: int Index = 3;
|
|
|
|
// CHECK: def R4
|
|
// CHECK: string Name = "R4";
|
|
// CHECK: int Index = 4;
|
|
|
|
// CHECK: def R5
|
|
// CHECK: string Name = "R5";
|
|
// CHECK: int Index = 5;
|
|
|
|
// CHECK: def R6
|
|
// CHECK: string Name = "R6";
|
|
// CHECK: int Index = 6;
|
|
|
|
// CHECK: def R7
|
|
// CHECK: string Name = "R7";
|
|
// CHECK: int Index = 7;
|