| //===---------- AbsoluteSymbols.cpp - Absolute symbols utilities ----------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h" |
| #include "llvm/ExecutionEngine/Orc/Core.h" |
| |
| #define DEBUG_TYPE "orc" |
| |
| namespace llvm::orc { |
| |
| AbsoluteSymbolsMaterializationUnit::AbsoluteSymbolsMaterializationUnit( |
| SymbolMap Symbols) |
| : MaterializationUnit(extractFlags(Symbols)), Symbols(std::move(Symbols)) {} |
| |
| StringRef AbsoluteSymbolsMaterializationUnit::getName() const { |
| return "<Absolute Symbols>"; |
| } |
| |
| void AbsoluteSymbolsMaterializationUnit::materialize( |
| std::unique_ptr<MaterializationResponsibility> R) { |
| // Even though these are just absolute symbols we need to check for failure |
| // to resolve/emit: the tracker for these symbols may have been removed while |
| // the materialization was in flight (e.g. due to a failure in some action |
| // triggered by the queries attached to the resolution/emission of these |
| // symbols). |
| if (auto Err = R->notifyResolved(Symbols)) { |
| R->getExecutionSession().reportError(std::move(Err)); |
| R->failMaterialization(); |
| return; |
| } |
| if (auto Err = R->notifyEmitted({})) { |
| R->getExecutionSession().reportError(std::move(Err)); |
| R->failMaterialization(); |
| return; |
| } |
| } |
| |
| void AbsoluteSymbolsMaterializationUnit::discard(const JITDylib &JD, |
| const SymbolStringPtr &Name) { |
| assert(Symbols.count(Name) && "Symbol is not part of this MU"); |
| Symbols.erase(Name); |
| } |
| |
| MaterializationUnit::Interface |
| AbsoluteSymbolsMaterializationUnit::extractFlags(const SymbolMap &Symbols) { |
| SymbolFlagsMap Flags; |
| for (const auto &[Name, Def] : Symbols) |
| Flags[Name] = Def.getFlags(); |
| return MaterializationUnit::Interface(std::move(Flags), nullptr); |
| } |
| |
| } // namespace llvm::orc |