1 //===----------- JITSymbol.cpp - JITSymbol class implementation -----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // JITSymbol class implementation plus helper functions.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/ExecutionEngine/JITSymbol.h"
15 #include "llvm/IR/GlobalValue.h"
16 #include "llvm/Object/SymbolicFile.h"
20 JITSymbolFlags llvm::JITSymbolFlags::fromGlobalValue(const GlobalValue &GV) {
21 JITSymbolFlags Flags = JITSymbolFlags::None;
22 if (GV.hasWeakLinkage() || GV.hasLinkOnceLinkage())
23 Flags |= JITSymbolFlags::Weak;
24 if (GV.hasCommonLinkage())
25 Flags |= JITSymbolFlags::Common;
26 if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
27 Flags |= JITSymbolFlags::Exported;
32 llvm::JITSymbolFlags::fromObjectSymbol(const object::BasicSymbolRef &Symbol) {
33 JITSymbolFlags Flags = JITSymbolFlags::None;
34 if (Symbol.getFlags() & object::BasicSymbolRef::SF_Weak)
35 Flags |= JITSymbolFlags::Weak;
36 if (Symbol.getFlags() & object::BasicSymbolRef::SF_Common)
37 Flags |= JITSymbolFlags::Common;
38 if (Symbol.getFlags() & object::BasicSymbolRef::SF_Exported)
39 Flags |= JITSymbolFlags::Exported;
43 ARMJITSymbolFlags llvm::ARMJITSymbolFlags::fromObjectSymbol(
44 const object::BasicSymbolRef &Symbol) {
45 ARMJITSymbolFlags Flags;
46 if (Symbol.getFlags() & object::BasicSymbolRef::SF_Thumb)
47 Flags |= ARMJITSymbolFlags::Thumb;
51 /// Performs lookup by, for each symbol, first calling
52 /// findSymbolInLogicalDylib and if that fails calling
54 Expected<JITSymbolResolver::LookupResult>
55 LegacyJITSymbolResolver::lookup(const LookupSet &Symbols) {
56 JITSymbolResolver::LookupResult Result;
57 for (auto &Symbol : Symbols) {
58 std::string SymName = Symbol.str();
59 if (auto Sym = findSymbolInLogicalDylib(SymName)) {
60 if (auto AddrOrErr = Sym.getAddress())
61 Result[Symbol] = JITEvaluatedSymbol(*AddrOrErr, Sym.getFlags());
63 return AddrOrErr.takeError();
64 } else if (auto Err = Sym.takeError())
65 return std::move(Err);
67 // findSymbolInLogicalDylib failed. Lets try findSymbol.
68 if (auto Sym = findSymbol(SymName)) {
69 if (auto AddrOrErr = Sym.getAddress())
70 Result[Symbol] = JITEvaluatedSymbol(*AddrOrErr, Sym.getFlags());
72 return AddrOrErr.takeError();
73 } else if (auto Err = Sym.takeError())
74 return std::move(Err);
76 return make_error<StringError>("Symbol not found: " + Symbol,
77 inconvertibleErrorCode());
81 return std::move(Result);
84 /// Performs flags lookup by calling findSymbolInLogicalDylib and
85 /// returning the flags value for that symbol.
86 Expected<JITSymbolResolver::LookupFlagsResult>
87 LegacyJITSymbolResolver::lookupFlags(const LookupSet &Symbols) {
88 JITSymbolResolver::LookupFlagsResult Result;
90 for (auto &Symbol : Symbols) {
91 std::string SymName = Symbol.str();
92 if (auto Sym = findSymbolInLogicalDylib(SymName))
93 Result[Symbol] = Sym.getFlags();
94 else if (auto Err = Sym.takeError())
95 return std::move(Err);
98 return std::move(Result);