mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
18dfd49137
If a struct would end up half in GPRs and half on SP the ABI says it should actually go entirely on the stack. We were getting this wrong in GlobalISel before, causing compatibility issues. llvm-svn: 311388
66 lines
2.1 KiB
C++
66 lines
2.1 KiB
C++
//===- AArch64CallLowering.h - Call lowering --------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// This file describes how to lower LLVM calls to machine code calls.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64CALLLOWERING_H
|
|
#define LLVM_LIB_TARGET_AARCH64_AARCH64CALLLOWERING_H
|
|
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
|
|
#include "llvm/IR/CallingConv.h"
|
|
#include <cstdint>
|
|
#include <functional>
|
|
|
|
namespace llvm {
|
|
|
|
class AArch64TargetLowering;
|
|
class CCValAssign;
|
|
class DataLayout;
|
|
class MachineIRBuilder;
|
|
class MachineRegisterInfo;
|
|
class Type;
|
|
|
|
class AArch64CallLowering: public CallLowering {
|
|
public:
|
|
AArch64CallLowering(const AArch64TargetLowering &TLI);
|
|
|
|
bool lowerReturn(MachineIRBuilder &MIRBuiler, const Value *Val,
|
|
unsigned VReg) const override;
|
|
|
|
bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F,
|
|
ArrayRef<unsigned> VRegs) const override;
|
|
|
|
bool lowerCall(MachineIRBuilder &MIRBuilder, CallingConv::ID CallConv,
|
|
const MachineOperand &Callee, const ArgInfo &OrigRet,
|
|
ArrayRef<ArgInfo> OrigArgs) const override;
|
|
|
|
private:
|
|
using RegHandler = std::function<void(MachineIRBuilder &, Type *, unsigned,
|
|
CCValAssign &)>;
|
|
|
|
using MemHandler =
|
|
std::function<void(MachineIRBuilder &, int, CCValAssign &)>;
|
|
|
|
using SplitArgTy = std::function<void(unsigned, uint64_t)>;
|
|
|
|
void splitToValueTypes(const ArgInfo &OrigArgInfo,
|
|
SmallVectorImpl<ArgInfo> &SplitArgs,
|
|
const DataLayout &DL, MachineRegisterInfo &MRI,
|
|
CallingConv::ID CallConv,
|
|
const SplitArgTy &SplitArg) const;
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_LIB_TARGET_AARCH64_AARCH64CALLLOWERING_H
|