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