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
getNode(msgpack::DocNode DN,msgpack::Type Type,MCValue Val)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
assignDocNode(msgpack::DocNode & DN,msgpack::Type Type,const MCExpr * ExprValue)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
resolveDelayedExpressions()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
clear()59*0fca6ea1SDimitry Andric void DelayedMCExprs::clear() { DelayedExprs.clear(); }
60*0fca6ea1SDimitry Andric
empty()61*0fca6ea1SDimitry Andric bool DelayedMCExprs::empty() { return DelayedExprs.empty(); }
62