[llvm-commits] [llvm] r117198 - in /llvm/trunk/tools/llvmc/examples: Makefile mcc16/ mcc16/Hooks.cpp mcc16/Main.cpp mcc16/Makefile mcc16/PIC16.td mcc16/README

Mikhail Glushenkov foldr at codedgers.com
Sat Oct 23 00:33:02 PDT 2010


Author: foldr
Date: Sat Oct 23 02:33:02 2010
New Revision: 117198

URL: http://llvm.org/viewvc/llvm-project?rev=117198&view=rev
Log:
Resurrect mcc16, it is useful as an example.

Added:
    llvm/trunk/tools/llvmc/examples/mcc16/
    llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp
    llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp
    llvm/trunk/tools/llvmc/examples/mcc16/Makefile
      - copied, changed from r117197, llvm/trunk/tools/llvmc/examples/Makefile
    llvm/trunk/tools/llvmc/examples/mcc16/PIC16.td
    llvm/trunk/tools/llvmc/examples/mcc16/README
Modified:
    llvm/trunk/tools/llvmc/examples/Makefile

Modified: llvm/trunk/tools/llvmc/examples/Makefile
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/examples/Makefile?rev=117198&r1=117197&r2=117198&view=diff
==============================================================================
--- llvm/trunk/tools/llvmc/examples/Makefile (original)
+++ llvm/trunk/tools/llvmc/examples/Makefile Sat Oct 23 02:33:02 2010
@@ -9,6 +9,6 @@
 
 LEVEL=../../..
 
-PARALLEL_DIRS := Hello Simple Skeleton
+PARALLEL_DIRS := Hello Simple mcc16 Skeleton
 
 include $(LEVEL)/Makefile.common

Added: llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp?rev=117198&view=auto
==============================================================================
--- llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp (added)
+++ llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp Sat Oct 23 02:33:02 2010
@@ -0,0 +1,109 @@
+#include "llvm/System/Path.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/raw_ostream.h"
+
+#include <string>
+
+namespace llvmc {
+  extern char *ProgramName;
+
+  namespace autogenerated {
+    extern llvm::cl::opt<std::string> Parameter_p;
+  }
+}
+
+using namespace llvm;
+using namespace llvmc;
+
+// 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 (autogenerated::Parameter_p.empty()) {
+    Partname = "16f1xxx";
+  } else {
+    Partname = autogenerated::Parameter_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 (autogenerated::Parameter_p.empty()) {
+    Partname = "16f1xxx";
+  } else {
+    Partname = autogenerated::Parameter_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";
+}
+}

Added: llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp?rev=117198&view=auto
==============================================================================
--- llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp (added)
+++ llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp Sat Oct 23 02:33:02 2010
@@ -0,0 +1,57 @@
+//===--- 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/CompilerDriver/BuiltinOptions.h"
+#include "llvm/CompilerDriver/Main.h"
+
+#include "llvm/System/Path.h"
+#include "llvm/Config/config.h"
+
+#include <iostream>
+
+#include "PIC16.inc"
+
+namespace {
+
+// 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);
+
+  return llvmc::Main(argc, argv);
+}

Copied: llvm/trunk/tools/llvmc/examples/mcc16/Makefile (from r117197, llvm/trunk/tools/llvmc/examples/Makefile)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/examples/mcc16/Makefile?p2=llvm/trunk/tools/llvmc/examples/mcc16/Makefile&p1=llvm/trunk/tools/llvmc/examples/Makefile&r1=117197&r2=117198&rev=117198&view=diff
==============================================================================
--- llvm/trunk/tools/llvmc/examples/Makefile (original)
+++ llvm/trunk/tools/llvmc/examples/mcc16/Makefile Sat Oct 23 02:33:02 2010
@@ -1,4 +1,4 @@
-##===- tools/llvmc/examples/Makefile -----------------------*- Makefile -*-===##
+##===- llvmc/examples/mcc16/Makefile -----------------------*- Makefile -*-===##
 #
 #                     The LLVM Compiler Infrastructure
 #
@@ -7,8 +7,9 @@
 #
 ##===----------------------------------------------------------------------===##
 
-LEVEL=../../..
+LEVEL = ../../../..
 
-PARALLEL_DIRS := Hello Simple Skeleton
+LLVMC_BASED_DRIVER = mcc16
+BUILT_SOURCES = PIC16.inc
 
 include $(LEVEL)/Makefile.common

Added: llvm/trunk/tools/llvmc/examples/mcc16/PIC16.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/examples/mcc16/PIC16.td?rev=117198&view=auto
==============================================================================
--- llvm/trunk/tools/llvmc/examples/mcc16/PIC16.td (added)
+++ llvm/trunk/tools/llvmc/examples/mcc16/PIC16.td Sat Oct 23 02:33:02 2010
@@ -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")
+]>;

Added: llvm/trunk/tools/llvmc/examples/mcc16/README
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/examples/mcc16/README?rev=117198&view=auto
==============================================================================
--- llvm/trunk/tools/llvmc/examples/mcc16/README (added)
+++ llvm/trunk/tools/llvmc/examples/mcc16/README Sat Oct 23 02:33:02 2010
@@ -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 examples/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





More information about the llvm-commits mailing list