mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
A basic PIC16 toolchain driver.
Nice addition to the examples and also a starting point for Sanjiv to work on. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73013 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7a5e55509b
commit
9dcc26b6a0
24
tools/llvmc/example/mcc16/Makefile
Normal file
24
tools/llvmc/example/mcc16/Makefile
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
##===- 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.
|
||||||
|
#
|
||||||
|
##===----------------------------------------------------------------------===##
|
||||||
|
|
||||||
|
# Change this so that $(BASE_LEVEL)/Makefile.common refers to
|
||||||
|
# $LLVM_DIR/Makefile.common.
|
||||||
|
export LLVMC_BASE_LEVEL = ../../../..
|
||||||
|
|
||||||
|
# Change this to the name of your LLVMC-based driver.
|
||||||
|
export LLVMC_BASED_DRIVER_NAME = mcc16
|
||||||
|
|
||||||
|
# List your plugin names here
|
||||||
|
export LLVMC_BUILTIN_PLUGINS = PIC16Base
|
||||||
|
|
||||||
|
LEVEL = $(LLVMC_BASE_LEVEL)
|
||||||
|
|
||||||
|
DIRS = plugins driver
|
||||||
|
|
||||||
|
include $(LEVEL)/Makefile.common
|
75
tools/llvmc/example/mcc16/README
Normal file
75
tools/llvmc/example/mcc16/README
Normal file
@ -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
|
14
tools/llvmc/example/mcc16/driver/Main.cpp
Normal file
14
tools/llvmc/example/mcc16/driver/Main.cpp
Normal file
@ -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"
|
22
tools/llvmc/example/mcc16/driver/Makefile
Normal file
22
tools/llvmc/example/mcc16/driver/Makefile
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
##===- 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)/..
|
||||||
|
|
||||||
|
TOOLNAME = $(LLVMC_BASED_DRIVER_NAME)
|
||||||
|
LLVMLIBS = CompilerDriver
|
||||||
|
|
||||||
|
ifneq ($(LLVMC_BUILTIN_PLUGINS),)
|
||||||
|
USEDLIBS += $(patsubst %,plugin_llvmc_%,$(LLVMC_BUILTIN_PLUGINS))
|
||||||
|
endif
|
||||||
|
|
||||||
|
LINK_COMPONENTS = support system
|
||||||
|
REQUIRES_EH := 1
|
||||||
|
|
||||||
|
include $(LEVEL)/Makefile.common
|
18
tools/llvmc/example/mcc16/plugins/Makefile
Normal file
18
tools/llvmc/example/mcc16/plugins/Makefile
Normal file
@ -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
|
17
tools/llvmc/example/mcc16/plugins/PIC16Base/Makefile
Normal file
17
tools/llvmc/example/mcc16/plugins/PIC16Base/Makefile
Normal file
@ -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
|
116
tools/llvmc/example/mcc16/plugins/PIC16Base/PIC16Base.td
Normal file
116
tools/llvmc/example/mcc16/plugins/PIC16Base/PIC16Base.td
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
//===- 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 "Disable optimizations")),
|
||||||
|
(switch_option "S",
|
||||||
|
(help "Stop after compilation, do not assemble")),
|
||||||
|
(parameter_option "I",
|
||||||
|
(help "Add a directory to include path")),
|
||||||
|
(parameter_option "pre-RA-sched",
|
||||||
|
(help "Example of an option that is passed to llc")),
|
||||||
|
(prefix_list_option "Wa,",
|
||||||
|
(help "Pass options to native assembler")),
|
||||||
|
(prefix_list_option "Wl,",
|
||||||
|
(help "Pass options to native linker")),
|
||||||
|
(prefix_list_option "Wllc,",
|
||||||
|
(help "Pass options to llc")),
|
||||||
|
(prefix_list_option "Wo,",
|
||||||
|
(help "Pass options to llvm-ld"))
|
||||||
|
]>;
|
||||||
|
|
||||||
|
// Tools
|
||||||
|
|
||||||
|
def clang_cc : Tool<[
|
||||||
|
(in_language "c"),
|
||||||
|
(out_language "llvm-bitcode"),
|
||||||
|
(output_suffix "bc"),
|
||||||
|
(cmd_line "clang-cc $INFILE -o $OUTFILE"),
|
||||||
|
(actions (case
|
||||||
|
(not_empty "I"), (forward "I"))),
|
||||||
|
(sink)
|
||||||
|
]>;
|
||||||
|
|
||||||
|
def llvm_ld : Tool<[
|
||||||
|
(in_language "llvm-bitcode"),
|
||||||
|
(out_language "llvm-bitcode"),
|
||||||
|
(output_suffix "bc"),
|
||||||
|
(cmd_line "llvm-ld $INFILE -o $OUTFILE"),
|
||||||
|
(actions (case
|
||||||
|
(switch_on "g"), (append_cmd "-disable-opt"),
|
||||||
|
(not_empty "Wo,"), (unpack_values "Wo,")))
|
||||||
|
]>;
|
||||||
|
|
||||||
|
def llvm_ld_lto : Tool<[
|
||||||
|
(in_language "llvm-bitcode"),
|
||||||
|
(out_language "llvm-bitcode"),
|
||||||
|
(output_suffix "bc"),
|
||||||
|
(cmd_line "llvm-ld $INFILE -o $OUTFILE"),
|
||||||
|
(actions (case
|
||||||
|
(switch_on "g"), (append_cmd "-disable-opt"),
|
||||||
|
(not_empty "Wo,"), (unpack_values "Wo,"))),
|
||||||
|
(join)
|
||||||
|
]>;
|
||||||
|
|
||||||
|
def llc : Tool<[
|
||||||
|
(in_language "llvm-bitcode"),
|
||||||
|
(out_language "assembler"),
|
||||||
|
(output_suffix "s"),
|
||||||
|
(cmd_line "llc -f $INFILE -o $OUTFILE"),
|
||||||
|
(actions (case
|
||||||
|
(switch_on "S"), (stop_compilation),
|
||||||
|
(not_empty "Wllc,"), (unpack_values "Wllc,"),
|
||||||
|
(not_empty "pre-RA-sched"), (forward "pre-RA-sched")))
|
||||||
|
]>;
|
||||||
|
|
||||||
|
def native_as : Tool<[
|
||||||
|
(in_language "assembler"),
|
||||||
|
(out_language "object-code"),
|
||||||
|
(output_suffix "o"),
|
||||||
|
(cmd_line "native-as $INFILE -o $OUTFILE"),
|
||||||
|
(actions (case
|
||||||
|
(not_empty "Wa,"), (unpack_values "Wa,")))
|
||||||
|
]>;
|
||||||
|
|
||||||
|
def native_ld : Tool<[
|
||||||
|
(in_language "object-code"),
|
||||||
|
(out_language "executable"),
|
||||||
|
(output_suffix "out"),
|
||||||
|
(cmd_line "native-ld $INFILE -o $OUTFILE"),
|
||||||
|
(actions (case
|
||||||
|
(not_empty "Wl,"), (unpack_values "Wl,"))),
|
||||||
|
(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", ["out"]>
|
||||||
|
]>;
|
||||||
|
|
||||||
|
// Compilation graph
|
||||||
|
|
||||||
|
def CompilationGraph : CompilationGraph<[
|
||||||
|
Edge<"root", "clang_cc">,
|
||||||
|
Edge<"clang_cc", "llvm_ld_lto">,
|
||||||
|
Edge<"llvm_ld_lto", "llc">,
|
||||||
|
OptionalEdge<"clang_cc", "llvm_ld", (case (switch_on "S"), (inc_weight))>,
|
||||||
|
Edge<"llvm_ld", "llc">,
|
||||||
|
Edge<"llc", "native_as">,
|
||||||
|
Edge<"native_as", "native_ld">
|
||||||
|
]>;
|
@ -0,0 +1 @@
|
|||||||
|
#include "AutoGenerated.inc"
|
Loading…
x
Reference in New Issue
Block a user