1 //===- Base.td - LLVMC toolchain descriptions --------------*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains compilation graph description used by llvmc.
12 //===----------------------------------------------------------------------===//
14 include "llvm/CompilerDriver/Common.td"
18 def OptList : OptionList<[
19 (switch_option "emit-llvm",
20 (help "Emit LLVM .ll files instead of native object files")),
22 (help "Stop after the preprocessing stage, do not run the compiler")),
23 (switch_option "fsyntax-only",
24 (help "Stop after checking the input for syntax errors")),
28 (help "Turn off optimization")),
30 (help "Optimization level 1")),
32 (help "Optimization level 2")),
34 (help "Optimization level 3")),
36 (help "Stop after compilation, do not assemble")),
38 (help "Compile and assemble, but do not link")),
39 (switch_option "pthread",
40 (help "Enable threads")),
41 (switch_option "fPIC",
42 (help "Relocation model: PIC"), (hidden)),
43 (switch_option "mdynamic-no-pic",
44 (help "Relocation model: dynamic-no-pic"), (hidden)),
45 (parameter_option "linker",
46 (help "Choose linker (possible values: gcc, g++)")),
47 (parameter_option "mtune",
48 (help "Target a specific CPU type"), (hidden)),
49 (parameter_option "march",
50 (help "A synonym for -mtune"), (hidden)),
51 (parameter_option "mcpu",
52 (help "A deprecated synonym for -mtune"), (hidden)),
53 (parameter_option "MF",
54 (help "Specify a file to write dependencies to"), (hidden)),
55 (parameter_option "MT",
56 (help "Change the name of the rule emitted by dependency generation"),
58 (parameter_list_option "include",
59 (help "Include the named file prior to preprocessing")),
60 (parameter_list_option "framework",
61 (help "Specifies a framework to link against")),
62 (parameter_list_option "weak_framework",
63 (help "Specifies a framework to weakly link against"), (hidden)),
64 (prefix_list_option "F",
65 (help "Add a directory to framework search path")),
66 (prefix_list_option "I",
67 (help "Add a directory to include path")),
68 (prefix_list_option "D",
69 (help "Define a macro")),
70 (prefix_list_option "Wa,",
71 (help "Pass options to assembler")),
72 (prefix_list_option "Wllc,",
73 (help "Pass options to llc")),
74 (prefix_list_option "L",
75 (help "Add a directory to link path")),
76 (prefix_list_option "l",
77 (help "Search a library when linking")),
78 (prefix_list_option "Wl,",
79 (help "Pass options to linker")),
80 (prefix_list_option "Wo,",
81 (help "Pass options to opt"))
84 // Option preprocessor.
86 def Preprocess : OptionPreprocessor<
87 (case (and (switch_on "O3"), (any_switch_on ["O0", "O1", "O2"])),
88 (unset_option ["O0", "O1", "O2"]),
89 (and (switch_on "O2"), (any_switch_on ["O0", "O1"])),
90 (unset_option ["O0", "O1"]),
91 (and (switch_on "O1"), (switch_on "O0")),
98 class llvm_gcc_based <string cmd_prefix, string in_lang, string E_ext> : Tool<
99 [(in_language in_lang),
100 (out_language "llvm-bitcode"),
101 (output_suffix "bc"),
104 (case (not_empty "o"),
105 !strconcat(cmd_prefix, " -E $INFILE -o $OUTFILE"),
107 !strconcat(cmd_prefix, " -E $INFILE")),
108 (switch_on "fsyntax-only"),
109 !strconcat(cmd_prefix, " -fsyntax-only $INFILE"),
110 (and (switch_on "S"), (switch_on "emit-llvm")),
111 !strconcat(cmd_prefix, " -S $INFILE -o $OUTFILE -emit-llvm"),
113 !strconcat(cmd_prefix, " -c $INFILE -o $OUTFILE -emit-llvm"))),
116 (and (multiple_input_files), (or (switch_on "S"), (switch_on "c"))),
117 (error "cannot specify -o with -c or -S with multiple files"),
118 (switch_on "E"), [(stop_compilation), (output_suffix E_ext)],
119 (and (switch_on "emit-llvm"), (switch_on "S")),
120 [(output_suffix "ll"), (stop_compilation)],
121 (and (switch_on "emit-llvm"), (switch_on "c")), (stop_compilation),
122 (switch_on "fsyntax-only"), (stop_compilation),
123 (not_empty "include"), (forward "include"),
124 (not_empty "save-temps"), (append_cmd "-save-temps"),
125 (not_empty "I"), (forward "I"),
126 (not_empty "F"), (forward "F"),
127 (not_empty "D"), (forward "D"),
128 (not_empty "march"), (forward "march"),
129 (not_empty "mtune"), (forward "mtune"),
130 (not_empty "mcpu"), (forward "mcpu"),
131 (switch_on "O1"), (forward "O1"),
132 (switch_on "O2"), (forward "O2"),
133 (switch_on "O3"), (forward "O3"),
134 (switch_on "fPIC"), (forward "fPIC"),
135 (switch_on "mdynamic-no-pic"), (forward "mdynamic-no-pic"),
136 (not_empty "MF"), (forward "MF"),
137 (not_empty "MT"), (forward "MT"))),
141 def llvm_gcc_c : llvm_gcc_based<"@LLVMGCCCOMMAND@ -x c", "c", "i">;
142 def llvm_gcc_cpp : llvm_gcc_based<"@LLVMGXXCOMMAND@ -x c++", "c++", "i">;
143 def llvm_gcc_m : llvm_gcc_based<"@LLVMGCCCOMMAND@ -x objective-c",
144 "objective-c", "mi">;
145 def llvm_gcc_mxx : llvm_gcc_based<"@LLVMGCCCOMMAND@ -x objective-c++",
146 "objective-c++", "mi">;
149 [(in_language "llvm-bitcode"),
150 (out_language "llvm-bitcode"),
151 (output_suffix "bc"),
152 (actions (case (not_empty "Wo,"), (unpack_values "Wo,"),
153 (switch_on "O1"), (forward "O1"),
154 (switch_on "O2"), (forward "O2"),
155 (switch_on "O3"), (forward "O3"))),
156 (cmd_line "opt -f $INFILE -o $OUTFILE")
160 [(in_language "llvm-assembler"),
161 (out_language "llvm-bitcode"),
162 (output_suffix "bc"),
163 (cmd_line "llvm-as $INFILE -o $OUTFILE"),
164 (actions (case (switch_on "emit-llvm"), (stop_compilation)))
167 def llvm_gcc_assembler : Tool<
168 [(in_language "assembler"),
169 (out_language "object-code"),
171 (cmd_line "@LLVMGCCCOMMAND@ -c -x assembler $INFILE -o $OUTFILE"),
173 (switch_on "c"), (stop_compilation),
174 (not_empty "Wa,"), (unpack_values "Wa,")))
178 [(in_language ["llvm-bitcode", "llvm-assembler"]),
179 (out_language "assembler"),
181 (cmd_line "llc -f $INFILE -o $OUTFILE"),
183 (switch_on "S"), (stop_compilation),
184 (switch_on "O0"), (forward "O0"),
185 (switch_on "O1"), (forward "O1"),
186 (switch_on "O2"), (forward "O2"),
187 (switch_on "O3"), (forward "O3"),
188 (switch_on "fPIC"), (append_cmd "-relocation-model=pic"),
189 (switch_on "mdynamic-no-pic"),
190 (append_cmd "-relocation-model=dynamic-no-pic"),
191 (not_empty "march"), (forward "mcpu"),
192 (not_empty "mtune"), (forward "mcpu"),
193 (not_empty "mcpu"), (forward "mcpu"),
194 (not_empty "Wllc,"), (unpack_values "Wllc,")))
197 // Base class for linkers
198 class llvm_gcc_based_linker <string cmd_prefix> : Tool<
199 [(in_language "object-code"),
200 (out_language "executable"),
201 (output_suffix "out"),
202 (cmd_line !strconcat(cmd_prefix, " $INFILE -o $OUTFILE")),
205 (switch_on "pthread"), (append_cmd "-lpthread"),
206 (not_empty "L"), (forward "L"),
207 (not_empty "F"), (forward "F"),
208 (not_empty "framework"), (forward "framework"),
209 (not_empty "weak_framework"), (forward "weak_framework"),
210 (not_empty "l"), (forward "l"),
211 (not_empty "Wl,"), (forward "Wl,")))
215 def llvm_gcc_linker : llvm_gcc_based_linker<"@LLVMGCCCOMMAND@">;
216 // Alternative linker for C++
217 def llvm_gcc_cpp_linker : llvm_gcc_based_linker<"@LLVMGXXCOMMAND@">;
221 def LanguageMap : LanguageMap<
222 [LangToSuffixes<"c++", ["cc", "cp", "cxx", "cpp", "CPP", "c++", "C"]>,
223 LangToSuffixes<"c", ["c"]>,
224 LangToSuffixes<"c-cpp-output", ["i"]>,
225 LangToSuffixes<"objective-c-cpp-output", ["mi"]>,
226 LangToSuffixes<"objective-c++", ["mm"]>,
227 LangToSuffixes<"objective-c", ["m"]>,
228 LangToSuffixes<"assembler", ["s"]>,
229 LangToSuffixes<"assembler-with-cpp", ["S"]>,
230 LangToSuffixes<"llvm-assembler", ["ll"]>,
231 LangToSuffixes<"llvm-bitcode", ["bc"]>,
232 LangToSuffixes<"object-code", ["o"]>,
233 LangToSuffixes<"executable", ["out"]>
238 def CompilationGraph : CompilationGraph<[
239 Edge<"root", "llvm_gcc_c">,
240 Edge<"root", "llvm_gcc_assembler">,
241 Edge<"root", "llvm_gcc_cpp">,
242 Edge<"root", "llvm_gcc_m">,
243 Edge<"root", "llvm_gcc_mxx">,
246 Edge<"llvm_gcc_c", "llc">,
247 Edge<"llvm_gcc_cpp", "llc">,
248 Edge<"llvm_gcc_m", "llc">,
249 Edge<"llvm_gcc_mxx", "llc">,
250 Edge<"llvm_as", "llc">,
252 OptionalEdge<"root", "llvm_as",
253 (case (switch_on "emit-llvm"), (inc_weight))>,
254 OptionalEdge<"llvm_gcc_c", "opt", (case (switch_on "opt"), (inc_weight))>,
255 OptionalEdge<"llvm_gcc_cpp", "opt", (case (switch_on "opt"), (inc_weight))>,
256 OptionalEdge<"llvm_gcc_m", "opt", (case (switch_on "opt"), (inc_weight))>,
257 OptionalEdge<"llvm_gcc_mxx", "opt", (case (switch_on "opt"), (inc_weight))>,
258 OptionalEdge<"llvm_as", "opt", (case (switch_on "opt"), (inc_weight))>,
261 Edge<"llc", "llvm_gcc_assembler">,
262 Edge<"llvm_gcc_assembler", "llvm_gcc_linker">,
263 OptionalEdge<"llvm_gcc_assembler", "llvm_gcc_cpp_linker",
265 (or (input_languages_contain "c++"),
266 (input_languages_contain "objective-c++")),
268 (or (parameter_equals "linker", "g++"),
269 (parameter_equals "linker", "c++")), (inc_weight))>,
272 Edge<"root", "llvm_gcc_linker">,
273 OptionalEdge<"root", "llvm_gcc_cpp_linker",
275 (or (input_languages_contain "c++"),
276 (input_languages_contain "objective-c++")),
278 (or (parameter_equals "linker", "g++"),
279 (parameter_equals "linker", "c++")), (inc_weight))>