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