1*fe6060f1SDimitry Andric //===- MIRYamlMapping.cpp - Describe mapping between MIR and YAML ---------===// 2*fe6060f1SDimitry Andric // 3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*fe6060f1SDimitry Andric // 7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8*fe6060f1SDimitry Andric // 9*fe6060f1SDimitry Andric // This file implements the mapping between various MIR data structures and 10*fe6060f1SDimitry Andric // their corresponding YAML representation. 11*fe6060f1SDimitry Andric // 12*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 13*fe6060f1SDimitry Andric 14*fe6060f1SDimitry Andric #include "llvm/CodeGen/MIRYamlMapping.h" 15*fe6060f1SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h" 16*fe6060f1SDimitry Andric #include "llvm/Support/Error.h" 17*fe6060f1SDimitry Andric #include "llvm/Support/FormatVariadic.h" 18*fe6060f1SDimitry Andric 19*fe6060f1SDimitry Andric using namespace llvm; 20*fe6060f1SDimitry Andric using namespace llvm::yaml; 21*fe6060f1SDimitry Andric FrameIndex(int FI,const llvm::MachineFrameInfo & MFI)22*fe6060f1SDimitry AndricFrameIndex::FrameIndex(int FI, const llvm::MachineFrameInfo &MFI) { 23*fe6060f1SDimitry Andric IsFixed = MFI.isFixedObjectIndex(FI); 24*fe6060f1SDimitry Andric if (IsFixed) 25*fe6060f1SDimitry Andric FI -= MFI.getObjectIndexBegin(); 26*fe6060f1SDimitry Andric this->FI = FI; 27*fe6060f1SDimitry Andric } 28*fe6060f1SDimitry Andric 29*fe6060f1SDimitry Andric // Returns the value and if the frame index is fixed or not. getFI(const llvm::MachineFrameInfo & MFI) const30*fe6060f1SDimitry AndricExpected<int> FrameIndex::getFI(const llvm::MachineFrameInfo &MFI) const { 31*fe6060f1SDimitry Andric int FI = this->FI; 32*fe6060f1SDimitry Andric if (IsFixed) { 33*fe6060f1SDimitry Andric if (unsigned(FI) >= MFI.getNumFixedObjects()) 34*fe6060f1SDimitry Andric return make_error<StringError>( 35*fe6060f1SDimitry Andric formatv("invalid fixed frame index {0}", FI).str(), 36*fe6060f1SDimitry Andric inconvertibleErrorCode()); 37*fe6060f1SDimitry Andric FI += MFI.getObjectIndexBegin(); 38*fe6060f1SDimitry Andric } 39*fe6060f1SDimitry Andric if (unsigned(FI + MFI.getNumFixedObjects()) >= MFI.getNumObjects()) 40*fe6060f1SDimitry Andric return make_error<StringError>(formatv("invalid frame index {0}", FI).str(), 41*fe6060f1SDimitry Andric inconvertibleErrorCode()); 42*fe6060f1SDimitry Andric return FI; 43*fe6060f1SDimitry Andric } 44