xref: /llvm-project/llvm/lib/Target/AMDGPU/Utils/AMDGPUDelayedMCExpr.cpp (revision 5e338f1f4ae28b9dd7d722a77ab204e358006a86)
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