68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
//===------- Legacy.cpp - Adapters for ExecutionEngine API interop --------===//
 | 
						|
//
 | 
						|
// 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/Legacy.h"
 | 
						|
 | 
						|
namespace llvm {
 | 
						|
namespace orc {
 | 
						|
 | 
						|
void SymbolResolver::anchor() {}
 | 
						|
 | 
						|
JITSymbolResolverAdapter::JITSymbolResolverAdapter(
 | 
						|
    ExecutionSession &ES, SymbolResolver &R, MaterializationResponsibility *MR)
 | 
						|
    : ES(ES), R(R), MR(MR) {}
 | 
						|
 | 
						|
void JITSymbolResolverAdapter::lookup(const LookupSet &Symbols,
 | 
						|
                                      OnResolvedFunction OnResolved) {
 | 
						|
  SymbolNameSet InternedSymbols;
 | 
						|
  for (auto &S : Symbols)
 | 
						|
    InternedSymbols.insert(ES.intern(S));
 | 
						|
 | 
						|
  auto OnResolvedWithUnwrap = [OnResolved](Expected<SymbolMap> InternedResult) {
 | 
						|
    if (!InternedResult) {
 | 
						|
      OnResolved(InternedResult.takeError());
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    LookupResult Result;
 | 
						|
    for (auto &KV : *InternedResult)
 | 
						|
      Result[*KV.first] = std::move(KV.second);
 | 
						|
    OnResolved(Result);
 | 
						|
  };
 | 
						|
 | 
						|
  auto Q = std::make_shared<AsynchronousSymbolQuery>(
 | 
						|
      InternedSymbols, OnResolvedWithUnwrap,
 | 
						|
      [this](Error Err) { ES.reportError(std::move(Err)); });
 | 
						|
 | 
						|
  auto Unresolved = R.lookup(Q, InternedSymbols);
 | 
						|
  if (Unresolved.empty()) {
 | 
						|
    if (MR)
 | 
						|
      MR->addDependenciesForAll(Q->QueryRegistrations);
 | 
						|
  } else
 | 
						|
    ES.legacyFailQuery(*Q, make_error<SymbolsNotFound>(std::move(Unresolved)));
 | 
						|
}
 | 
						|
 | 
						|
Expected<JITSymbolResolverAdapter::LookupSet>
 | 
						|
JITSymbolResolverAdapter::getResponsibilitySet(const LookupSet &Symbols) {
 | 
						|
  SymbolNameSet InternedSymbols;
 | 
						|
  for (auto &S : Symbols)
 | 
						|
    InternedSymbols.insert(ES.intern(S));
 | 
						|
 | 
						|
  auto InternedResult = R.getResponsibilitySet(InternedSymbols);
 | 
						|
  LookupSet Result;
 | 
						|
  for (auto &S : InternedResult) {
 | 
						|
    ResolvedStrings.insert(S);
 | 
						|
    Result.insert(*S);
 | 
						|
  }
 | 
						|
 | 
						|
  return Result;
 | 
						|
}
 | 
						|
 | 
						|
} // End namespace orc.
 | 
						|
} // End namespace llvm.
 |