mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-31 12:30:06 +00:00
based on the Function. This is currently used to implement mips16 support in the mips backend via the existing module pass resetting the subtarget. Things to note: a) This involved running resetTargetOptions before creating a new subtarget so that code generation options like soft-float could be recognized when creating the new subtarget. This is to deal with initialization code in isel lowering that only paid attention to the initial value. b) Many of the existing testcases weren't using the soft-float feature correctly. I've corrected these based on the check values assuming that was the desired behavior. c) The mips port now pays attention to the target-cpu and target-features strings when generating code for a particular function. I've removed these from one function where the requested cpu and features didn't match the check lines in the testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218492 91177308-0d34-0410-b5e6-96231b3b80d8
85 lines
2.6 KiB
C++
85 lines
2.6 KiB
C++
//===-- MipsTargetMachine.h - Define TargetMachine for Mips -----*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares the Mips specific subclass of TargetMachine.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H
|
|
#define LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H
|
|
|
|
#include "MipsSubtarget.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/CodeGen/SelectionDAGISel.h"
|
|
#include "llvm/Target/TargetFrameLowering.h"
|
|
#include "llvm/Target/TargetMachine.h"
|
|
|
|
namespace llvm {
|
|
class formatted_raw_ostream;
|
|
class MipsRegisterInfo;
|
|
|
|
class MipsTargetMachine : public LLVMTargetMachine {
|
|
bool isLittle;
|
|
MipsSubtarget *Subtarget;
|
|
MipsSubtarget DefaultSubtarget;
|
|
MipsSubtarget NoMips16Subtarget;
|
|
MipsSubtarget Mips16Subtarget;
|
|
|
|
mutable StringMap<std::unique_ptr<MipsSubtarget>> SubtargetMap;
|
|
|
|
public:
|
|
MipsTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS,
|
|
const TargetOptions &Options, Reloc::Model RM,
|
|
CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle);
|
|
|
|
virtual ~MipsTargetMachine() {}
|
|
|
|
void addAnalysisPasses(PassManagerBase &PM) override;
|
|
|
|
const MipsSubtarget *getSubtargetImpl() const override {
|
|
if (Subtarget)
|
|
return Subtarget;
|
|
return &DefaultSubtarget;
|
|
}
|
|
|
|
const MipsSubtarget *getSubtargetImpl(const Function &F) const override;
|
|
|
|
/// \brief Reset the subtarget for the Mips target.
|
|
void resetSubtarget(MachineFunction *MF);
|
|
|
|
// Pass Pipeline Configuration
|
|
TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
|
|
};
|
|
|
|
/// MipsebTargetMachine - Mips32/64 big endian target machine.
|
|
///
|
|
class MipsebTargetMachine : public MipsTargetMachine {
|
|
virtual void anchor();
|
|
public:
|
|
MipsebTargetMachine(const Target &T, StringRef TT,
|
|
StringRef CPU, StringRef FS, const TargetOptions &Options,
|
|
Reloc::Model RM, CodeModel::Model CM,
|
|
CodeGenOpt::Level OL);
|
|
};
|
|
|
|
/// MipselTargetMachine - Mips32/64 little endian target machine.
|
|
///
|
|
class MipselTargetMachine : public MipsTargetMachine {
|
|
virtual void anchor();
|
|
public:
|
|
MipselTargetMachine(const Target &T, StringRef TT,
|
|
StringRef CPU, StringRef FS, const TargetOptions &Options,
|
|
Reloc::Model RM, CodeModel::Model CM,
|
|
CodeGenOpt::Level OL);
|
|
};
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif
|