13d1705d0SJanek van Oirschot //===- AMDGPUDelayedMCExpr.cpp - Delayed MCExpr resolve ---------*- C++ -*-===// 23d1705d0SJanek van Oirschot // 33d1705d0SJanek van Oirschot // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43d1705d0SJanek van Oirschot // See https://llvm.org/LICENSE.txt for license information. 53d1705d0SJanek van Oirschot // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63d1705d0SJanek van Oirschot // 73d1705d0SJanek van Oirschot //===----------------------------------------------------------------------===// 83d1705d0SJanek van Oirschot 93d1705d0SJanek van Oirschot #include "AMDGPUDelayedMCExpr.h" 103d1705d0SJanek van Oirschot #include "llvm/MC/MCExpr.h" 113d1705d0SJanek van Oirschot #include "llvm/MC/MCValue.h" 123d1705d0SJanek van Oirschot 133d1705d0SJanek van Oirschot using namespace llvm; 143d1705d0SJanek van Oirschot 153d1705d0SJanek van Oirschot static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, 163d1705d0SJanek van Oirschot MCValue Val) { 173d1705d0SJanek van Oirschot msgpack::Document *Doc = DN.getDocument(); 183d1705d0SJanek van Oirschot switch (Type) { 193d1705d0SJanek van Oirschot default: 203d1705d0SJanek van Oirschot return Doc->getEmptyNode(); 213d1705d0SJanek van Oirschot case msgpack::Type::Int: 223d1705d0SJanek van Oirschot return Doc->getNode(static_cast<int64_t>(Val.getConstant())); 233d1705d0SJanek van Oirschot case msgpack::Type::UInt: 243d1705d0SJanek van Oirschot return Doc->getNode(static_cast<uint64_t>(Val.getConstant())); 253d1705d0SJanek van Oirschot case msgpack::Type::Boolean: 263d1705d0SJanek van Oirschot return Doc->getNode(static_cast<bool>(Val.getConstant())); 273d1705d0SJanek van Oirschot } 283d1705d0SJanek van Oirschot } 293d1705d0SJanek van Oirschot 303d1705d0SJanek van Oirschot void DelayedMCExprs::assignDocNode(msgpack::DocNode &DN, msgpack::Type Type, 313d1705d0SJanek van Oirschot const MCExpr *ExprValue) { 323d1705d0SJanek van Oirschot MCValue Res; 333d1705d0SJanek van Oirschot if (ExprValue->evaluateAsRelocatable(Res, nullptr, nullptr)) { 343d1705d0SJanek van Oirschot if (Res.isAbsolute()) { 353d1705d0SJanek van Oirschot DN = getNode(DN, Type, Res); 363d1705d0SJanek van Oirschot return; 373d1705d0SJanek van Oirschot } 383d1705d0SJanek van Oirschot } 393d1705d0SJanek van Oirschot 40*5e338f1fSJay Foad DelayedExprs.emplace_back(DN, Type, ExprValue); 413d1705d0SJanek van Oirschot } 423d1705d0SJanek van Oirschot 433d1705d0SJanek van Oirschot bool DelayedMCExprs::resolveDelayedExpressions() { 443d1705d0SJanek van Oirschot while (!DelayedExprs.empty()) { 453d1705d0SJanek van Oirschot Expr DE = DelayedExprs.front(); 463d1705d0SJanek van Oirschot MCValue Res; 473d1705d0SJanek van Oirschot 483d1705d0SJanek van Oirschot if (!DE.ExprValue->evaluateAsRelocatable(Res, nullptr, nullptr) || 493d1705d0SJanek van Oirschot !Res.isAbsolute()) 503d1705d0SJanek van Oirschot return false; 513d1705d0SJanek van Oirschot 523d1705d0SJanek van Oirschot DelayedExprs.pop_front(); 533d1705d0SJanek van Oirschot DE.DN = getNode(DE.DN, DE.Type, Res); 543d1705d0SJanek van Oirschot } 553d1705d0SJanek van Oirschot 563d1705d0SJanek van Oirschot return true; 573d1705d0SJanek van Oirschot } 583d1705d0SJanek van Oirschot 593d1705d0SJanek van Oirschot void DelayedMCExprs::clear() { DelayedExprs.clear(); } 603d1705d0SJanek van Oirschot 613d1705d0SJanek van Oirschot bool DelayedMCExprs::empty() { return DelayedExprs.empty(); } 62