Ongoing work: add an edge typechecker, rudimentary support for edge properties.
[oota-llvm.git] / tools / llvmc2 / Common.td
1 //===- Tools.td - Common definitions for LLVMCC  -----------*- tablegen -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains common definitions used in llvmcc tool description files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 class Tool<list<dag> l> {
15       list<dag> properties = l;
16 }
17
18 // Special Tool instance - graph root.
19
20 def root : Tool<[]>;
21
22 // Possible Tool properties
23
24 def in_language;
25 def out_language;
26 def output_suffix;
27 def cmd_line;
28 def join;
29 def sink;
30
31 // Possible option types
32
33 def switch_option;
34 def parameter_option;
35 def parameter_list_option;
36 def prefix_option;
37 def prefix_list_option;
38
39 // Possible option properties
40
41 def append_cmd;
42 def forward;
43 def stop_compilation;
44 def unpack_values;
45 def help;
46 def required;
47
48 // Possible edge properties
49
50 def switch_on;
51 def parameter_equals;
52 def element_in_list;
53
54 // Property combinators
55 // TOFIX: implement
56 def and;
57 def or;
58
59 // Map from suffixes to language names
60
61 class LangToSuffixes<string str, list<string> lst> {
62       string lang = str;
63       list<string> suffixes = lst;
64 }
65
66 class LanguageMap<list<LangToSuffixes> lst> {
67       list<LangToSuffixes> map = lst;
68 }
69
70 // Compilation graph
71
72 class EdgeBase<Tool t1, Tool t2, list<dag> lst> {
73       Tool a = t1;
74       Tool b = t2;
75       list<dag> props = lst;
76 }
77
78 class Edge<Tool t1, Tool t2> : EdgeBase<t1, t2, []>;
79
80 // Edge and DefaultEdge are synonyms.
81 class DefaultEdge<Tool t1, Tool t2> : EdgeBase<t1, t2, []>;
82
83 // Optionally enabled edge.
84 class OptionalEdge<Tool t1, Tool t2, list<dag> lst> : EdgeBase<t1, t2, lst>;
85
86 class CompilationGraph<list<EdgeBase> lst> {
87       list<EdgeBase> edges = lst;
88 }