MSP430TargetMachine.cpp revision 194612
152284Sobrien//===-- MSP430TargetMachine.cpp - Define TargetMachine for MSP430 ---------===//
2169689Skan//
352284Sobrien//                     The LLVM Compiler Infrastructure
490075Sobrien//
552284Sobrien// This file is distributed under the University of Illinois Open Source
690075Sobrien// License. See LICENSE.TXT for details.
790075Sobrien//
890075Sobrien//===----------------------------------------------------------------------===//
990075Sobrien//
1052284Sobrien// Top-level implementation for the MSP430 target.
1190075Sobrien//
1290075Sobrien//===----------------------------------------------------------------------===//
1390075Sobrien
1490075Sobrien#include "MSP430.h"
1552284Sobrien#include "MSP430TargetAsmInfo.h"
1652284Sobrien#include "MSP430TargetMachine.h"
1790075Sobrien#include "llvm/Module.h"
18169689Skan#include "llvm/PassManager.h"
19169689Skan#include "llvm/CodeGen/Passes.h"
2052284Sobrien#include "llvm/Target/TargetAsmInfo.h"
2152284Sobrien#include "llvm/Target/TargetMachineRegistry.h"
2252284Sobrien
23132718Skanusing namespace llvm;
24132718Skan
2552284Sobrien/// MSP430TargetMachineModule - Note that this is used on hosts that
2652284Sobrien/// cannot link in a library unless there are references into the
2790075Sobrien/// library.  In particular, it seems that it is not possible to get
28169689Skan/// things to work on Win32 without this.  Though it is unused, do not
2952284Sobrien/// remove it.
3052284Sobrienextern "C" int MSP430TargetMachineModule;
3152284Sobrienint MSP430TargetMachineModule = 0;
3252284Sobrien
3352284Sobrien
3452284Sobrien// Register the targets
3552284Sobrienstatic RegisterTarget<MSP430TargetMachine>
36132718SkanX("msp430", "MSP430 [experimental]");
3752284Sobrien
3890075Sobrien// Force static initialization when called from llvm/InitializeAllTargets.h
3952284Sobriennamespace llvm {
4052284Sobrien  void InitializeMSP430Target() { }
4152284Sobrien}
4252284Sobrien
4352284SobrienMSP430TargetMachine::MSP430TargetMachine(const Module &M,
4452284Sobrien                                         const std::string &FS) :
45132718Skan  Subtarget(*this, M, FS),
4652284Sobrien  // FIXME: Check TargetData string.
4752284Sobrien  DataLayout("e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8"),
4852284Sobrien  InstrInfo(*this), TLInfo(*this),
4952284Sobrien  FrameInfo(TargetFrameInfo::StackGrowsDown, 2, -2) { }
5052284Sobrien
5152284Sobrienconst TargetAsmInfo *MSP430TargetMachine::createTargetAsmInfo() const {
52117395Skan  return new MSP430TargetAsmInfo(*this);
53117395Skan}
54117395Skan
55117395Skanbool MSP430TargetMachine::addInstSelector(PassManagerBase &PM,
56117395Skan                                          CodeGenOpt::Level OptLevel) {
57132718Skan  // Install an instruction selector.
58117395Skan  PM.add(createMSP430ISelDag(*this, OptLevel));
59117395Skan  return false;
60117395Skan}
61117395Skan
62117395Skanbool MSP430TargetMachine::addAssemblyEmitter(PassManagerBase &PM,
63117395Skan                                             CodeGenOpt::Level OptLevel,
64117395Skan                                             bool Verbose,
65117395Skan                                             raw_ostream &Out) {
66117395Skan  // Output assembly language.
67117395Skan  PM.add(createMSP430CodePrinterPass(Out, *this, OptLevel, Verbose));
68132718Skan  return false;
69117395Skan}
70117395Skan
71117395Skanunsigned MSP430TargetMachine::getModuleMatchQuality(const Module &M) {
72117395Skan  std::string TT = M.getTargetTriple();
73117395Skan
74117395Skan  // We strongly match msp430
75132718Skan  if (TT.size() >= 6 && TT[0] == 'm' && TT[1] == 's' && TT[2] == 'p' &&
76117395Skan      TT[3] == '4' &&  TT[4] == '3' && TT[5] == '0')
77117395Skan    return 20;
78117395Skan
79117395Skan  return 0;
80117395Skan}
81117395Skan
82117395Skan