diff options
Diffstat (limited to 'contrib/llvm/tools/llvmc/example')
21 files changed, 735 insertions, 0 deletions
diff --git a/contrib/llvm/tools/llvmc/example/Hello/Hello.cpp b/contrib/llvm/tools/llvmc/example/Hello/Hello.cpp new file mode 100644 index 0000000..a7179ea --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Hello/Hello.cpp @@ -0,0 +1,33 @@ +//===- Hello.cpp - Example code from "Writing an LLVMC Plugin" ------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Test plugin for LLVMC. Shows how to write plugins without using TableGen. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CompilerDriver/CompilationGraph.h" +#include "llvm/CompilerDriver/Plugin.h" +#include "llvm/Support/raw_ostream.h" + +namespace { +struct MyPlugin : public llvmc::BasePlugin { + + void PreprocessOptions() const + {} + + void PopulateLanguageMap(llvmc::LanguageMap&) const + { outs() << "Hello!\n"; } + + void PopulateCompilationGraph(llvmc::CompilationGraph&) const + {} +}; + +static llvmc::RegisterPlugin<MyPlugin> RP("Hello", "Hello World plugin"); + +} diff --git a/contrib/llvm/tools/llvmc/example/Hello/Makefile b/contrib/llvm/tools/llvmc/example/Hello/Makefile new file mode 100644 index 0000000..10325e6 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Hello/Makefile @@ -0,0 +1,14 @@ +##===- tools/llvmc/plugins/Hello/Makefile ------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../../../.. + +LLVMC_PLUGIN = Hello + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/Simple/Makefile b/contrib/llvm/tools/llvmc/example/Simple/Makefile new file mode 100644 index 0000000..d7adb5d --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Simple/Makefile @@ -0,0 +1,15 @@ +##===- tools/llvmc/plugins/Simple/Makefile -----------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../../../.. + +LLVMC_PLUGIN = Simple +BUILT_SOURCES = AutoGenerated.inc + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/Simple/PluginMain.cpp b/contrib/llvm/tools/llvmc/example/Simple/PluginMain.cpp new file mode 100644 index 0000000..add8acb --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Simple/PluginMain.cpp @@ -0,0 +1 @@ +#include "AutoGenerated.inc" diff --git a/contrib/llvm/tools/llvmc/example/Simple/Simple.td b/contrib/llvm/tools/llvmc/example/Simple/Simple.td new file mode 100644 index 0000000..87bc385 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Simple/Simple.td @@ -0,0 +1,37 @@ +//===- Simple.td - A simple plugin for LLVMC ------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// A simple LLVMC-based gcc wrapper that shows how to write LLVMC plugins. +// +// To compile, use this command: +// +// $ cd $LLVMC_DIR/example/Simple +// $ make +// +// Run as: +// +// $ llvmc -load $LLVM_DIR/Release/lib/plugin_llvmc_Simple.so +// +// For instructions on how to build your own LLVMC-based driver, see +// the 'example/Skeleton' directory. +//===----------------------------------------------------------------------===// + +include "llvm/CompilerDriver/Common.td" + +def gcc : Tool< +[(in_language "c"), + (out_language "executable"), + (output_suffix "out"), + (cmd_line "gcc $INFILE -o $OUTFILE"), + (sink) +]>; + +def LanguageMap : LanguageMap<[LangToSuffixes<"c", ["c"]>]>; + +def CompilationGraph : CompilationGraph<[Edge<"root", "gcc">]>; diff --git a/contrib/llvm/tools/llvmc/example/Skeleton/Makefile b/contrib/llvm/tools/llvmc/example/Skeleton/Makefile new file mode 100644 index 0000000..f489abf --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Skeleton/Makefile @@ -0,0 +1,24 @@ +##===- llvmc/example/Skeleton/Makefile ---------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open +# Source License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +# Change this so that $(BASE_LEVEL)/Makefile.common refers to +# $LLVM_DIR/Makefile.common or $YOUR_LLVM_BASED_PROJECT/Makefile.common. +export LLVMC_BASE_LEVEL = ../../../.. + +# Change this to the name of your LLVMC-based driver. +export LLVMC_BASED_DRIVER_NAME = llvmc-skeleton + +# List your plugin names here +export LLVMC_BUILTIN_PLUGINS = # Plugin + +LEVEL = $(LLVMC_BASE_LEVEL) + +DIRS = plugins driver + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/Skeleton/README b/contrib/llvm/tools/llvmc/example/Skeleton/README new file mode 100644 index 0000000..92216ae --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Skeleton/README @@ -0,0 +1,6 @@ + +This is a template that can be used to create your own LLVMC-based drivers. Just +copy the `Skeleton` directory to the location of your preference and edit +`Skeleton/Makefile` and `Skeleton/plugins/Plugin`. + +The build system assumes that your project is based on LLVM. diff --git a/contrib/llvm/tools/llvmc/example/Skeleton/driver/Main.cpp b/contrib/llvm/tools/llvmc/example/Skeleton/driver/Main.cpp new file mode 100644 index 0000000..b1f5b67 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Skeleton/driver/Main.cpp @@ -0,0 +1,14 @@ +//===--- Main.cpp - The LLVM Compiler Driver -------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open +// Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Just include CompilerDriver/Main.inc. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CompilerDriver/Main.inc" diff --git a/contrib/llvm/tools/llvmc/example/Skeleton/driver/Makefile b/contrib/llvm/tools/llvmc/example/Skeleton/driver/Makefile new file mode 100644 index 0000000..93e795b --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Skeleton/driver/Makefile @@ -0,0 +1,13 @@ +##===- llvmc/example/Skeleton/driver/Makefile --------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open +# Source License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = $(LLVMC_BASE_LEVEL)/.. +LLVMC_BASED_DRIVER = $(LLVMC_BASED_DRIVER_NAME) + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Makefile b/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Makefile new file mode 100644 index 0000000..fb07f23 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Makefile @@ -0,0 +1,18 @@ +##===- llvmc/example/Skeleton/plugins/Makefile -------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open +# Source License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = $(LLVMC_BASE_LEVEL)/.. + +ifneq ($(LLVMC_BUILTIN_PLUGINS),) +DIRS = $(LLVMC_BUILTIN_PLUGINS) +endif + +export LLVMC_BUILTIN_PLUGIN=1 + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Plugin/Makefile b/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Plugin/Makefile new file mode 100644 index 0000000..54f7221 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Plugin/Makefile @@ -0,0 +1,17 @@ +##===- llvmc/example/Skeleton/plugins/Plugin/Makefile ------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = $(LLVMC_BASE_LEVEL)/../.. + +# Change this to the name of your plugin. +LLVMC_PLUGIN = Plugin + +BUILT_SOURCES = AutoGenerated.inc + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Plugin/Plugin.td b/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Plugin/Plugin.td new file mode 100644 index 0000000..febb9ad --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Plugin/Plugin.td @@ -0,0 +1,7 @@ +//===- Plugin.td - A skeleton plugin for LLVMC -------------*- tablegen -*-===// +// +// Write the code for your plugin here. +// +//===----------------------------------------------------------------------===// + +include "llvm/CompilerDriver/Common.td" diff --git a/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Plugin/PluginMain.cpp b/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Plugin/PluginMain.cpp new file mode 100644 index 0000000..add8acb --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/Skeleton/plugins/Plugin/PluginMain.cpp @@ -0,0 +1 @@ +#include "AutoGenerated.inc" diff --git a/contrib/llvm/tools/llvmc/example/mcc16/Makefile b/contrib/llvm/tools/llvmc/example/mcc16/Makefile new file mode 100644 index 0000000..e94bca2 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/mcc16/Makefile @@ -0,0 +1,18 @@ +##===- llvmc/example/mcc16/Makefile ------------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open +# Source License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +export LLVMC_BASE_LEVEL = ../../../.. +export LLVMC_BASED_DRIVER_NAME = mcc16 +export LLVMC_BUILTIN_PLUGINS = PIC16Base + +LEVEL = $(LLVMC_BASE_LEVEL) + +DIRS = plugins driver + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/mcc16/README b/contrib/llvm/tools/llvmc/example/mcc16/README new file mode 100644 index 0000000..eeef6a4 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/mcc16/README @@ -0,0 +1,75 @@ +This is a basic compiler driver for the PIC16 toolchain that shows how to create +your own llvmc-based drivers. It is based on the example/Skeleton template. + +The PIC16 toolchain looks like this: + +clang-cc (FE) -> llvm-ld (optimizer) -> llc (codegen) -> native-as -> native-ld + +Following features were requested by Sanjiv: + +From: Sanjiv Gupta <sanjiv.gupta <at> microchip.com> +Subject: Re: llvmc for PIC16 +Newsgroups: gmane.comp.compilers.llvm.devel +Date: 2009-06-05 06:51:14 GMT + +The salient features that we want to have in the driver are: +1. llvm-ld will be used as "The Optimizer". +2. If the user has specified to generate the final executable, then +llvm-ld should run on all the .bc files generated by clang and create a +single optimized .bc file for further tools. +3. -Wo <options> - pass optimizations to the llvm-ld +4. mcc16 -Wl <options> - pass options to native linker. +5. mcc16 -Wa <options> - pass options to native assembler. + +Here are some example command lines and sample command invocations as to +what should be done. + +$ mcc16 -S foo.c +// [clang-cc foo.c] -> foo.bc +// [llvm-ld foo.bc] -> foo.opt.bc +// [llc foo.opt.bc] -> foo.s + +$ mcc16 -S foo.c bar.c +// [clang-cc foo.c] -> foo.bc +// [llvm-ld foo.bc] -> foo.opt.bc +// [llc foo.opt.bc] -> foo.s +// [clang-cc bar.c] -> bar.bc +// [llvm-ld bar.bc] -> bar.opt.bc +// [llc bar.opt.bc] -> bar.s + +** Use of -g causes llvm-ld to run with -disable-opt +$ mcc16 -S -g foo.c +// [clang-cc foo.c] -> foo.bc +// [llvm-ld -disable-opt foo.bc] -> foo.opt.bc +// [llc foo.opt.bc] -> foo.s + +** -I is passed to clang-cc, -pre-RA-sched=list-burr to llc. +$ mcc16 -S -g -I ../include -pre-RA-sched=list-burr foo.c +// [clang-cc -I ../include foo.c] -> foo.bc +// [llvm-ld -disable-opt foo.bc] -> foo.opt.bc +// [llc -pre-RA-sched=list-burr foo.opt.bc] -> foo.s + +** -Wo passes options to llvm-ld +$ mcc16 -Wo=opt1,opt2 -S -I ../include -pre-RA-sched=list-burr foo.c +// [clang-cc -I ../include foo.c] -> foo.bc +// [llvm-ld -opt1 -opt2 foo.bc] -> foo.opt.bc +// [llc -pre-RA-sched=list-burr foo.opt.bc] -> foo.s + +** -Wa passes options to native as. +$ mcc16 -c foo.c -Wa=opt1 +// [clang-cc foo.c] -> foo.bc +// [llvm-ld foo.bc] -> foo.opt.bc +// [llc foo.opt.bc] -> foo.s +// [native-as -opt1 foo.s] -> foo.o + +$ mcc16 -Wo=opt1 -Wl=opt2 -Wa=opt3 foo.c bar.c +// [clang-cc foo.c] -> foo.bc +// [clang-cc bar.c] -> bar.bc +// [llvm-ld -opt1 foo.bc bar.bc] -> a.out.bc +// [llc a.out.bc] -> a.out.s +// [native-as -opt3 a.out.s] -> a.out.o +// [native-ld -opt2 a.out.o] -> a.out + +Is this achievable by a tablegen based driver ? + +- Sanjiv diff --git a/contrib/llvm/tools/llvmc/example/mcc16/driver/Main.cpp b/contrib/llvm/tools/llvmc/example/mcc16/driver/Main.cpp new file mode 100644 index 0000000..e66e2f9 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/mcc16/driver/Main.cpp @@ -0,0 +1,54 @@ +//===--- Main.cpp - The LLVM Compiler Driver -------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open +// Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Usually this file just includes CompilerDriver/Main.inc, but here we apply +// some trickery to make the built-in '-save-temps' option hidden and enable +// '--temp-dir' by default. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Config/config.h" +#include "llvm/CompilerDriver/BuiltinOptions.h" +#include "llvm/CompilerDriver/ForceLinkage.h" +#include "llvm/System/Path.h" +#include <iostream> + +namespace llvmc { + int Main(int argc, char** argv); +} + +// Modify the PACKAGE_VERSION to use build number in top level configure file. +void PIC16VersionPrinter(void) { + std::cout << "MPLAB C16 1.0 " << PACKAGE_VERSION << "\n"; +} + +int main(int argc, char** argv) { + + // HACK + SaveTemps.setHiddenFlag(llvm::cl::Hidden); + TempDirname.setHiddenFlag(llvm::cl::Hidden); + Languages.setHiddenFlag(llvm::cl::Hidden); + DryRun.setHiddenFlag(llvm::cl::Hidden); + + llvm::cl::SetVersionPrinter(PIC16VersionPrinter); + + // Ask for a standard temp dir, but just cache its basename., and delete it. + llvm::sys::Path tempDir; + tempDir = llvm::sys::Path::GetTemporaryDirectory(); + TempDirname = tempDir.getBasename(); + tempDir.eraseFromDisk(true); + + // We are creating a temp dir in current dir, with the cached name. + // But before that remove if one already exists with that name.. + tempDir = TempDirname; + tempDir.eraseFromDisk(true); + + llvmc::ForceLinkage(); + return llvmc::Main(argc, argv); +} diff --git a/contrib/llvm/tools/llvmc/example/mcc16/driver/Makefile b/contrib/llvm/tools/llvmc/example/mcc16/driver/Makefile new file mode 100644 index 0000000..670d8bd --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/mcc16/driver/Makefile @@ -0,0 +1,13 @@ +##===- llvmc/example/mcc16/driver/Makefile -----------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open +# Source License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = $(LLVMC_BASE_LEVEL)/.. +LLVMC_BASED_DRIVER = $(LLVMC_BASED_DRIVER_NAME) + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/mcc16/plugins/Makefile b/contrib/llvm/tools/llvmc/example/mcc16/plugins/Makefile new file mode 100644 index 0000000..fb07f23 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/mcc16/plugins/Makefile @@ -0,0 +1,18 @@ +##===- llvmc/example/Skeleton/plugins/Makefile -------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open +# Source License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = $(LLVMC_BASE_LEVEL)/.. + +ifneq ($(LLVMC_BUILTIN_PLUGINS),) +DIRS = $(LLVMC_BUILTIN_PLUGINS) +endif + +export LLVMC_BUILTIN_PLUGIN=1 + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/mcc16/plugins/PIC16Base/Makefile b/contrib/llvm/tools/llvmc/example/mcc16/plugins/PIC16Base/Makefile new file mode 100644 index 0000000..5d785fd --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/mcc16/plugins/PIC16Base/Makefile @@ -0,0 +1,17 @@ +##===- llvmc/example/Skeleton/plugins/Plugin/Makefile ------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = $(LLVMC_BASE_LEVEL)/../.. + +# Change this to the name of your plugin. +LLVMC_PLUGIN = PIC16Base + +BUILT_SOURCES = AutoGenerated.inc + +include $(LEVEL)/Makefile.common diff --git a/contrib/llvm/tools/llvmc/example/mcc16/plugins/PIC16Base/PIC16Base.td b/contrib/llvm/tools/llvmc/example/mcc16/plugins/PIC16Base/PIC16Base.td new file mode 100644 index 0000000..25149ad --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/mcc16/plugins/PIC16Base/PIC16Base.td @@ -0,0 +1,234 @@ +//===- PIC16Base.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<[ + LangToSuffixes<"c", ["c"]>, + LangToSuffixes<"c-cpp-output", ["i"]>, + LangToSuffixes<"assembler", ["s"]>, + LangToSuffixes<"assembler-with-cpp", ["S"]>, + LangToSuffixes<"llvm-assembler", ["ll"]>, + LangToSuffixes<"llvm-bitcode", ["bc"]>, + LangToSuffixes<"object-code", ["o"]>, + LangToSuffixes<"executable", ["cof"]> +]>; + +// Compilation graph + +def CompilationGraph : CompilationGraph<[ + Edge<"root", "clang_cc">, + Edge<"root", "llvm_ld">, + OptionalEdge<"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">, + OptionalEdge<"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"> +]>; diff --git a/contrib/llvm/tools/llvmc/example/mcc16/plugins/PIC16Base/PluginMain.cpp b/contrib/llvm/tools/llvmc/example/mcc16/plugins/PIC16Base/PluginMain.cpp new file mode 100644 index 0000000..9b2f9fc5 --- /dev/null +++ b/contrib/llvm/tools/llvmc/example/mcc16/plugins/PIC16Base/PluginMain.cpp @@ -0,0 +1,106 @@ +#include "AutoGenerated.inc" + +#include "llvm/System/Path.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +namespace llvmc { + extern char *ProgramName; +} + + + +// Returns the platform specific directory separator via #ifdefs. +// FIXME: This currently work on linux and windows only. It does not +// work on other unices. +static std::string GetDirSeparator() { +#if __linux__ || __APPLE__ + return "/"; +#else + return "\\"; +#endif +} + +namespace hooks { +// Get preprocessor define for the part. +// It is __partname format in lower case. +std::string +GetLowerCasePartDefine(void) { + std::string Partname; + if (AutoGeneratedParameter_p.empty()) { + Partname = "16f1xxx"; + } else { + Partname = AutoGeneratedParameter_p; + } + + std::string LowerCase; + for (unsigned i = 0; i <= Partname.size(); i++) { + LowerCase.push_back(std::tolower(Partname[i])); + } + + return "__" + LowerCase; +} + +std::string +GetUpperCasePartDefine(void) { + std::string Partname; + if (AutoGeneratedParameter_p.empty()) { + Partname = "16f1xxx"; + } else { + Partname = AutoGeneratedParameter_p; + } + + std::string UpperCase; + for (unsigned i = 0; i <= Partname.size(); i++) { + UpperCase.push_back(std::toupper(Partname[i])); + } + + return "__" + UpperCase; +} + + +// Get the dir where c16 executables reside. +std::string GetBinDir() { + // Construct a Path object from the program name. + void *P = (void*) (intptr_t) GetBinDir; + sys::Path ProgramFullPath + = sys::Path::GetMainExecutable(llvmc::ProgramName, P); + + // Get the dir name for the program. It's last component should be 'bin'. + std::string BinDir = ProgramFullPath.getDirname(); + + // llvm::errs() << "BinDir: " << BinDir << '\n'; + return BinDir + GetDirSeparator(); +} + +// Get the Top-level Installation dir for c16. +std::string GetInstallDir() { + sys::Path BinDirPath = sys::Path(GetBinDir()); + + // Go one more level up to get the install dir. + std::string InstallDir = BinDirPath.getDirname(); + + return InstallDir + GetDirSeparator(); +} + +// Get the dir where the c16 header files reside. +std::string GetStdHeadersDir() { + return GetInstallDir() + "include"; +} + +// Get the dir where the assembler header files reside. +std::string GetStdAsmHeadersDir() { + return GetInstallDir() + "inc"; +} + +// Get the dir where the linker scripts reside. +std::string GetStdLinkerScriptsDir() { + return GetInstallDir() + "lkr"; +} + +// Get the dir where startup code, intrinsics and lib reside. +std::string GetStdLibsDir() { + return GetInstallDir() + "lib"; +} +} |