diff options
Diffstat (limited to 'contrib/llvm/tools/llvmc/examples/mcc16/PIC16.td')
-rw-r--r-- | contrib/llvm/tools/llvmc/examples/mcc16/PIC16.td | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/contrib/llvm/tools/llvmc/examples/mcc16/PIC16.td b/contrib/llvm/tools/llvmc/examples/mcc16/PIC16.td new file mode 100644 index 0000000..6f04196 --- /dev/null +++ b/contrib/llvm/tools/llvmc/examples/mcc16/PIC16.td @@ -0,0 +1,234 @@ +//===- PIC16.td - PIC16 toolchain driver -------------------*- tablegen -*-===// +// +// A basic driver for the PIC16 toolchain. +// +//===----------------------------------------------------------------------===// + +include "llvm/CompilerDriver/Common.td" + +// Options + +def OptionList : OptionList<[ + (switch_option "g", + (help "Enable Debugging")), + (switch_option "E", + (help "Stop after preprocessing, do not compile")), + (switch_option "S", + (help "Stop after compilation, do not assemble")), + (switch_option "bc", + (help "Stop after b-code generation, do not compile")), + (switch_option "c", + (help "Stop after assemble, do not link")), + (prefix_option "p", + (help "Specify part name")), + (prefix_list_option "I", + (help "Add a directory to include path")), + (prefix_list_option "L", + (help "Add a directory to library path")), + (prefix_list_option "K", + (help "Add a directory to linker script search path")), + (parameter_option "l", + (help "Specify a library to link")), + (parameter_option "k", + (help "Specify a linker script")), + (parameter_option "m", + (help "Generate linker map file with the given name")), + (prefix_list_option "D", + (help "Define a macro")), + (switch_option "X", + (help "Do not invoke mp2hex to create an output hex file.")), + (switch_option "O0", + (help "Do not optimize")), + (switch_option "O1", + (help "Optimization Level 1.")), + (switch_option "O2", + (help "Optimization Level 2.")), + (switch_option "O3", + (help "Optimization Level 3.")), + (switch_option "Od", + (help "Perform Debug-safe Optimizations only.")), + (switch_option "w", + (help "Disable all warnings.")), +// (switch_option "O1", +// (help "Optimization level 1")), +// (switch_option "O2", +// (help "Optimization level 2. (Default)")), +// (parameter_option "pre-RA-sched", +// (help "Example of an option that is passed to llc")), + (parameter_option "regalloc", + (help "Register allocator to use (possible values: simple, linearscan, pbqp, local; default=linearscan)")), + (prefix_list_option "Wa,", (comma_separated), + (help "Pass options to assembler (Run 'gpasm -help' for assembler options)")), + (prefix_list_option "Wl,", (comma_separated), + (help "Pass options to linker (Run 'mplink -help' for linker options)")) +// (prefix_list_option "Wllc,", +// (help "Pass options to llc")), +// (prefix_list_option "Wo,", +// (help "Pass options to llvm-ld")) +]>; + +// Tools +class clang_based<string language, string cmd, string ext_E> : Tool< +[(in_language language), + (out_language "llvm-bitcode"), + (output_suffix "bc"), + (command cmd), + (actions (case + (and (multiple_input_files), + (or (switch_on "S"), (switch_on "c"))), + (error "cannot specify -o with -c or -S with multiple files"), + (switch_on "E"), [(forward "E"), + (stop_compilation), (output_suffix ext_E)], + (and (switch_on "E"), (empty "o")), (no_out_file), + (switch_on "bc"),[(stop_compilation), (output_suffix "bc")], + (switch_on "g"), (append_cmd "-g"), + (switch_on "w"), (append_cmd "-w"), + (switch_on "O1"), (append_cmd ""), + (switch_on "O2"), (append_cmd ""), + (switch_on "O3"), (append_cmd ""), + (switch_on "Od"), (append_cmd ""), + (not_empty "D"), (forward "D"), + (not_empty "I"), (forward "I"), + (switch_on "O0"), (append_cmd "-O0"), + (default), (append_cmd "-O1"))) +// (sink) +]>; + +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">; + +//def clang_cc : Tool<[ +// (in_language "c"), +// (out_language "llvm-bitcode"), +// (output_suffix "bc"), +// (cmd_line "$CALL(GetBinDir)clang-cc -I $CALL(GetStdHeadersDir) -triple=pic16- -emit-llvm-bc "), +// (cmd_line kkkkk +// (actions (case +// (switch_on "g"), (append_cmd "g"), +// (not_empty "I"), (forward "I"))), +// (sink) +//]>; + + +// pre-link-and-lto step. +def llvm_ld : Tool<[ + (in_language "llvm-bitcode"), + (out_language "llvm-bitcode"), + (output_suffix "bc"), + (command "$CALL(GetBinDir)llvm-ld -L $CALL(GetStdLibsDir) -disable-licm-promotion -l std"), + (out_file_option "-b"), + (actions (case + (switch_on "O0"), (append_cmd "-disable-opt"), + (switch_on "O1"), (append_cmd "-disable-opt"), +// Whenever O3 is not specified on the command line, default i.e. disable-inlining will always be added. + (switch_on "O2"), (append_cmd ""), + (switch_on "O3"), (append_cmd ""), + (default), (append_cmd "-disable-inlining"))), + (join) +]>; + +// optimize single file +def llvm_ld_optimizer : Tool<[ + (in_language "llvm-bitcode"), + (out_language "llvm-bitcode"), + (output_suffix "bc"), +// FIXME: we are still not disabling licm-promotion. +// -disable-licm-promotion and building stdn library causes c16-71 to fail. + (command "$CALL(GetBinDir)llvm-ld "), + (out_file_option "-b"), + (actions (case + (switch_on "O0"), (append_cmd "-disable-opt"), + (switch_on "O1"), (append_cmd "-disable-opt"), +// Whenever O3 is not specified on the command line, default i.e. disable-inlining will always be added. + (switch_on "O2"), (append_cmd ""), + (switch_on "O3"), (append_cmd ""), + (default), (append_cmd "-disable-inlining"))) +]>; + +// optimizer step. +def pic16passes : Tool<[ + (in_language "llvm-bitcode"), + (out_language "llvm-bitcode"), + (output_suffix "obc"), + (command "$CALL(GetBinDir)opt -pic16cloner -pic16overlay -f"), + (actions (case + (switch_on "O0"), (append_cmd "-disable-opt"))) +]>; + +def llc : Tool<[ + (in_language "llvm-bitcode"), + (out_language "assembler"), + (output_suffix "s"), + (command "$CALL(GetBinDir)llc -march=pic16 -disable-jump-tables -pre-RA-sched=list-burr -f"), + (actions (case + (switch_on "S"), (stop_compilation), +// (not_empty "Wllc,"), (unpack_values "Wllc,"), +// (not_empty "pre-RA-sched"), (forward "pre-RA-sched"))) + (not_empty "regalloc"), (forward "regalloc"), + (empty "regalloc"), (append_cmd "-regalloc=linearscan"))) +]>; + +def gpasm : Tool<[ + (in_language "assembler"), + (out_language "object-code"), + (output_suffix "o"), + (command "$CALL(GetBinDir)gpasm -z -r decimal -I $CALL(GetStdAsmHeadersDir) -C -c -w 2"), + (actions (case + (switch_on "c"), (stop_compilation), + (switch_on "g"), (append_cmd "-g"), + (not_empty "p"), (forward "p"), + (empty "p"), (append_cmd "-p 16f1xxx"), + (not_empty "Wa,"), (forward_value "Wa,"))) +]>; + +def mplink : Tool<[ + (in_language "object-code"), + (out_language "executable"), + (output_suffix "cof"), + (command "$CALL(GetBinDir)mplink -e -k $CALL(GetStdLinkerScriptsDir) -l $CALL(GetStdLibsDir) intrinsics.lib stdn.lib"), + (actions (case + (not_empty "Wl,"), (forward_value "Wl,"), + (switch_on "X"), (append_cmd "-x"), + (not_empty "L"), (forward_as "L", "-l"), + (not_empty "K"), (forward_as "K", "-k"), + (not_empty "m"), (forward "m"), + (not_empty "p"), [(forward "p"), (append_cmd "-c")], + (empty "p"), (append_cmd "-p 16f1xxx -c"), +// (not_empty "l"), [(unpack_values "l"),(append_cmd ".lib")])), + (not_empty "k"), (forward "k"), + (not_empty "l"), (forward "l"))), + (join) +]>; + +// Language map + +def LanguageMap : LanguageMap<[ + (lang_to_suffixes "c", "c"), + (lang_to_suffixes "c-cpp-output", "i"), + (lang_to_suffixes "assembler", "s"), + (lang_to_suffixes "assembler-with-cpp", "S"), + (lang_to_suffixes "llvm-assembler", "ll"), + (lang_to_suffixes "llvm-bitcode", "bc"), + (lang_to_suffixes "object-code", "o"), + (lang_to_suffixes "executable", "cof") +]>; + +// Compilation graph + +def CompilationGraph : CompilationGraph<[ + (edge "root", "clang_cc"), + (edge "root", "llvm_ld"), + (optional_edge "root", "llvm_ld_optimizer", + (case (switch_on "S"), (inc_weight), + (switch_on "c"), (inc_weight))), + (edge "root", "gpasm"), + (edge "root", "mplink"), + (edge "clang_cc", "llvm_ld"), + (optional_edge "clang_cc", "llvm_ld_optimizer", + (case (switch_on "S"), (inc_weight), + (switch_on "c"), (inc_weight))), + (edge "llvm_ld", "pic16passes"), + (edge "llvm_ld_optimizer", "pic16passes"), + (edge "pic16passes", "llc"), + (edge "llc", "gpasm"), + (edge "gpasm", "mplink") +]>; |