1*0fca6ea1SDimitry Andric //===- AMDGPUDelayedMCExpr.cpp - Delayed MCExpr resolve ---------*- C++ -*-===// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric 9*0fca6ea1SDimitry Andric #include "AMDGPUDelayedMCExpr.h" 10*0fca6ea1SDimitry Andric #include "llvm/MC/MCExpr.h" 11*0fca6ea1SDimitry Andric #include "llvm/MC/MCValue.h" 12*0fca6ea1SDimitry Andric 13*0fca6ea1SDimitry Andric using namespace llvm; 14*0fca6ea1SDimitry Andric 15*0fca6ea1SDimitry Andric static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, 16*0fca6ea1SDimitry Andric MCValue Val) { 17*0fca6ea1SDimitry Andric msgpack::Document *Doc = DN.getDocument(); 18*0fca6ea1SDimitry Andric switch (Type) { 19*0fca6ea1SDimitry Andric default: 20*0fca6ea1SDimitry Andric return Doc->getEmptyNode(); 21*0fca6ea1SDimitry Andric case msgpack::Type::Int: 22*0fca6ea1SDimitry Andric return Doc->getNode(static_cast<int64_t>(Val.getConstant())); 23*0fca6ea1SDimitry Andric case msgpack::Type::UInt: 24*0fca6ea1SDimitry Andric return Doc->getNode(static_cast<uint64_t>(Val.getConstant())); 25*0fca6ea1SDimitry Andric case msgpack::Type::Boolean: 26*0fca6ea1SDimitry Andric return Doc->getNode(static_cast<bool>(Val.getConstant())); 27*0fca6ea1SDimitry Andric } 28*0fca6ea1SDimitry Andric } 29*0fca6ea1SDimitry Andric 30*0fca6ea1SDimitry Andric void DelayedMCExprs::assignDocNode(msgpack::DocNode &DN, msgpack::Type Type, 31*0fca6ea1SDimitry Andric const MCExpr *ExprValue) { 32*0fca6ea1SDimitry Andric MCValue Res; 33*0fca6ea1SDimitry Andric if (ExprValue->evaluateAsRelocatable(Res, nullptr, nullptr)) { 34*0fca6ea1SDimitry Andric if (Res.isAbsolute()) { 35*0fca6ea1SDimitry Andric DN = getNode(DN, Type, Res); 36*0fca6ea1SDimitry Andric return; 37*0fca6ea1SDimitry Andric } 38*0fca6ea1SDimitry Andric } 39*0fca6ea1SDimitry Andric 40*0fca6ea1SDimitry Andric DelayedExprs.emplace_back(DN, Type, ExprValue); 41*0fca6ea1SDimitry Andric } 42*0fca6ea1SDimitry Andric 43*0fca6ea1SDimitry Andric bool DelayedMCExprs::resolveDelayedExpressions() { 44*0fca6ea1SDimitry Andric while (!DelayedExprs.empty()) { 45*0fca6ea1SDimitry Andric Expr DE = DelayedExprs.front(); 46*0fca6ea1SDimitry Andric MCValue Res; 47*0fca6ea1SDimitry Andric 48*0fca6ea1SDimitry Andric if (!DE.ExprValue->evaluateAsRelocatable(Res, nullptr, nullptr) || 49*0fca6ea1SDimitry Andric !Res.isAbsolute()) 50*0fca6ea1SDimitry Andric return false; 51*0fca6ea1SDimitry Andric 52*0fca6ea1SDimitry Andric DelayedExprs.pop_front(); 53*0fca6ea1SDimitry Andric DE.DN = getNode(DE.DN, DE.Type, Res); 54*0fca6ea1SDimitry Andric } 55*0fca6ea1SDimitry Andric 56*0fca6ea1SDimitry Andric return true; 57*0fca6ea1SDimitry Andric } 58*0fca6ea1SDimitry Andric 59*0fca6ea1SDimitry Andric void DelayedMCExprs::clear() { DelayedExprs.clear(); } 60*0fca6ea1SDimitry Andric 61*0fca6ea1SDimitry Andric bool DelayedMCExprs::empty() { return DelayedExprs.empty(); } 62