33af18260f823462ed2c00e6755ad08a6df31cd6
[oota-llvm.git] / tools / llvmc / example / mcc16 / plugins / PIC16Base / PIC16Base.td
1 //===- PIC16Base.td - PIC16 toolchain driver ---------------*- tablegen -*-===//
2 //
3 // A basic driver for the PIC16 toolchain.
4 //
5 //===----------------------------------------------------------------------===//
6
7 include "llvm/CompilerDriver/Common.td"
8
9 // Options
10
11 def OptionList : OptionList<[
12  (switch_option "g",
13     (help "Enable Debugging")),
14  (switch_option "E",
15     (help "Stop after preprocessing, do not compile")),
16  (switch_option "S",
17     (help "Stop after compilation, do not assemble")),
18  (switch_option "bc",
19     (help "Stop after b-code generation, do not compile")),
20  (switch_option "c",
21     (help "Stop after assemble, do not link")),
22  (prefix_option "p",
23     (help "Specify part name")),
24  (prefix_list_option "I",
25     (help "Add a directory to include path")),
26  (prefix_list_option "L",
27     (help "Add a directory to library path")),
28  (prefix_list_option "K",
29     (help "Add a directory to linker script search path")),
30  (parameter_option "l",
31     (help "Specify a library to link")),
32  (parameter_option "k",
33     (help "Specify a linker script")),
34  (parameter_option "m",
35     (help "Generate linker map file with the given name")),
36  (prefix_list_option "D",
37     (help "Define a macro")),
38  (switch_option "X",
39     (help "Do not invoke mp2hex to create an output hex file.")),
40  (switch_option "O0",
41     (help "Do not optimize")),
42  (switch_option "O1",
43     (help "Optimization Level 1.")),
44  (switch_option "O2",
45     (help "Optimization Level 2.")),
46  (switch_option "O3",
47     (help "Optimization Level 3.")),
48  (switch_option "Od",
49     (help "Perform Debug-safe Optimizations only.")),
50  (switch_option "w",
51     (help "Disable all warnings.")),
52 // (switch_option "O1",
53 //    (help "Optimization level 1")),
54 // (switch_option "O2",
55 //    (help "Optimization level 2. (Default)")),
56 // (parameter_option "pre-RA-sched",
57 //    (help "Example of an option that is passed to llc")),
58  (parameter_option "regalloc",
59     (help "Register allocator to use (possible values: simple, linearscan, pbqp, local; default=linearscan)")),
60  (prefix_list_option "Wa,", (comma_separated),
61     (help "Pass options to assembler (Run 'gpasm -help' for assembler options)")),
62  (prefix_list_option "Wl,", (comma_separated),
63     (help "Pass options to linker (Run 'mplink -help' for linker options)"))
64 // (prefix_list_option "Wllc,",
65 //    (help "Pass options to llc")),
66 // (prefix_list_option "Wo,",
67 //    (help "Pass options to llvm-ld"))
68 ]>;
69
70 // Tools
71 class clang_based<string language, string cmd, string ext_E> : Tool<
72 [(in_language language),
73  (out_language "llvm-bitcode"),
74  (output_suffix "bc"),
75  (cmd_line (case
76            (switch_on "E"),
77            (case 
78               (not_empty "o"), !strconcat(cmd, " -E $INFILE -o $OUTFILE"),
79               (default), !strconcat(cmd, " -E $INFILE")),
80            (default), !strconcat(cmd, " $INFILE -o $OUTFILE"))),
81  (actions (case 
82                 (and (multiple_input_files), (or (switch_on "S"), (switch_on "c"))),
83               (error "cannot specify -o with -c or -S with multiple files"),
84                 (switch_on "E"), [(stop_compilation), (output_suffix ext_E)],
85                 (switch_on "bc"),[(stop_compilation), (output_suffix "bc")],
86                 (switch_on "g"), (append_cmd "-g"),
87                 (switch_on "w"), (append_cmd "-w"),
88                 (switch_on "O1"), (append_cmd ""),
89                 (switch_on "O2"), (append_cmd ""),
90                 (switch_on "O3"), (append_cmd ""),
91                 (switch_on "Od"), (append_cmd ""),
92                 (not_empty "D"), (forward "D"),
93                 (not_empty "I"), (forward "I"),
94                 (switch_on "O0"), (append_cmd "-O0"),
95                 (default), (append_cmd "-O1")))
96 // (sink)
97 ]>;
98
99 def clang_cc : clang_based<"c", "$CALL(GetBinDir)clang -cc1                                                        -I $CALL(GetStdHeadersDir)                                                      -D $CALL(GetLowerCasePartDefine)                                                -D $CALL(GetUpperCasePartDefine) -triple=pic16-                                 -emit-llvm-bc ", "i">;
100
101 //def clang_cc : Tool<[
102 // (in_language "c"),
103 // (out_language "llvm-bitcode"),
104 // (output_suffix "bc"),
105 // (cmd_line "$CALL(GetBinDir)clang-cc -I $CALL(GetStdHeadersDir) -triple=pic16- -emit-llvm-bc "),
106 // (cmd_line kkkkk
107 // (actions (case
108 //          (switch_on "g"), (append_cmd "g"),
109 //          (not_empty "I"), (forward "I"))),
110 // (sink)
111 //]>;
112
113
114 // pre-link-and-lto step.
115 def llvm_ld : Tool<[
116  (in_language "llvm-bitcode"),
117  (out_language "llvm-bitcode"),
118  (output_suffix "bc"),
119  (cmd_line "$CALL(GetBinDir)llvm-ld -L $CALL(GetStdLibsDir) -disable-gvn -disable-licm-promotion -disable-mem2reg $INFILE -b $OUTFILE -l std"),
120  (actions (case
121           (switch_on "O0"), (append_cmd "-disable-opt"),
122           (switch_on "O1"), (append_cmd "-disable-opt"),
123 // Whenever O3 is not specified on the command line, default i.e. disable-inlining will always be added.
124           (switch_on "O2"), (append_cmd ""), 
125           (switch_on "O3"), (append_cmd ""),
126           (default), (append_cmd "-disable-inlining"))),
127  (join)
128 ]>;
129
130 // optimize single file
131 def llvm_ld_optimizer : Tool<[
132  (in_language "llvm-bitcode"),
133  (out_language "llvm-bitcode"),
134  (output_suffix "bc"),
135 // FIXME: we are still not disabling licm-promotion.
136 // -disable-licm-promotion and building stdn library causes c16-71 to fail.
137  (cmd_line "$CALL(GetBinDir)llvm-ld -disable-gvn -disable-mem2reg                              $INFILE -b $OUTFILE"),
138  (actions (case
139           (switch_on "O0"), (append_cmd "-disable-opt"),
140           (switch_on "O1"), (append_cmd "-disable-opt"),
141 // Whenever O3 is not specified on the command line, default i.e. disable-inlining will always be added.
142           (switch_on "O2"), (append_cmd ""), 
143           (switch_on "O3"), (append_cmd ""),
144           (default), (append_cmd "-disable-inlining")))
145 ]>;
146
147 // optimizer step.
148 def pic16passes : Tool<[
149  (in_language "llvm-bitcode"),
150  (out_language "llvm-bitcode"),
151  (output_suffix "obc"),
152  (cmd_line "$CALL(GetBinDir)opt -pic16cg -pic16overlay $INFILE -f -o $OUTFILE"),
153  (actions (case
154           (switch_on "O0"), (append_cmd "-disable-opt")))
155 ]>;
156
157 def llc : Tool<[
158  (in_language "llvm-bitcode"),
159  (out_language "assembler"),
160  (output_suffix "s"),
161  (cmd_line "$CALL(GetBinDir)llc -march=pic16 -disable-jump-tables -pre-RA-sched=list-burr -f $INFILE -o $OUTFILE"),
162  (actions (case
163           (switch_on "S"), (stop_compilation),
164 //          (not_empty "Wllc,"), (unpack_values "Wllc,"),
165 //         (not_empty "pre-RA-sched"), (forward "pre-RA-sched")))
166          (not_empty "regalloc"), (forward "regalloc"),
167          (empty "regalloc"), (append_cmd "-regalloc=linearscan")))
168 ]>;
169
170 def gpasm : Tool<[
171  (in_language "assembler"),
172  (out_language "object-code"),
173  (output_suffix "o"),
174  (cmd_line "$CALL(GetBinDir)gpasm -z -r decimal -I $CALL(GetStdAsmHeadersDir) -C -c -w 2 $INFILE -o $OUTFILE"),
175  (actions (case
176           (switch_on "c"), (stop_compilation),
177           (switch_on "g"), (append_cmd "-g"),
178           (not_empty "p"), (forward "p"),
179           (empty "p"), (append_cmd "-p 16f1xxx"),
180           (not_empty "Wa,"), (forward_value "Wa,")))
181 ]>;
182
183 def mplink : Tool<[
184  (in_language "object-code"),
185  (out_language "executable"),
186  (output_suffix "cof"),
187  (cmd_line "$CALL(GetBinDir)mplink -e -k $CALL(GetStdLinkerScriptsDir) -l $CALL(GetStdLibsDir) intrinsics.lib stdn.lib $INFILE -o $OUTFILE"),
188  (actions (case
189           (not_empty "Wl,"), (forward_value "Wl,"),
190           (switch_on "X"), (append_cmd "-x"),
191           (not_empty "L"), (forward_as "L", "-l"),
192           (not_empty "K"), (forward_as "K", "-k"),
193           (not_empty "m"), (forward "m"),
194           (not_empty "p"), [(forward "p"), (append_cmd "-c")],
195           (empty "p"), (append_cmd "-p 16f1xxx -c"),
196 //          (not_empty "l"), [(unpack_values "l"),(append_cmd ".lib")])),
197           (not_empty "k"), (forward "k"),
198           (not_empty "l"), (forward "l"))),
199  (join)
200 ]>;
201
202 // Language map
203
204 def LanguageMap : LanguageMap<[
205     LangToSuffixes<"c", ["c"]>,
206     LangToSuffixes<"c-cpp-output", ["i"]>,
207     LangToSuffixes<"assembler", ["s"]>,
208     LangToSuffixes<"assembler-with-cpp", ["S"]>,
209     LangToSuffixes<"llvm-assembler", ["ll"]>,
210     LangToSuffixes<"llvm-bitcode", ["bc"]>,
211     LangToSuffixes<"object-code", ["o"]>,
212     LangToSuffixes<"executable", ["cof"]>
213 ]>;
214
215 // Compilation graph
216
217 def CompilationGraph : CompilationGraph<[
218     Edge<"root", "clang_cc">,
219     Edge<"root", "llvm_ld">,
220     OptionalEdge<"root", "llvm_ld_optimizer", (case 
221                                          (switch_on "S"), (inc_weight),
222                                          (switch_on "c"), (inc_weight))>,
223     Edge<"root", "gpasm">,
224     Edge<"root", "mplink">,
225     Edge<"clang_cc", "llvm_ld">,
226     OptionalEdge<"clang_cc", "llvm_ld_optimizer", (case 
227                                          (switch_on "S"), (inc_weight),
228                                          (switch_on "c"), (inc_weight))>,
229     Edge<"llvm_ld", "pic16passes">,
230     Edge<"llvm_ld_optimizer", "pic16passes">,
231     Edge<"pic16passes", "llc">,
232     Edge<"llc", "gpasm">,
233     Edge<"gpasm", "mplink">
234 ]>;