71 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
//===---------------- EPCDynamicLibrarySearchGenerator.cpp ----------------===//
 | 
						|
//
 | 
						|
// 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/EPCDynamicLibrarySearchGenerator.h"
 | 
						|
 | 
						|
namespace llvm {
 | 
						|
namespace orc {
 | 
						|
 | 
						|
Expected<std::unique_ptr<EPCDynamicLibrarySearchGenerator>>
 | 
						|
EPCDynamicLibrarySearchGenerator::Load(ExecutionSession &ES,
 | 
						|
                                       const char *LibraryPath,
 | 
						|
                                       SymbolPredicate Allow) {
 | 
						|
  auto Handle = ES.getExecutorProcessControl().loadDylib(LibraryPath);
 | 
						|
  if (!Handle)
 | 
						|
    return Handle.takeError();
 | 
						|
 | 
						|
  return std::make_unique<EPCDynamicLibrarySearchGenerator>(ES, *Handle,
 | 
						|
                                                            std::move(Allow));
 | 
						|
}
 | 
						|
 | 
						|
Error EPCDynamicLibrarySearchGenerator::tryToGenerate(
 | 
						|
    LookupState &LS, LookupKind K, JITDylib &JD,
 | 
						|
    JITDylibLookupFlags JDLookupFlags, const SymbolLookupSet &Symbols) {
 | 
						|
 | 
						|
  if (Symbols.empty())
 | 
						|
    return Error::success();
 | 
						|
 | 
						|
  SymbolLookupSet LookupSymbols;
 | 
						|
 | 
						|
  for (auto &KV : Symbols) {
 | 
						|
    // Skip symbols that don't match the filter.
 | 
						|
    if (Allow && !Allow(KV.first))
 | 
						|
      continue;
 | 
						|
    LookupSymbols.add(KV.first, SymbolLookupFlags::WeaklyReferencedSymbol);
 | 
						|
  }
 | 
						|
 | 
						|
  SymbolMap NewSymbols;
 | 
						|
 | 
						|
  ExecutorProcessControl::LookupRequest Request(H, LookupSymbols);
 | 
						|
  auto Result = EPC.lookupSymbols(Request);
 | 
						|
  if (!Result)
 | 
						|
    return Result.takeError();
 | 
						|
 | 
						|
  assert(Result->size() == 1 && "Results for more than one library returned");
 | 
						|
  assert(Result->front().size() == LookupSymbols.size() &&
 | 
						|
         "Result has incorrect number of elements");
 | 
						|
 | 
						|
  auto ResultI = Result->front().begin();
 | 
						|
  for (auto &KV : LookupSymbols) {
 | 
						|
    if (*ResultI)
 | 
						|
      NewSymbols[KV.first] =
 | 
						|
          JITEvaluatedSymbol(*ResultI, JITSymbolFlags::Exported);
 | 
						|
    ++ResultI;
 | 
						|
  }
 | 
						|
 | 
						|
  // If there were no resolved symbols bail out.
 | 
						|
  if (NewSymbols.empty())
 | 
						|
    return Error::success();
 | 
						|
 | 
						|
  // Define resolved symbols.
 | 
						|
  return JD.define(absoluteSymbols(std::move(NewSymbols)));
 | 
						|
}
 | 
						|
 | 
						|
} // end namespace orc
 | 
						|
} // end namespace llvm
 |