blob: 4e2d0f422f39bc48e3eb38966807ba3807b5c4e4 [file] [log] [blame]
Lang Hamesaac59a22016-08-04 20:32:37 +00001//===----------- JITSymbol.cpp - JITSymbol class implementation -----------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Lang Hamesaac59a22016-08-04 20:32:37 +00006//
7//===----------------------------------------------------------------------===//
8//
9// JITSymbol class implementation plus helper functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/ExecutionEngine/JITSymbol.h"
Lang Hamesbfea8cd2018-08-01 22:42:23 +000014#include "llvm/IR/Function.h"
Lang Hames98440292018-09-29 23:49:57 +000015#include "llvm/IR/GlobalAlias.h"
Lang Hamesaac59a22016-08-04 20:32:37 +000016#include "llvm/IR/GlobalValue.h"
Lang Hamesbfea8cd2018-08-01 22:42:23 +000017#include "llvm/Object/ObjectFile.h"
Lang Hamesaac59a22016-08-04 20:32:37 +000018
19using namespace llvm;
20
21JITSymbolFlags llvm::JITSymbolFlags::fromGlobalValue(const GlobalValue &GV) {
22 JITSymbolFlags Flags = JITSymbolFlags::None;
Lang Hames73976f62016-08-06 22:36:26 +000023 if (GV.hasWeakLinkage() || GV.hasLinkOnceLinkage())
Lang Hamesaac59a22016-08-04 20:32:37 +000024 Flags |= JITSymbolFlags::Weak;
25 if (GV.hasCommonLinkage())
26 Flags |= JITSymbolFlags::Common;
27 if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
28 Flags |= JITSymbolFlags::Exported;
Lang Hames98440292018-09-29 23:49:57 +000029
Lang Hamesbfea8cd2018-08-01 22:42:23 +000030 if (isa<Function>(GV))
31 Flags |= JITSymbolFlags::Callable;
Lang Hames98440292018-09-29 23:49:57 +000032 else if (isa<GlobalAlias>(GV) &&
33 isa<Function>(cast<GlobalAlias>(GV).getAliasee()))
34 Flags |= JITSymbolFlags::Callable;
35
Lang Hamesaac59a22016-08-04 20:32:37 +000036 return Flags;
37}
38
Lang Hamesbfea8cd2018-08-01 22:42:23 +000039Expected<JITSymbolFlags>
40llvm::JITSymbolFlags::fromObjectSymbol(const object::SymbolRef &Symbol) {
Lang Hamesaac59a22016-08-04 20:32:37 +000041 JITSymbolFlags Flags = JITSymbolFlags::None;
42 if (Symbol.getFlags() & object::BasicSymbolRef::SF_Weak)
43 Flags |= JITSymbolFlags::Weak;
44 if (Symbol.getFlags() & object::BasicSymbolRef::SF_Common)
45 Flags |= JITSymbolFlags::Common;
46 if (Symbol.getFlags() & object::BasicSymbolRef::SF_Exported)
47 Flags |= JITSymbolFlags::Exported;
Lang Hamesbfea8cd2018-08-01 22:42:23 +000048
49 auto SymbolType = Symbol.getType();
50 if (!SymbolType)
51 return SymbolType.takeError();
52
53 if (*SymbolType & object::SymbolRef::ST_Function)
54 Flags |= JITSymbolFlags::Callable;
55
Lang Hamesaac59a22016-08-04 20:32:37 +000056 return Flags;
57}
Lang Hames14a22a42017-08-09 20:19:27 +000058
Lang Hamesbfea8cd2018-08-01 22:42:23 +000059ARMJITSymbolFlags
60llvm::ARMJITSymbolFlags::fromObjectSymbol(const object::SymbolRef &Symbol) {
Lang Hames14a22a42017-08-09 20:19:27 +000061 ARMJITSymbolFlags Flags;
62 if (Symbol.getFlags() & object::BasicSymbolRef::SF_Thumb)
63 Flags |= ARMJITSymbolFlags::Thumb;
64 return Flags;
65}
Lang Hamesb72f4842018-01-19 22:24:13 +000066
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +000067/// Performs lookup by, for each symbol, first calling
Lang Hamesb72f4842018-01-19 22:24:13 +000068/// findSymbolInLogicalDylib and if that fails calling
69/// findSymbol.
Lang Hamesadde5ba2018-09-25 19:48:46 +000070void LegacyJITSymbolResolver::lookup(const LookupSet &Symbols,
71 OnResolvedFunction OnResolved) {
Lang Hamesb72f4842018-01-19 22:24:13 +000072 JITSymbolResolver::LookupResult Result;
73 for (auto &Symbol : Symbols) {
74 std::string SymName = Symbol.str();
75 if (auto Sym = findSymbolInLogicalDylib(SymName)) {
76 if (auto AddrOrErr = Sym.getAddress())
77 Result[Symbol] = JITEvaluatedSymbol(*AddrOrErr, Sym.getFlags());
Lang Hamesadde5ba2018-09-25 19:48:46 +000078 else {
79 OnResolved(AddrOrErr.takeError());
80 return;
81 }
82 } else if (auto Err = Sym.takeError()) {
83 OnResolved(std::move(Err));
84 return;
85 } else {
Lang Hamesb72f4842018-01-19 22:24:13 +000086 // findSymbolInLogicalDylib failed. Lets try findSymbol.
87 if (auto Sym = findSymbol(SymName)) {
88 if (auto AddrOrErr = Sym.getAddress())
89 Result[Symbol] = JITEvaluatedSymbol(*AddrOrErr, Sym.getFlags());
Lang Hamesadde5ba2018-09-25 19:48:46 +000090 else {
91 OnResolved(AddrOrErr.takeError());
92 return;
93 }
94 } else if (auto Err = Sym.takeError()) {
95 OnResolved(std::move(Err));
96 return;
97 } else {
98 OnResolved(make_error<StringError>("Symbol not found: " + Symbol,
99 inconvertibleErrorCode()));
100 return;
101 }
Lang Hamesb72f4842018-01-19 22:24:13 +0000102 }
103 }
104
Lang Hamesadde5ba2018-09-25 19:48:46 +0000105 OnResolved(std::move(Result));
Lang Hamesb72f4842018-01-19 22:24:13 +0000106}
107
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000108/// Performs flags lookup by calling findSymbolInLogicalDylib and
Lang Hamesb72f4842018-01-19 22:24:13 +0000109/// returning the flags value for that symbol.
Lang Hames6cadc7c2018-08-28 21:18:05 +0000110Expected<JITSymbolResolver::LookupSet>
111LegacyJITSymbolResolver::getResponsibilitySet(const LookupSet &Symbols) {
112 JITSymbolResolver::LookupSet Result;
Lang Hamesb72f4842018-01-19 22:24:13 +0000113
114 for (auto &Symbol : Symbols) {
115 std::string SymName = Symbol.str();
Lang Hames6cadc7c2018-08-28 21:18:05 +0000116 if (auto Sym = findSymbolInLogicalDylib(SymName)) {
117 // If there's an existing def but it is not strong, then the caller is
118 // responsible for it.
119 if (!Sym.getFlags().isStrong())
120 Result.insert(Symbol);
121 } else if (auto Err = Sym.takeError())
Bill Wendlingc55cf4a2020-02-10 07:06:45 -0800122 return std::move(Err);
Lang Hames6cadc7c2018-08-28 21:18:05 +0000123 else {
124 // If there is no existing definition then the caller is responsible for
125 // it.
126 Result.insert(Symbol);
127 }
Lang Hamesb72f4842018-01-19 22:24:13 +0000128 }
129
Bill Wendlingc55cf4a2020-02-10 07:06:45 -0800130 return std::move(Result);
Lang Hamesb72f4842018-01-19 22:24:13 +0000131}