xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/Utils/AMDGPUDelayedMCExpr.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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