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