blob: f5b6501a06713dc9e9f67f3b36f766ef0dc53202 [file] [log] [blame]
Wesley Pecka70f28c2010-02-23 19:15:24 +00001//===-- 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 "MBlaze.h"
15#include "MBlazeMCAsmInfo.h"
16#include "MBlazeTargetMachine.h"
17#include "llvm/PassManager.h"
Wesley Peck4e9141f2010-10-21 03:57:26 +000018#include "llvm/CodeGen/Passes.h"
19#include "llvm/Support/FormattedStream.h"
20#include "llvm/Target/TargetOptions.h"
Wesley Pecka70f28c2010-02-23 19:15:24 +000021#include "llvm/Target/TargetRegistry.h"
22using namespace llvm;
23
Wesley Peck4e9141f2010-10-21 03:57:26 +000024static MCStreamer *createMCStreamer(const Target &T, const std::string &TT,
25 MCContext &Ctx, TargetAsmBackend &TAB,
26 raw_ostream &_OS,
27 MCCodeEmitter *_Emitter,
28 bool RelaxAll) {
29 Triple TheTriple(TT);
30 switch (TheTriple.getOS()) {
31 case Triple::Darwin:
32 llvm_unreachable("MBlaze does not support Darwin MACH-O format");
33 return NULL;
34 case Triple::MinGW32:
35 case Triple::MinGW64:
36 case Triple::Cygwin:
37 case Triple::Win32:
38 llvm_unreachable("ARM does not support Windows COFF format");
39 return NULL;
40 default:
41 return createELFStreamer(Ctx, TAB, _OS, _Emitter, RelaxAll);
42 }
43}
44
45
Wesley Pecka70f28c2010-02-23 19:15:24 +000046extern "C" void LLVMInitializeMBlazeTarget() {
47 // Register the target.
48 RegisterTargetMachine<MBlazeTargetMachine> X(TheMBlazeTarget);
49 RegisterAsmInfo<MBlazeMCAsmInfo> A(TheMBlazeTarget);
Wesley Peck4e9141f2010-10-21 03:57:26 +000050
51 // Register the MC code emitter
52 TargetRegistry::RegisterCodeEmitter(TheMBlazeTarget,
53 llvm::createMBlazeMCCodeEmitter);
54
55 // Register the asm backend
56 TargetRegistry::RegisterAsmBackend(TheMBlazeTarget,
57 createMBlazeAsmBackend);
58
59 // Register the object streamer
60 TargetRegistry::RegisterObjectStreamer(TheMBlazeTarget,
61 createMCStreamer);
62
Wesley Pecka70f28c2010-02-23 19:15:24 +000063}
64
65// DataLayout --> Big-endian, 32-bit pointer/ABI/alignment
66// The stack is always 8 byte aligned
67// On function prologue, the stack is created by decrementing
68// its pointer. Once decremented, all references are done with positive
69// offset from the stack/frame pointer, using StackGrowsUp enables
70// an easier handling.
71MBlazeTargetMachine::
72MBlazeTargetMachine(const Target &T, const std::string &TT,
73 const std::string &FS):
74 LLVMTargetMachine(T, TT),
75 Subtarget(TT, FS),
76 DataLayout("E-p:32:32-i8:8:8-i16:16:16-i64:32:32-"
77 "f64:32:32-v64:32:32-v128:32:32-n32"),
78 InstrInfo(*this),
79 FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0),
Wesley Peck4e9141f2010-10-21 03:57:26 +000080 TLInfo(*this), TSInfo(*this), ELFWriterInfo(*this) {
Wesley Pecka70f28c2010-02-23 19:15:24 +000081 if (getRelocationModel() == Reloc::Default) {
82 setRelocationModel(Reloc::Static);
83 }
84
85 if (getCodeModel() == CodeModel::Default)
86 setCodeModel(CodeModel::Small);
87}
88
89// Install an instruction selector pass using
90// the ISelDag to gen MBlaze code.
91bool MBlazeTargetMachine::
92addInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel) {
93 PM.add(createMBlazeISelDag(*this));
94 return false;
95}
96
97// Implemented by targets that want to run passes immediately before
98// machine code is emitted. return true if -print-machineinstrs should
99// print out the code after the passes.
100bool MBlazeTargetMachine::
101addPreEmitPass(PassManagerBase &PM, CodeGenOpt::Level OptLevel) {
102 PM.add(createMBlazeDelaySlotFillerPass(*this));
103 return true;
104}