1*dc11c060SLang Hames //===---------- AbsoluteSymbols.cpp - Absolute symbols utilities ----------===// 2*dc11c060SLang Hames // 3*dc11c060SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*dc11c060SLang Hames // See https://llvm.org/LICENSE.txt for license information. 5*dc11c060SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*dc11c060SLang Hames // 7*dc11c060SLang Hames //===----------------------------------------------------------------------===// 8*dc11c060SLang Hames 9*dc11c060SLang Hames #include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h" 10*dc11c060SLang Hames #include "llvm/ExecutionEngine/Orc/Core.h" 11*dc11c060SLang Hames 12*dc11c060SLang Hames #define DEBUG_TYPE "orc" 13*dc11c060SLang Hames 14*dc11c060SLang Hames namespace llvm::orc { 15*dc11c060SLang Hames 16*dc11c060SLang Hames AbsoluteSymbolsMaterializationUnit::AbsoluteSymbolsMaterializationUnit( 17*dc11c060SLang Hames SymbolMap Symbols) 18*dc11c060SLang Hames : MaterializationUnit(extractFlags(Symbols)), Symbols(std::move(Symbols)) {} 19*dc11c060SLang Hames 20*dc11c060SLang Hames StringRef AbsoluteSymbolsMaterializationUnit::getName() const { 21*dc11c060SLang Hames return "<Absolute Symbols>"; 22*dc11c060SLang Hames } 23*dc11c060SLang Hames 24*dc11c060SLang Hames void AbsoluteSymbolsMaterializationUnit::materialize( 25*dc11c060SLang Hames std::unique_ptr<MaterializationResponsibility> R) { 26*dc11c060SLang Hames // Even though these are just absolute symbols we need to check for failure 27*dc11c060SLang Hames // to resolve/emit: the tracker for these symbols may have been removed while 28*dc11c060SLang Hames // the materialization was in flight (e.g. due to a failure in some action 29*dc11c060SLang Hames // triggered by the queries attached to the resolution/emission of these 30*dc11c060SLang Hames // symbols). 31*dc11c060SLang Hames if (auto Err = R->notifyResolved(Symbols)) { 32*dc11c060SLang Hames R->getExecutionSession().reportError(std::move(Err)); 33*dc11c060SLang Hames R->failMaterialization(); 34*dc11c060SLang Hames return; 35*dc11c060SLang Hames } 36*dc11c060SLang Hames if (auto Err = R->notifyEmitted({})) { 37*dc11c060SLang Hames R->getExecutionSession().reportError(std::move(Err)); 38*dc11c060SLang Hames R->failMaterialization(); 39*dc11c060SLang Hames return; 40*dc11c060SLang Hames } 41*dc11c060SLang Hames } 42*dc11c060SLang Hames 43*dc11c060SLang Hames void AbsoluteSymbolsMaterializationUnit::discard(const JITDylib &JD, 44*dc11c060SLang Hames const SymbolStringPtr &Name) { 45*dc11c060SLang Hames assert(Symbols.count(Name) && "Symbol is not part of this MU"); 46*dc11c060SLang Hames Symbols.erase(Name); 47*dc11c060SLang Hames } 48*dc11c060SLang Hames 49*dc11c060SLang Hames MaterializationUnit::Interface 50*dc11c060SLang Hames AbsoluteSymbolsMaterializationUnit::extractFlags(const SymbolMap &Symbols) { 51*dc11c060SLang Hames SymbolFlagsMap Flags; 52*dc11c060SLang Hames for (const auto &[Name, Def] : Symbols) 53*dc11c060SLang Hames Flags[Name] = Def.getFlags(); 54*dc11c060SLang Hames return MaterializationUnit::Interface(std::move(Flags), nullptr); 55*dc11c060SLang Hames } 56*dc11c060SLang Hames 57*dc11c060SLang Hames } // namespace llvm::orc 58