MSP430TargetMachine.cpp revision 193323
1139749Simp//===-- MSP430TargetMachine.cpp - Define TargetMachine for MSP430 ---------===//
265832Snyan//
365832Snyan//                     The LLVM Compiler Infrastructure
465832Snyan//
565832Snyan// This file is distributed under the University of Illinois Open Source
665832Snyan// License. See LICENSE.TXT for details.
765832Snyan//
865832Snyan//===----------------------------------------------------------------------===//
965832Snyan//
1065832Snyan// Top-level implementation for the MSP430 target.
1165832Snyan//
1265832Snyan//===----------------------------------------------------------------------===//
1365832Snyan
1465832Snyan#include "MSP430.h"
1565832Snyan#include "MSP430TargetAsmInfo.h"
1665832Snyan#include "MSP430TargetMachine.h"
1765832Snyan#include "llvm/Module.h"
1865832Snyan#include "llvm/PassManager.h"
1965832Snyan#include "llvm/CodeGen/Passes.h"
2065832Snyan#include "llvm/Target/TargetAsmInfo.h"
2165832Snyan#include "llvm/Target/TargetMachineRegistry.h"
2265832Snyan
2365832Snyanusing namespace llvm;
24119418Sobrien
25119418Sobrien/// MSP430TargetMachineModule - Note that this is used on hosts that
26119418Sobrien/// cannot link in a library unless there are references into the
2765832Snyan/// library.  In particular, it seems that it is not possible to get
2865832Snyan/// things to work on Win32 without this.  Though it is unused, do not
2965832Snyan/// remove it.
3065832Snyanextern "C" int MSP430TargetMachineModule;
3165832Snyanint MSP430TargetMachineModule = 0;
3265832Snyan
3365832Snyan
3465832Snyan// Register the targets
3565832Snyanstatic RegisterTarget<MSP430TargetMachine>
3665832SnyanX("msp430", "MSP430 [experimental]");
3765832Snyan
3865832SnyanMSP430TargetMachine::MSP430TargetMachine(const Module &M,
3965832Snyan                                         const std::string &FS) :
4065832Snyan  Subtarget(*this, M, FS),
4165832Snyan  // FIXME: Check TargetData string.
4265832Snyan  DataLayout("e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8"),
4365832Snyan  InstrInfo(*this), TLInfo(*this),
4465832Snyan  FrameInfo(TargetFrameInfo::StackGrowsDown, 2, -2) { }
45142135Simp
4665832Snyanconst TargetAsmInfo *MSP430TargetMachine::createTargetAsmInfo() const {
4765832Snyan  return new MSP430TargetAsmInfo(*this);
4865832Snyan}
4967442Snyan
5067442Snyanbool MSP430TargetMachine::addInstSelector(PassManagerBase &PM,
5165832Snyan                                          CodeGenOpt::Level OptLevel) {
5265832Snyan  // Install an instruction selector.
5365832Snyan  PM.add(createMSP430ISelDag(*this, OptLevel));
5465832Snyan  return false;
5565832Snyan}
5665832Snyan
5790183Snyanbool MSP430TargetMachine::addAssemblyEmitter(PassManagerBase &PM,
5890183Snyan                                             CodeGenOpt::Level OptLevel,
5990183Snyan                                             bool Verbose,
6090183Snyan                                             raw_ostream &Out) {
6190183Snyan  // Output assembly language.
6265832Snyan  PM.add(createMSP430CodePrinterPass(Out, *this, OptLevel, Verbose));
6365832Snyan  return false;
6465832Snyan}
6565832Snyan
6665832Snyanunsigned MSP430TargetMachine::getModuleMatchQuality(const Module &M) {
6765832Snyan  std::string TT = M.getTargetTriple();
6865832Snyan
6965832Snyan  // We strongly match msp430
7065832Snyan  if (TT.size() >= 6 && TT[0] == 'm' && TT[1] == 's' && TT[2] == 'p' &&
7165832Snyan      TT[3] == '4' &&  TT[4] == '3' && TT[5] == '0')
7265832Snyan    return 20;
7365832Snyan
7465832Snyan  return 0;
7565832Snyan}
7665832Snyan
7765832Snyan