Index: lib/Target/Mips/CMakeLists.txt =================================================================== --- lib/Target/Mips/CMakeLists.txt +++ lib/Target/Mips/CMakeLists.txt @@ -21,7 +21,6 @@ Mips16ISelDAGToDAG.cpp Mips16ISelLowering.cpp Mips16RegisterInfo.cpp - MipsABIInfo.cpp MipsAnalyzeImmediate.cpp MipsAsmPrinter.cpp MipsCCState.cpp Index: lib/Target/Mips/MCTargetDesc/CMakeLists.txt =================================================================== --- lib/Target/Mips/MCTargetDesc/CMakeLists.txt +++ lib/Target/Mips/MCTargetDesc/CMakeLists.txt @@ -1,4 +1,5 @@ add_llvm_library(LLVMMipsDesc + MipsABIInfo.cpp MipsABIFlagsSection.cpp MipsAsmBackend.cpp MipsELFObjectWriter.cpp Index: lib/Target/Mips/MCTargetDesc/MipsABIInfo.h =================================================================== --- /dev/null +++ lib/Target/Mips/MCTargetDesc/MipsABIInfo.h @@ -0,0 +1,61 @@ +//===---- MipsABIInfo.h - Information about MIPS ABI's --------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef MIPSABIINFO_H +#define MIPSABIINFO_H + +#include "llvm/ADT/ArrayRef.h" +#include "llvm/MC/MCRegisterInfo.h" +#include "llvm/IR/CallingConv.h" + +namespace llvm { + +class MipsABIInfo { +public: + enum class ABI { Unknown, O32, N32, N64, EABI }; + +protected: + ABI ThisABI; + +public: + MipsABIInfo(ABI ThisABI) : ThisABI(ThisABI) {} + + static MipsABIInfo Unknown() { return MipsABIInfo(ABI::Unknown); } + static MipsABIInfo O32() { return MipsABIInfo(ABI::O32); } + static MipsABIInfo N32() { return MipsABIInfo(ABI::N32); } + static MipsABIInfo N64() { return MipsABIInfo(ABI::N64); } + static MipsABIInfo EABI() { return MipsABIInfo(ABI::EABI); } + + bool IsKnown() const { return ThisABI != ABI::Unknown; } + bool IsO32() const { return ThisABI == ABI::O32; } + bool IsN32() const { return ThisABI == ABI::N32; } + bool IsN64() const { return ThisABI == ABI::N64; } + bool IsEABI() const { return ThisABI == ABI::EABI; } + ABI GetEnumValue() const { return ThisABI; } + + /// The registers to use for byval arguments. + const ArrayRef GetByValArgRegs() const; + + /// The registers to use for the variable argument list. + const ArrayRef GetVarArgRegs() const; + + /// Obtain the size of the area allocated by the callee for arguments. + /// CallingConv::FastCall affects the value for O32. + unsigned GetCalleeAllocdArgSizeInBytes(CallingConv::ID CC) const; + + /// Ordering of ABI's + /// MipsGenSubtargetInfo.inc will use this to resolve conflicts when given + /// multiple ABI options. + bool operator<(const MipsABIInfo Other) const { + return ThisABI < Other.GetEnumValue(); + } +}; +} + +#endif Index: lib/Target/Mips/MCTargetDesc/MipsABIInfo.cpp =================================================================== --- /dev/null +++ lib/Target/Mips/MCTargetDesc/MipsABIInfo.cpp @@ -0,0 +1,45 @@ +//===---- MipsABIInfo.cpp - Information about MIPS ABI's ------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "MipsABIInfo.h" +#include "MipsRegisterInfo.h" + +using namespace llvm; + +namespace { +static const MCPhysReg O32IntRegs[4] = {Mips::A0, Mips::A1, Mips::A2, Mips::A3}; + +static const MCPhysReg Mips64IntRegs[8] = { + Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64, + Mips::T0_64, Mips::T1_64, Mips::T2_64, Mips::T3_64}; +} + +const ArrayRef MipsABIInfo::GetByValArgRegs() const { + if (IsO32()) + return makeArrayRef(O32IntRegs); + if (IsN32() || IsN64()) + return makeArrayRef(Mips64IntRegs); + llvm_unreachable("Unhandled ABI"); +} + +const ArrayRef MipsABIInfo::GetVarArgRegs() const { + if (IsO32()) + return makeArrayRef(O32IntRegs); + if (IsN32() || IsN64()) + return makeArrayRef(Mips64IntRegs); + llvm_unreachable("Unhandled ABI"); +} + +unsigned MipsABIInfo::GetCalleeAllocdArgSizeInBytes(CallingConv::ID CC) const { + if (IsO32()) + return CC != CallingConv::Fast ? 16 : 0; + if (IsN32() || IsN64() || IsEABI()) + return 0; + llvm_unreachable("Unhandled ABI"); +} Index: lib/Target/Mips/MipsABIInfo.h =================================================================== --- lib/Target/Mips/MipsABIInfo.h +++ /dev/null @@ -1,61 +0,0 @@ -//===---- MipsABIInfo.h - Information about MIPS ABI's --------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef MIPSABIINFO_H -#define MIPSABIINFO_H - -#include "llvm/ADT/ArrayRef.h" -#include "llvm/MC/MCRegisterInfo.h" -#include "llvm/IR/CallingConv.h" - -namespace llvm { - -class MipsABIInfo { -public: - enum class ABI { Unknown, O32, N32, N64, EABI }; - -protected: - ABI ThisABI; - -public: - MipsABIInfo(ABI ThisABI) : ThisABI(ThisABI) {} - - static MipsABIInfo Unknown() { return MipsABIInfo(ABI::Unknown); } - static MipsABIInfo O32() { return MipsABIInfo(ABI::O32); } - static MipsABIInfo N32() { return MipsABIInfo(ABI::N32); } - static MipsABIInfo N64() { return MipsABIInfo(ABI::N64); } - static MipsABIInfo EABI() { return MipsABIInfo(ABI::EABI); } - - bool IsKnown() const { return ThisABI != ABI::Unknown; } - bool IsO32() const { return ThisABI == ABI::O32; } - bool IsN32() const { return ThisABI == ABI::N32; } - bool IsN64() const { return ThisABI == ABI::N64; } - bool IsEABI() const { return ThisABI == ABI::EABI; } - ABI GetEnumValue() const { return ThisABI; } - - /// The registers to use for byval arguments. - const ArrayRef GetByValArgRegs() const; - - /// The registers to use for the variable argument list. - const ArrayRef GetVarArgRegs() const; - - /// Obtain the size of the area allocated by the callee for arguments. - /// CallingConv::FastCall affects the value for O32. - unsigned GetCalleeAllocdArgSizeInBytes(CallingConv::ID CC) const; - - /// Ordering of ABI's - /// MipsGenSubtargetInfo.inc will use this to resolve conflicts when given - /// multiple ABI options. - bool operator<(const MipsABIInfo Other) const { - return ThisABI < Other.GetEnumValue(); - } -}; -} - -#endif Index: lib/Target/Mips/MipsABIInfo.cpp =================================================================== --- lib/Target/Mips/MipsABIInfo.cpp +++ /dev/null @@ -1,45 +0,0 @@ -//===---- MipsABIInfo.cpp - Information about MIPS ABI's ------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "MipsABIInfo.h" -#include "MipsRegisterInfo.h" - -using namespace llvm; - -namespace { -static const MCPhysReg O32IntRegs[4] = {Mips::A0, Mips::A1, Mips::A2, Mips::A3}; - -static const MCPhysReg Mips64IntRegs[8] = { - Mips::A0_64, Mips::A1_64, Mips::A2_64, Mips::A3_64, - Mips::T0_64, Mips::T1_64, Mips::T2_64, Mips::T3_64}; -} - -const ArrayRef MipsABIInfo::GetByValArgRegs() const { - if (IsO32()) - return makeArrayRef(O32IntRegs); - if (IsN32() || IsN64()) - return makeArrayRef(Mips64IntRegs); - llvm_unreachable("Unhandled ABI"); -} - -const ArrayRef MipsABIInfo::GetVarArgRegs() const { - if (IsO32()) - return makeArrayRef(O32IntRegs); - if (IsN32() || IsN64()) - return makeArrayRef(Mips64IntRegs); - llvm_unreachable("Unhandled ABI"); -} - -unsigned MipsABIInfo::GetCalleeAllocdArgSizeInBytes(CallingConv::ID CC) const { - if (IsO32()) - return CC != CallingConv::Fast ? 16 : 0; - if (IsN32() || IsN64() || IsEABI()) - return 0; - llvm_unreachable("Unhandled ABI"); -} Index: lib/Target/Mips/MipsSubtarget.h =================================================================== --- lib/Target/Mips/MipsSubtarget.h +++ lib/Target/Mips/MipsSubtarget.h @@ -22,7 +22,7 @@ #include "llvm/MC/MCInstrItineraries.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Target/TargetSubtargetInfo.h" -#include "MipsABIInfo.h" +#include "MCTargetDesc/MipsABIInfo.h" #include #define GET_SUBTARGETINFO_HEADER