mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
034261674b
be the first encoded as the first feature. It then uses the CPU name to look up features / scheduling itineray even though clients know full well the CPU name being used to query these properties. The fix is to just have the clients explictly pass the CPU name! llvm-svn: 134127
115 lines
3.8 KiB
C++
115 lines
3.8 KiB
C++
//===-- MBlazeTargetMachine.cpp - Define TargetMachine for MBlaze ---------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Implements the info about MBlaze target spec.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "MBlaze.h"
|
|
#include "MBlazeMCAsmInfo.h"
|
|
#include "MBlazeTargetMachine.h"
|
|
#include "llvm/PassManager.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/Support/FormattedStream.h"
|
|
#include "llvm/Target/TargetOptions.h"
|
|
#include "llvm/Target/TargetRegistry.h"
|
|
using namespace llvm;
|
|
|
|
static MCAsmInfo *createMCAsmInfo(const Target &T, StringRef TT) {
|
|
Triple TheTriple(TT);
|
|
switch (TheTriple.getOS()) {
|
|
default:
|
|
return new MBlazeMCAsmInfo();
|
|
}
|
|
}
|
|
|
|
static MCStreamer *createMCStreamer(const Target &T, const std::string &TT,
|
|
MCContext &Ctx, TargetAsmBackend &TAB,
|
|
raw_ostream &_OS,
|
|
MCCodeEmitter *_Emitter,
|
|
bool RelaxAll,
|
|
bool NoExecStack) {
|
|
Triple TheTriple(TT);
|
|
|
|
if (TheTriple.isOSDarwin()) {
|
|
llvm_unreachable("MBlaze does not support Darwin MACH-O format");
|
|
return NULL;
|
|
}
|
|
|
|
if (TheTriple.isOSWindows()) {
|
|
llvm_unreachable("MBlaze does not support Windows COFF format");
|
|
return NULL;
|
|
}
|
|
|
|
return createELFStreamer(Ctx, TAB, _OS, _Emitter, RelaxAll, NoExecStack);
|
|
}
|
|
|
|
|
|
extern "C" void LLVMInitializeMBlazeTarget() {
|
|
// Register the target.
|
|
RegisterTargetMachine<MBlazeTargetMachine> X(TheMBlazeTarget);
|
|
|
|
// Register the target asm info.
|
|
RegisterAsmInfoFn A(TheMBlazeTarget, createMCAsmInfo);
|
|
|
|
// Register the MC code emitter
|
|
TargetRegistry::RegisterCodeEmitter(TheMBlazeTarget,
|
|
llvm::createMBlazeMCCodeEmitter);
|
|
|
|
// Register the asm backend
|
|
TargetRegistry::RegisterAsmBackend(TheMBlazeTarget,
|
|
createMBlazeAsmBackend);
|
|
|
|
// Register the object streamer
|
|
TargetRegistry::RegisterObjectStreamer(TheMBlazeTarget,
|
|
createMCStreamer);
|
|
|
|
}
|
|
|
|
// DataLayout --> Big-endian, 32-bit pointer/ABI/alignment
|
|
// The stack is always 8 byte aligned
|
|
// On function prologue, the stack is created by decrementing
|
|
// its pointer. Once decremented, all references are done with positive
|
|
// offset from the stack/frame pointer, using StackGrowsUp enables
|
|
// an easier handling.
|
|
MBlazeTargetMachine::
|
|
MBlazeTargetMachine(const Target &T, const std::string &TT,
|
|
const std::string &CPU, const std::string &FS):
|
|
LLVMTargetMachine(T, TT),
|
|
Subtarget(TT, CPU, FS),
|
|
DataLayout("E-p:32:32:32-i8:8:8-i16:16:16"),
|
|
InstrInfo(*this),
|
|
FrameLowering(Subtarget),
|
|
TLInfo(*this), TSInfo(*this), ELFWriterInfo(*this),
|
|
InstrItins(Subtarget.getInstrItineraryData()) {
|
|
if (getRelocationModel() == Reloc::Default) {
|
|
setRelocationModel(Reloc::Static);
|
|
}
|
|
|
|
if (getCodeModel() == CodeModel::Default)
|
|
setCodeModel(CodeModel::Small);
|
|
}
|
|
|
|
// Install an instruction selector pass using
|
|
// the ISelDag to gen MBlaze code.
|
|
bool MBlazeTargetMachine::addInstSelector(PassManagerBase &PM,
|
|
CodeGenOpt::Level OptLevel) {
|
|
PM.add(createMBlazeISelDag(*this));
|
|
return false;
|
|
}
|
|
|
|
// Implemented by targets that want to run passes immediately before
|
|
// machine code is emitted. return true if -print-machineinstrs should
|
|
// print out the code after the passes.
|
|
bool MBlazeTargetMachine::addPreEmitPass(PassManagerBase &PM,
|
|
CodeGenOpt::Level OptLevel) {
|
|
PM.add(createMBlazeDelaySlotFillerPass(*this));
|
|
return true;
|
|
}
|