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")),
42 (help "Generate code for a 32-bit environment"), (hidden)),
44 (help "Generate code for a 64-bit environment"), (hidden)),
45 (switch_option "fPIC",
46 (help "Relocation model: PIC"), (hidden)),
47 (switch_option "mdynamic-no-pic",
48 (help "Relocation model: dynamic-no-pic"), (hidden)),
49 (parameter_option "linker",
50 (help "Choose linker (possible values: gcc, g++)")),
51 (parameter_option "mtune",
52 (help "Target a specific CPU type"), (hidden)),
54 // TODO: Add a conditional compilation mechanism to make Darwin-only options
55 // like '-arch' really Darwin-only.
57 (parameter_option "arch",
58 (help "Compile for the specified target architecture"), (hidden)),
59 (parameter_option "march",
60 (help "A synonym for -mtune"), (hidden)),
61 (parameter_option "mcpu",
62 (help "A deprecated synonym for -mtune"), (hidden)),
63 (switch_option "mfix-and-continue",
64 (help "Needed by gdb to load .o files dynamically"), (hidden)),
65 (parameter_option "MF",
66 (help "Specify a file to write dependencies to"), (hidden)),
67 (parameter_list_option "MT",
68 (help "Change the name of the rule emitted by dependency generation"),
70 (parameter_list_option "include",
71 (help "Include the named file prior to preprocessing")),
72 (parameter_list_option "iquote",
73 (help "Search dir only for files requested with #inlcude \"file\""),
75 (parameter_list_option "framework",
76 (help "Specifies a framework to link against")),
77 (parameter_list_option "weak_framework",
78 (help "Specifies a framework to weakly link against"), (hidden)),
79 (parameter_option "filelist", (hidden),
80 (help "Link the files listed in file")),
81 (prefix_list_option "F",
82 (help "Add a directory to framework search path")),
83 (prefix_list_option "I",
84 (help "Add a directory to include path")),
85 (prefix_list_option "D",
86 (help "Define a macro")),
87 (prefix_list_option "Wa,", (comma_separated),
88 (help "Pass options to assembler")),
89 (prefix_list_option "Wllc,", (comma_separated),
90 (help "Pass options to llc")),
91 (prefix_list_option "L",
92 (help "Add a directory to link path")),
93 (prefix_list_option "l",
94 (help "Search a library when linking")),
95 (prefix_list_option "Wl,",
96 (help "Pass options to linker")),
97 (prefix_list_option "Wo,", (comma_separated),
98 (help "Pass options to opt")),
99 (prefix_list_option "m",
100 (help "Enable or disable various extensions (-mmmx, -msse, etc.)"),
102 (switch_option "dynamiclib", (hidden),
103 (help "Produce a dynamic library")),
104 (switch_option "prebind", (hidden),
105 (help "Prebind all undefined symbols")),
106 (switch_option "dead_strip", (hidden),
107 (help "Remove unreachable blocks of code")),
108 (switch_option "single_module", (hidden),
109 (help "Build the library so it contains only one module")),
110 (parameter_option "install_name", (hidden),
111 (help "File name the library will be installed in")),
112 (parameter_option "compatibility_version", (hidden),
113 (help "Compatibility version number")),
114 (parameter_option "current_version", (hidden),
115 (help "Current version number"))
118 // Option preprocessor.
120 def Preprocess : OptionPreprocessor<
121 (case (not (any_switch_on ["O0", "O1", "O2", "O3"])),
123 (and (switch_on "O3"), (any_switch_on ["O0", "O1", "O2"])),
124 (unset_option ["O0", "O1", "O2"]),
125 (and (switch_on "O2"), (any_switch_on ["O0", "O1"])),
126 (unset_option ["O0", "O1"]),
127 (switch_on ["O1", "O0"]),
133 class llvm_gcc_based <string cmd_prefix, string in_lang, string E_ext> : Tool<
134 [(in_language in_lang),
135 (out_language "llvm-bitcode"),
136 (output_suffix "bc"),
139 (case (not_empty "o"),
140 !strconcat(cmd_prefix, " -E $INFILE -o $OUTFILE"),
142 !strconcat(cmd_prefix, " -E $INFILE")),
143 (switch_on "fsyntax-only"),
144 !strconcat(cmd_prefix, " -fsyntax-only $INFILE"),
145 (and (switch_on "S"), (switch_on "emit-llvm")),
146 !strconcat(cmd_prefix, " -S $INFILE -o $OUTFILE -emit-llvm"),
148 !strconcat(cmd_prefix, " -c $INFILE -o $OUTFILE -emit-llvm"))),
151 (and (multiple_input_files), (or (switch_on "S"), (switch_on "c"))),
152 (error "cannot specify -o with -c or -S with multiple files"),
153 (switch_on "E"), [(stop_compilation), (output_suffix E_ext)],
154 (switch_on ["emit-llvm", "S"]),
155 [(output_suffix "ll"), (stop_compilation)],
156 (switch_on ["emit-llvm", "c"]), (stop_compilation),
157 (switch_on "fsyntax-only"), (stop_compilation),
158 (not_empty "include"), (forward "include"),
159 (not_empty "iquote"), (forward "iquote"),
160 (not_empty "save-temps"), (append_cmd "-save-temps"),
161 (not_empty "I"), (forward "I"),
162 (not_empty "F"), (forward "F"),
163 (not_empty "D"), (forward "D"),
164 (not_empty "arch"), (forward "arch"),
165 (not_empty "march"), (forward "march"),
166 (not_empty "mtune"), (forward "mtune"),
167 (not_empty "mcpu"), (forward "mcpu"),
168 (not_empty "m"), (forward "m"),
169 (switch_on "mfix-and-continue"), (forward "mfix-and-continue"),
170 (switch_on "m32"), (forward "m32"),
171 (switch_on "m64"), (forward "m64"),
172 (switch_on "O0"), (forward "O0"),
173 (switch_on "O1"), (forward "O1"),
174 (switch_on "O2"), (forward "O2"),
175 (switch_on "O3"), (forward "O3"),
176 (switch_on "fPIC"), (forward "fPIC"),
177 (switch_on "mdynamic-no-pic"), (forward "mdynamic-no-pic"),
178 (not_empty "MF"), (forward "MF"),
179 (not_empty "MT"), (forward "MT"))),
183 def llvm_gcc_c : llvm_gcc_based<"@LLVMGCCCOMMAND@ -x c", "c", "i">;
184 def llvm_gcc_cpp : llvm_gcc_based<"@LLVMGXXCOMMAND@ -x c++", "c++", "i">;
185 def llvm_gcc_m : llvm_gcc_based<"@LLVMGCCCOMMAND@ -x objective-c",
186 "objective-c", "mi">;
187 def llvm_gcc_mxx : llvm_gcc_based<"@LLVMGCCCOMMAND@ -x objective-c++",
188 "objective-c++", "mi">;
191 [(in_language "llvm-bitcode"),
192 (out_language "llvm-bitcode"),
193 (output_suffix "bc"),
194 (actions (case (not_empty "Wo,"), (forward_value "Wo,"),
195 (switch_on "O1"), (forward "O1"),
196 (switch_on "O2"), (forward "O2"),
197 (switch_on "O3"), (forward "O3"))),
198 (cmd_line "opt -f $INFILE -o $OUTFILE")
202 [(in_language "llvm-assembler"),
203 (out_language "llvm-bitcode"),
204 (output_suffix "bc"),
205 (cmd_line "llvm-as $INFILE -o $OUTFILE"),
206 (actions (case (switch_on "emit-llvm"), (stop_compilation)))
209 def llvm_gcc_assembler : Tool<
210 [(in_language "assembler"),
211 (out_language "object-code"),
213 (cmd_line "@LLVMGCCCOMMAND@ -c -x assembler $INFILE -o $OUTFILE"),
215 (switch_on "c"), (stop_compilation),
216 (not_empty "arch"), (forward "arch"),
217 (not_empty "Wa,"), (forward_value "Wa,")))
221 [(in_language ["llvm-bitcode", "llvm-assembler"]),
222 (out_language "assembler"),
224 (cmd_line "llc -f $INFILE -o $OUTFILE"),
226 (switch_on "S"), (stop_compilation),
227 (switch_on "O0"), (forward "O0"),
228 (switch_on "O1"), (forward "O1"),
229 (switch_on "O2"), (forward "O2"),
230 (switch_on "O3"), (forward "O3"),
231 (switch_on "fPIC"), (append_cmd "-relocation-model=pic"),
232 (switch_on "mdynamic-no-pic"),
233 (append_cmd "-relocation-model=dynamic-no-pic"),
234 (not_empty "march"), (forward "mcpu"),
235 (not_empty "mtune"), (forward "mcpu"),
236 (not_empty "mcpu"), (forward "mcpu"),
237 (not_empty "m"), (forward_transformed_value "m", "ConvertToMAttr"),
238 (not_empty "Wllc,"), (forward_value "Wllc,")))
241 // Base class for linkers
242 class llvm_gcc_based_linker <string cmd_prefix> : Tool<
243 [(in_language "object-code"),
244 (out_language "executable"),
245 (output_suffix "out"),
246 (cmd_line !strconcat(cmd_prefix, " $INFILE -o $OUTFILE")),
247 (works_on_empty (case (not_empty "filelist"), true,
251 (switch_on "pthread"), (append_cmd "-lpthread"),
252 (not_empty "L"), (forward "L"),
253 (not_empty "F"), (forward "F"),
254 (not_empty "arch"), (forward "arch"),
255 (not_empty "framework"), (forward "framework"),
256 (not_empty "weak_framework"), (forward "weak_framework"),
257 (not_empty "filelist"), (forward "filelist"),
258 (switch_on "m32"), (forward "m32"),
259 (switch_on "m64"), (forward "m64"),
260 (not_empty "l"), (forward "l"),
261 (not_empty "Wl,"), (forward "Wl,"),
262 (switch_on "dynamiclib"), (forward "dynamiclib"),
263 (switch_on "prebind"), (forward "prebind"),
264 (switch_on "dead_strip"), (forward "dead_strip"),
265 (switch_on "single_module"), (forward "single_module"),
266 (not_empty "compatibility_version"),
267 (forward "compatibility_version"),
268 (not_empty "current_version"), (forward "current_version"),
269 (not_empty "install_name"), (forward "install_name")))
273 def llvm_gcc_linker : llvm_gcc_based_linker<"@LLVMGCCCOMMAND@">;
274 // Alternative linker for C++
275 def llvm_gcc_cpp_linker : llvm_gcc_based_linker<"@LLVMGXXCOMMAND@">;
279 def LanguageMap : LanguageMap<
280 [LangToSuffixes<"c++", ["cc", "cp", "cxx", "cpp", "CPP", "c++", "C"]>,
281 LangToSuffixes<"c", ["c"]>,
282 LangToSuffixes<"c-cpp-output", ["i"]>,
283 LangToSuffixes<"objective-c-cpp-output", ["mi"]>,
284 LangToSuffixes<"objective-c++", ["mm"]>,
285 LangToSuffixes<"objective-c", ["m"]>,
286 LangToSuffixes<"assembler", ["s"]>,
287 LangToSuffixes<"assembler-with-cpp", ["S"]>,
288 LangToSuffixes<"llvm-assembler", ["ll"]>,
289 LangToSuffixes<"llvm-bitcode", ["bc"]>,
290 LangToSuffixes<"object-code", ["o"]>,
291 LangToSuffixes<"executable", ["out"]>
296 def CompilationGraph : CompilationGraph<[
297 Edge<"root", "llvm_gcc_c">,
298 Edge<"root", "llvm_gcc_assembler">,
299 Edge<"root", "llvm_gcc_cpp">,
300 Edge<"root", "llvm_gcc_m">,
301 Edge<"root", "llvm_gcc_mxx">,
304 Edge<"llvm_gcc_c", "llc">,
305 Edge<"llvm_gcc_cpp", "llc">,
306 Edge<"llvm_gcc_m", "llc">,
307 Edge<"llvm_gcc_mxx", "llc">,
308 Edge<"llvm_as", "llc">,
310 OptionalEdge<"root", "llvm_as",
311 (case (switch_on "emit-llvm"), (inc_weight))>,
312 OptionalEdge<"llvm_gcc_c", "opt", (case (switch_on "opt"), (inc_weight))>,
313 OptionalEdge<"llvm_gcc_cpp", "opt", (case (switch_on "opt"), (inc_weight))>,
314 OptionalEdge<"llvm_gcc_m", "opt", (case (switch_on "opt"), (inc_weight))>,
315 OptionalEdge<"llvm_gcc_mxx", "opt", (case (switch_on "opt"), (inc_weight))>,
316 OptionalEdge<"llvm_as", "opt", (case (switch_on "opt"), (inc_weight))>,
319 Edge<"llc", "llvm_gcc_assembler">,
320 Edge<"llvm_gcc_assembler", "llvm_gcc_linker">,
321 OptionalEdge<"llvm_gcc_assembler", "llvm_gcc_cpp_linker",
323 (or (input_languages_contain "c++"),
324 (input_languages_contain "objective-c++")),
326 (or (parameter_equals "linker", "g++"),
327 (parameter_equals "linker", "c++")), (inc_weight))>,
330 Edge<"root", "llvm_gcc_linker">,
331 OptionalEdge<"root", "llvm_gcc_cpp_linker",
333 (or (input_languages_contain "c++"),
334 (input_languages_contain "objective-c++")),
336 (or (parameter_equals "linker", "g++"),
337 (parameter_equals "linker", "c++")), (inc_weight))>