xref: /llvm-project/llvm/lib/ExecutionEngine/Orc/AbsoluteSymbols.cpp (revision dc11c0601577afb8f67513d041ee25dabe3555b9)
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