1//===-- MBlazeTargetMachine.cpp - Define TargetMachine for MBlaze ---------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Implements the info about MBlaze target spec.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MBlazeTargetMachine.h"
15#include "MBlaze.h"
16#include "llvm/PassManager.h"
17#include "llvm/CodeGen/Passes.h"
18#include "llvm/Support/FormattedStream.h"
19#include "llvm/Support/TargetRegistry.h"
20#include "llvm/Target/TargetOptions.h"
21using namespace llvm;
22
23extern "C" void LLVMInitializeMBlazeTarget() {
24  // Register the target.
25  RegisterTargetMachine<MBlazeTargetMachine> X(TheMBlazeTarget);
26}
27
28// DataLayout --> Big-endian, 32-bit pointer/ABI/alignment
29// The stack is always 8 byte aligned
30// On function prologue, the stack is created by decrementing
31// its pointer. Once decremented, all references are done with positive
32// offset from the stack/frame pointer, using StackGrowsUp enables
33// an easier handling.
34MBlazeTargetMachine::
35MBlazeTargetMachine(const Target &T, StringRef TT,
36                    StringRef CPU, StringRef FS, const TargetOptions &Options,
37                    Reloc::Model RM, CodeModel::Model CM,
38                    CodeGenOpt::Level OL)
39  : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
40    Subtarget(TT, CPU, FS),
41    DataLayout("E-p:32:32:32-i8:8:8-i16:16:16"),
42    InstrInfo(*this),
43    FrameLowering(Subtarget),
44    TLInfo(*this), TSInfo(*this), ELFWriterInfo(*this),
45    InstrItins(Subtarget.getInstrItineraryData()) {
46}
47
48namespace {
49/// MBlaze Code Generator Pass Configuration Options.
50class MBlazePassConfig : public TargetPassConfig {
51public:
52  MBlazePassConfig(MBlazeTargetMachine *TM, PassManagerBase &PM)
53    : TargetPassConfig(TM, PM) {}
54
55  MBlazeTargetMachine &getMBlazeTargetMachine() const {
56    return getTM<MBlazeTargetMachine>();
57  }
58
59  virtual bool addInstSelector();
60  virtual bool addPreEmitPass();
61};
62} // namespace
63
64TargetPassConfig *MBlazeTargetMachine::createPassConfig(PassManagerBase &PM) {
65  return new MBlazePassConfig(this, PM);
66}
67
68// Install an instruction selector pass using
69// the ISelDag to gen MBlaze code.
70bool MBlazePassConfig::addInstSelector() {
71  addPass(createMBlazeISelDag(getMBlazeTargetMachine()));
72  return false;
73}
74
75// Implemented by targets that want to run passes immediately before
76// machine code is emitted. return true if -print-machineinstrs should
77// print out the code after the passes.
78bool MBlazePassConfig::addPreEmitPass() {
79  addPass(createMBlazeDelaySlotFillerPass(getMBlazeTargetMachine()));
80  return true;
81}
82