mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-01 19:29:22 +00:00
directly care about the Value class (it is templated so that the key can be any arbitrary Value subclass), it is in fact concretely tied to the Value class through the ValueHandle's CallbackVH interface which relies on the key type being some Value subclass to establish the value handle chain. Ironically, the unittest is already in the right library. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202824 91177308-0d34-0410-b5e6-96231b3b80d8
148 lines
4.7 KiB
C++
148 lines
4.7 KiB
C++
//===-- MipsMachineFunctionInfo.h - Private data used 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 MachineFunctionInfo.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef MIPS_MACHINE_FUNCTION_INFO_H
|
|
#define MIPS_MACHINE_FUNCTION_INFO_H
|
|
|
|
#include "Mips16HardFloatInfo.h"
|
|
#include "MipsSubtarget.h"
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
|
#include "llvm/CodeGen/MachineFunction.h"
|
|
#include "llvm/CodeGen/MachineMemOperand.h"
|
|
#include "llvm/CodeGen/PseudoSourceValue.h"
|
|
#include "llvm/IR/GlobalValue.h"
|
|
#include "llvm/IR/ValueMap.h"
|
|
#include "llvm/Target/TargetFrameLowering.h"
|
|
#include "llvm/Target/TargetMachine.h"
|
|
#include <map>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
namespace llvm {
|
|
|
|
/// \brief A class derived from PseudoSourceValue that represents a GOT entry
|
|
/// resolved by lazy-binding.
|
|
class MipsCallEntry : public PseudoSourceValue {
|
|
public:
|
|
explicit MipsCallEntry(const StringRef &N);
|
|
explicit MipsCallEntry(const GlobalValue *V);
|
|
virtual bool isConstant(const MachineFrameInfo *) const;
|
|
virtual bool isAliased(const MachineFrameInfo *) const;
|
|
virtual bool mayAlias(const MachineFrameInfo *) const;
|
|
|
|
private:
|
|
virtual void printCustom(raw_ostream &O) const;
|
|
#ifndef NDEBUG
|
|
std::string Name;
|
|
const GlobalValue *Val;
|
|
#endif
|
|
};
|
|
|
|
/// MipsFunctionInfo - This class is derived from MachineFunction private
|
|
/// Mips target-specific information for each MachineFunction.
|
|
class MipsFunctionInfo : public MachineFunctionInfo {
|
|
public:
|
|
MipsFunctionInfo(MachineFunction &MF)
|
|
: MF(MF), SRetReturnReg(0), GlobalBaseReg(0), Mips16SPAliasReg(0),
|
|
VarArgsFrameIndex(0), CallsEhReturn(false), SaveS2(false) {}
|
|
|
|
~MipsFunctionInfo();
|
|
|
|
unsigned getSRetReturnReg() const { return SRetReturnReg; }
|
|
void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
|
|
|
|
bool globalBaseRegSet() const;
|
|
unsigned getGlobalBaseReg();
|
|
|
|
bool mips16SPAliasRegSet() const;
|
|
unsigned getMips16SPAliasReg();
|
|
|
|
int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
|
|
void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
|
|
|
|
bool hasByvalArg() const { return HasByvalArg; }
|
|
void setFormalArgInfo(unsigned Size, bool HasByval) {
|
|
IncomingArgSize = Size;
|
|
HasByvalArg = HasByval;
|
|
}
|
|
|
|
unsigned getIncomingArgSize() const { return IncomingArgSize; }
|
|
|
|
bool callsEhReturn() const { return CallsEhReturn; }
|
|
void setCallsEhReturn() { CallsEhReturn = true; }
|
|
|
|
void createEhDataRegsFI();
|
|
int getEhDataRegFI(unsigned Reg) const { return EhDataRegFI[Reg]; }
|
|
bool isEhDataRegFI(int FI) const;
|
|
|
|
/// \brief Create a MachinePointerInfo that has a MipsCallEntr object
|
|
/// representing a GOT entry for an external function.
|
|
MachinePointerInfo callPtrInfo(const StringRef &Name);
|
|
|
|
/// \brief Create a MachinePointerInfo that has a MipsCallEntr object
|
|
/// representing a GOT entry for a global function.
|
|
MachinePointerInfo callPtrInfo(const GlobalValue *Val);
|
|
|
|
void setSaveS2() { SaveS2 = true; }
|
|
bool hasSaveS2() const { return SaveS2; }
|
|
|
|
std::map<const char *, const llvm::Mips16HardFloatInfo::FuncSignature *>
|
|
StubsNeeded;
|
|
|
|
private:
|
|
virtual void anchor();
|
|
|
|
MachineFunction& MF;
|
|
/// SRetReturnReg - Some subtargets require that sret lowering includes
|
|
/// returning the value of the returned struct in a register. This field
|
|
/// holds the virtual register into which the sret argument is passed.
|
|
unsigned SRetReturnReg;
|
|
|
|
/// GlobalBaseReg - keeps track of the virtual register initialized for
|
|
/// use as the global base register. This is used for PIC in some PIC
|
|
/// relocation models.
|
|
unsigned GlobalBaseReg;
|
|
|
|
/// Mips16SPAliasReg - keeps track of the virtual register initialized for
|
|
/// use as an alias for SP for use in load/store of halfword/byte from/to
|
|
/// the stack
|
|
unsigned Mips16SPAliasReg;
|
|
|
|
/// VarArgsFrameIndex - FrameIndex for start of varargs area.
|
|
int VarArgsFrameIndex;
|
|
|
|
/// True if function has a byval argument.
|
|
bool HasByvalArg;
|
|
|
|
/// Size of incoming argument area.
|
|
unsigned IncomingArgSize;
|
|
|
|
/// CallsEhReturn - Whether the function calls llvm.eh.return.
|
|
bool CallsEhReturn;
|
|
|
|
/// Frame objects for spilling eh data registers.
|
|
int EhDataRegFI[4];
|
|
|
|
// saveS2
|
|
bool SaveS2;
|
|
|
|
/// MipsCallEntry maps.
|
|
StringMap<const MipsCallEntry *> ExternalCallEntries;
|
|
ValueMap<const GlobalValue *, const MipsCallEntry *> GlobalCallEntries;
|
|
};
|
|
|
|
} // end of namespace llvm
|
|
|
|
#endif // MIPS_MACHINE_FUNCTION_INFO_H
|