xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
10b57cec5SDimitry Andric //===-- PPCMachineFunctionInfo.cpp - Private data used for PowerPC --------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "PPCMachineFunctionInfo.h"
100b57cec5SDimitry Andric #include "llvm/ADT/Twine.h"
110b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h"
120b57cec5SDimitry Andric #include "llvm/MC/MCContext.h"
13*5ffd83dbSDimitry Andric #include "llvm/Support/CommandLine.h"
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric using namespace llvm;
16*5ffd83dbSDimitry Andric static cl::opt<bool> PPCDisableNonVolatileCR(
17*5ffd83dbSDimitry Andric     "ppc-disable-non-volatile-cr",
18*5ffd83dbSDimitry Andric     cl::desc("Disable the use of non-volatile CR register fields"),
19*5ffd83dbSDimitry Andric     cl::init(false), cl::Hidden);
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric void PPCFunctionInfo::anchor() {}
22*5ffd83dbSDimitry Andric PPCFunctionInfo::PPCFunctionInfo(const MachineFunction &MF)
23*5ffd83dbSDimitry Andric     : DisableNonVolatileCR(PPCDisableNonVolatileCR) {}
240b57cec5SDimitry Andric 
25*5ffd83dbSDimitry Andric MCSymbol *PPCFunctionInfo::getPICOffsetSymbol(MachineFunction &MF) const {
260b57cec5SDimitry Andric   const DataLayout &DL = MF.getDataLayout();
270b57cec5SDimitry Andric   return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
280b57cec5SDimitry Andric                                            Twine(MF.getFunctionNumber()) +
290b57cec5SDimitry Andric                                            "$poff");
300b57cec5SDimitry Andric }
310b57cec5SDimitry Andric 
32*5ffd83dbSDimitry Andric MCSymbol *PPCFunctionInfo::getGlobalEPSymbol(MachineFunction &MF) const {
330b57cec5SDimitry Andric   const DataLayout &DL = MF.getDataLayout();
340b57cec5SDimitry Andric   return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
350b57cec5SDimitry Andric                                            "func_gep" +
360b57cec5SDimitry Andric                                            Twine(MF.getFunctionNumber()));
370b57cec5SDimitry Andric }
380b57cec5SDimitry Andric 
39*5ffd83dbSDimitry Andric MCSymbol *PPCFunctionInfo::getLocalEPSymbol(MachineFunction &MF) const {
400b57cec5SDimitry Andric   const DataLayout &DL = MF.getDataLayout();
410b57cec5SDimitry Andric   return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
420b57cec5SDimitry Andric                                            "func_lep" +
430b57cec5SDimitry Andric                                            Twine(MF.getFunctionNumber()));
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric 
46*5ffd83dbSDimitry Andric MCSymbol *PPCFunctionInfo::getTOCOffsetSymbol(MachineFunction &MF) const {
470b57cec5SDimitry Andric   const DataLayout &DL = MF.getDataLayout();
480b57cec5SDimitry Andric   return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
490b57cec5SDimitry Andric                                            "func_toc" +
500b57cec5SDimitry Andric                                            Twine(MF.getFunctionNumber()));
510b57cec5SDimitry Andric }
520b57cec5SDimitry Andric 
53*5ffd83dbSDimitry Andric bool PPCFunctionInfo::isLiveInSExt(Register VReg) const {
54*5ffd83dbSDimitry Andric   for (const std::pair<Register, ISD::ArgFlagsTy> &LiveIn : LiveInAttrs)
550b57cec5SDimitry Andric     if (LiveIn.first == VReg)
560b57cec5SDimitry Andric       return LiveIn.second.isSExt();
570b57cec5SDimitry Andric   return false;
580b57cec5SDimitry Andric }
590b57cec5SDimitry Andric 
60*5ffd83dbSDimitry Andric bool PPCFunctionInfo::isLiveInZExt(Register VReg) const {
61*5ffd83dbSDimitry Andric   for (const std::pair<Register, ISD::ArgFlagsTy> &LiveIn : LiveInAttrs)
620b57cec5SDimitry Andric     if (LiveIn.first == VReg)
630b57cec5SDimitry Andric       return LiveIn.second.isZExt();
640b57cec5SDimitry Andric   return false;
650b57cec5SDimitry Andric }
66