| //===-- PPCMachineFunctionInfo.cpp - Private data used for PowerPC --------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "PPCMachineFunctionInfo.h" |
| #include "llvm/ADT/Twine.h" |
| #include "llvm/BinaryFormat/XCOFF.h" |
| #include "llvm/IR/DataLayout.h" |
| #include "llvm/MC/MCContext.h" |
| #include "llvm/Support/CommandLine.h" |
| |
| using namespace llvm; |
| static cl::opt<bool> PPCDisableNonVolatileCR( |
| "ppc-disable-non-volatile-cr", |
| cl::desc("Disable the use of non-volatile CR register fields"), |
| cl::init(false), cl::Hidden); |
| |
| void PPCFunctionInfo::anchor() {} |
| PPCFunctionInfo::PPCFunctionInfo(const Function &F, |
| const TargetSubtargetInfo *STI) |
| : DisableNonVolatileCR(PPCDisableNonVolatileCR) {} |
| |
| MachineFunctionInfo * |
| PPCFunctionInfo::clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, |
| const DenseMap<MachineBasicBlock *, MachineBasicBlock *> |
| &Src2DstMBB) const { |
| return DestMF.cloneInfo<PPCFunctionInfo>(*this); |
| } |
| |
| MCSymbol *PPCFunctionInfo::getPICOffsetSymbol(MachineFunction &MF) const { |
| const DataLayout &DL = MF.getDataLayout(); |
| return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) + |
| Twine(MF.getFunctionNumber()) + |
| "$poff"); |
| } |
| |
| MCSymbol *PPCFunctionInfo::getGlobalEPSymbol(MachineFunction &MF) const { |
| const DataLayout &DL = MF.getDataLayout(); |
| return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) + |
| "func_gep" + |
| Twine(MF.getFunctionNumber())); |
| } |
| |
| MCSymbol *PPCFunctionInfo::getLocalEPSymbol(MachineFunction &MF) const { |
| const DataLayout &DL = MF.getDataLayout(); |
| return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) + |
| "func_lep" + |
| Twine(MF.getFunctionNumber())); |
| } |
| |
| MCSymbol *PPCFunctionInfo::getTOCOffsetSymbol(MachineFunction &MF) const { |
| const DataLayout &DL = MF.getDataLayout(); |
| return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) + |
| "func_toc" + |
| Twine(MF.getFunctionNumber())); |
| } |
| |
| bool PPCFunctionInfo::isLiveInSExt(Register VReg) const { |
| for (const std::pair<Register, ISD::ArgFlagsTy> &LiveIn : LiveInAttrs) |
| if (LiveIn.first == VReg) |
| return LiveIn.second.isSExt(); |
| return false; |
| } |
| |
| bool PPCFunctionInfo::isLiveInZExt(Register VReg) const { |
| for (const std::pair<Register, ISD::ArgFlagsTy> &LiveIn : LiveInAttrs) |
| if (LiveIn.first == VReg) |
| return LiveIn.second.isZExt(); |
| return false; |
| } |
| |
| void PPCFunctionInfo::appendParameterType(ParamType Type) { |
| |
| ParamtersType.push_back(Type); |
| switch (Type) { |
| case FixedType: |
| ++FixedParmsNum; |
| return; |
| case ShortFloatingPoint: |
| case LongFloatingPoint: |
| ++FloatingParmsNum; |
| return; |
| case VectorChar: |
| case VectorShort: |
| case VectorInt: |
| case VectorFloat: |
| ++VectorParmsNum; |
| return; |
| } |
| llvm_unreachable("Error ParamType type."); |
| } |
| |
| uint32_t PPCFunctionInfo::getVecExtParmsType() const { |
| |
| uint32_t VectExtParamInfo = 0; |
| unsigned ShiftBits = 32 - XCOFF::TracebackTable::WidthOfParamType; |
| int Bits = 0; |
| |
| if (!hasVectorParms()) |
| return 0; |
| |
| for (const auto &Elt : ParamtersType) { |
| switch (Elt) { |
| case VectorChar: |
| VectExtParamInfo <<= XCOFF::TracebackTable::WidthOfParamType; |
| VectExtParamInfo |= |
| XCOFF::TracebackTable::ParmTypeIsVectorCharBit >> ShiftBits; |
| Bits += XCOFF::TracebackTable::WidthOfParamType; |
| break; |
| case VectorShort: |
| VectExtParamInfo <<= XCOFF::TracebackTable::WidthOfParamType; |
| VectExtParamInfo |= |
| XCOFF::TracebackTable::ParmTypeIsVectorShortBit >> ShiftBits; |
| Bits += XCOFF::TracebackTable::WidthOfParamType; |
| break; |
| case VectorInt: |
| VectExtParamInfo <<= XCOFF::TracebackTable::WidthOfParamType; |
| VectExtParamInfo |= |
| XCOFF::TracebackTable::ParmTypeIsVectorIntBit >> ShiftBits; |
| Bits += XCOFF::TracebackTable::WidthOfParamType; |
| break; |
| case VectorFloat: |
| VectExtParamInfo <<= XCOFF::TracebackTable::WidthOfParamType; |
| VectExtParamInfo |= |
| XCOFF::TracebackTable::ParmTypeIsVectorFloatBit >> ShiftBits; |
| Bits += XCOFF::TracebackTable::WidthOfParamType; |
| break; |
| default: |
| break; |
| } |
| |
| // There are only 32bits in the VectExtParamInfo. |
| if (Bits >= 32) |
| break; |
| } |
| return Bits < 32 ? VectExtParamInfo << (32 - Bits) : VectExtParamInfo; |
| } |
| |
| uint32_t PPCFunctionInfo::getParmsType() const { |
| uint32_t ParamsTypeInfo = 0; |
| unsigned ShiftBits = 32 - XCOFF::TracebackTable::WidthOfParamType; |
| |
| int Bits = 0; |
| for (const auto &Elt : ParamtersType) { |
| |
| if (Bits > 31 || (Bits > 30 && (Elt != FixedType || hasVectorParms()))) |
| break; |
| |
| switch (Elt) { |
| case FixedType: |
| if (hasVectorParms()) { |
| //'00' ==> fixed parameter if HasVectorParms is true. |
| ParamsTypeInfo <<= XCOFF::TracebackTable::WidthOfParamType; |
| ParamsTypeInfo |= |
| XCOFF::TracebackTable::ParmTypeIsFixedBits >> ShiftBits; |
| Bits += XCOFF::TracebackTable::WidthOfParamType; |
| } else { |
| //'0' ==> fixed parameter if HasVectorParms is false. |
| ParamsTypeInfo <<= 1; |
| ++Bits; |
| } |
| break; |
| case ShortFloatingPoint: |
| // '10'b => floating point short parameter. |
| ParamsTypeInfo <<= XCOFF::TracebackTable::WidthOfParamType; |
| ParamsTypeInfo |= |
| XCOFF::TracebackTable::ParmTypeIsFloatingBits >> ShiftBits; |
| Bits += XCOFF::TracebackTable::WidthOfParamType; |
| break; |
| case LongFloatingPoint: |
| // '11'b => floating point long parameter. |
| ParamsTypeInfo <<= XCOFF::TracebackTable::WidthOfParamType; |
| ParamsTypeInfo |= |
| XCOFF::TracebackTable::ParmTypeIsDoubleBits >> ShiftBits; |
| Bits += XCOFF::TracebackTable::WidthOfParamType; |
| break; |
| case VectorChar: |
| case VectorShort: |
| case VectorInt: |
| case VectorFloat: |
| // '01' ==> vector parameter |
| ParamsTypeInfo <<= XCOFF::TracebackTable::WidthOfParamType; |
| ParamsTypeInfo |= |
| XCOFF::TracebackTable::ParmTypeIsVectorBits >> ShiftBits; |
| Bits += XCOFF::TracebackTable::WidthOfParamType; |
| break; |
| } |
| } |
| |
| return Bits < 32 ? ParamsTypeInfo << (32 - Bits) : ParamsTypeInfo; |
| } |