MSP430TargetMachine.cpp revision d04a8d4b33ff316ca4cf961e06c9e312eff8e64f
17800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek//===-- MSP430TargetMachine.cpp - Define TargetMachine for MSP430 ---------===// 27800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek// 37800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek// The LLVM Compiler Infrastructure 47800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek// 57800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek// This file is distributed under the University of Illinois Open Source 67800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek// License. See LICENSE.TXT for details. 77800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek// 87800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek//===----------------------------------------------------------------------===// 97800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek// 107800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek// Top-level implementation for the MSP430 target. 117800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek// 127800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek//===----------------------------------------------------------------------===// 137800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 147800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek#include "MSP430TargetMachine.h" 157800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek#include "MSP430.h" 167800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek#include "llvm/CodeGen/Passes.h" 177800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek#include "llvm/MC/MCAsmInfo.h" 187800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek#include "llvm/PassManager.h" 197800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek#include "llvm/Support/TargetRegistry.h" 207800212ef29be314d55814e8dcc568ff8beed106Ted Kremenekusing namespace llvm; 217800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 22fdd0ced001babd4e65fb909cc2f847df53faf764Ted Kremenekextern "C" void LLVMInitializeMSP430Target() { 237800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek // Register the target. 247800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek RegisterTargetMachine<MSP430TargetMachine> X(TheMSP430Target); 257800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek} 267800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 277800212ef29be314d55814e8dcc568ff8beed106Ted KremenekMSP430TargetMachine::MSP430TargetMachine(const Target &T, 287800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek StringRef TT, 297800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek StringRef CPU, 307800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek StringRef FS, 317800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek const TargetOptions &Options, 327800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek Reloc::Model RM, CodeModel::Model CM, 337800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek CodeGenOpt::Level OL) 347800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), 357800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek Subtarget(TT, CPU, FS), 367800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek // FIXME: Check DataLayout string. 377800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek DL("e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16"), 387800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek InstrInfo(*this), TLInfo(*this), TSInfo(*this), 397800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek FrameLowering(Subtarget), STTI(&TLInfo), VTTI(&TLInfo) { } 407800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 417800212ef29be314d55814e8dcc568ff8beed106Ted Kremeneknamespace { 427800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek/// MSP430 Code Generator Pass Configuration Options. 437800212ef29be314d55814e8dcc568ff8beed106Ted Kremenekclass MSP430PassConfig : public TargetPassConfig { 447800212ef29be314d55814e8dcc568ff8beed106Ted Kremenekpublic: 457800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek MSP430PassConfig(MSP430TargetMachine *TM, PassManagerBase &PM) 467800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek : TargetPassConfig(TM, PM) {} 477800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 487800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek MSP430TargetMachine &getMSP430TargetMachine() const { 497800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek return getTM<MSP430TargetMachine>(); 507800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek } 517800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 527800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek virtual bool addInstSelector(); 537800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek virtual bool addPreEmitPass(); 547800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek}; 557800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek} // namespace 567800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 577800212ef29be314d55814e8dcc568ff8beed106Ted KremenekTargetPassConfig *MSP430TargetMachine::createPassConfig(PassManagerBase &PM) { 587800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek return new MSP430PassConfig(this, PM); 597800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek} 607800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 617800212ef29be314d55814e8dcc568ff8beed106Ted Kremenekbool MSP430PassConfig::addInstSelector() { 627800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek // Install an instruction selector. 637800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek addPass(createMSP430ISelDag(getMSP430TargetMachine(), getOptLevel())); 6459b61613ed3b835f869b0f6fa1db52b8c963c5e5Ted Kremenek return false; 657800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek} 667800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 677800212ef29be314d55814e8dcc568ff8beed106Ted Kremenekbool MSP430PassConfig::addPreEmitPass() { 687800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek // Must run branch selection immediately preceding the asm printer. 697800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek addPass(createMSP430BranchSelectionPass()); 707800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek return false; 717800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek} 727800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek