blob: 0f6f9efe1102708bf8df3271be1c39bac0132e0c [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"
Stefan Gränitzec1e7fa2020-02-29 11:52:19 +000017#include "llvm/IR/ModuleSummaryIndex.h"
Lang Hamesbfea8cd2018-08-01 22:42:23 +000018#include "llvm/Object/ObjectFile.h"
Lang Hamesaac59a22016-08-04 20:32:37 +000019
20using namespace llvm;
21
22JITSymbolFlags llvm::JITSymbolFlags::fromGlobalValue(const GlobalValue &GV) {
Lang Hames498dd742020-06-13 19:03:21 -070023 assert(GV.hasName() && "Can't get flags for anonymous symbol");
24
Lang Hamesaac59a22016-08-04 20:32:37 +000025 JITSymbolFlags Flags = JITSymbolFlags::None;
Lang Hames73976f62016-08-06 22:36:26 +000026 if (GV.hasWeakLinkage() || GV.hasLinkOnceLinkage())
Lang Hamesaac59a22016-08-04 20:32:37 +000027 Flags |= JITSymbolFlags::Weak;
28 if (GV.hasCommonLinkage())
29 Flags |= JITSymbolFlags::Common;
30 if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
31 Flags |= JITSymbolFlags::Exported;
Lang Hames98440292018-09-29 23:49:57 +000032
Lang Hamesbfea8cd2018-08-01 22:42:23 +000033 if (isa<Function>(GV))
34 Flags |= JITSymbolFlags::Callable;
Lang Hames98440292018-09-29 23:49:57 +000035 else if (isa<GlobalAlias>(GV) &&
36 isa<Function>(cast<GlobalAlias>(GV).getAliasee()))
37 Flags |= JITSymbolFlags::Callable;
38
Lang Hames498dd742020-06-13 19:03:21 -070039 // Check for a linker-private-global-prefix on the symbol name, in which
40 // case it must be marked as non-exported.
41 if (auto *M = GV.getParent()) {
42 const auto &DL = M->getDataLayout();
43 StringRef LPGP = DL.getLinkerPrivateGlobalPrefix();
44 if (!LPGP.empty() && GV.getName().front() == '\01' &&
45 GV.getName().substr(1).startswith(LPGP))
46 Flags &= ~JITSymbolFlags::Exported;
47 }
48
Lang Hamesaac59a22016-08-04 20:32:37 +000049 return Flags;
50}
51
Stefan Gränitzec1e7fa2020-02-29 11:52:19 +000052JITSymbolFlags llvm::JITSymbolFlags::fromSummary(GlobalValueSummary *S) {
53 JITSymbolFlags Flags = JITSymbolFlags::None;
54 auto L = S->linkage();
55 if (GlobalValue::isWeakLinkage(L) || GlobalValue::isLinkOnceLinkage(L))
56 Flags |= JITSymbolFlags::Weak;
57 if (GlobalValue::isCommonLinkage(L))
58 Flags |= JITSymbolFlags::Common;
59 if (GlobalValue::isExternalLinkage(L) || GlobalValue::isExternalWeakLinkage(L))
60 Flags |= JITSymbolFlags::Exported;
61
62 if (isa<FunctionSummary>(S))
63 Flags |= JITSymbolFlags::Callable;
64
65 return Flags;
66}
67
Lang Hamesbfea8cd2018-08-01 22:42:23 +000068Expected<JITSymbolFlags>
69llvm::JITSymbolFlags::fromObjectSymbol(const object::SymbolRef &Symbol) {
vgxbjac003762020-04-10 20:24:21 +080070 Expected<uint32_t> SymbolFlagsOrErr = Symbol.getFlags();
71 if (!SymbolFlagsOrErr)
72 // TODO: Test this error.
73 return SymbolFlagsOrErr.takeError();
74
Lang Hamesaac59a22016-08-04 20:32:37 +000075 JITSymbolFlags Flags = JITSymbolFlags::None;
vgxbjac003762020-04-10 20:24:21 +080076 if (*SymbolFlagsOrErr & object::BasicSymbolRef::SF_Weak)
Lang Hamesaac59a22016-08-04 20:32:37 +000077 Flags |= JITSymbolFlags::Weak;
vgxbjac003762020-04-10 20:24:21 +080078 if (*SymbolFlagsOrErr & object::BasicSymbolRef::SF_Common)
Lang Hamesaac59a22016-08-04 20:32:37 +000079 Flags |= JITSymbolFlags::Common;
vgxbjac003762020-04-10 20:24:21 +080080 if (*SymbolFlagsOrErr & object::BasicSymbolRef::SF_Exported)
Lang Hamesaac59a22016-08-04 20:32:37 +000081 Flags |= JITSymbolFlags::Exported;
Lang Hamesbfea8cd2018-08-01 22:42:23 +000082
83 auto SymbolType = Symbol.getType();
84 if (!SymbolType)
85 return SymbolType.takeError();
86
87 if (*SymbolType & object::SymbolRef::ST_Function)
88 Flags |= JITSymbolFlags::Callable;
89
Lang Hamesaac59a22016-08-04 20:32:37 +000090 return Flags;
91}
Lang Hames14a22a42017-08-09 20:19:27 +000092
Lang Hamesbfea8cd2018-08-01 22:42:23 +000093ARMJITSymbolFlags
94llvm::ARMJITSymbolFlags::fromObjectSymbol(const object::SymbolRef &Symbol) {
vgxbjac003762020-04-10 20:24:21 +080095 Expected<uint32_t> SymbolFlagsOrErr = Symbol.getFlags();
96 if (!SymbolFlagsOrErr)
97 // TODO: Actually report errors helpfully.
98 report_fatal_error(SymbolFlagsOrErr.takeError());
Lang Hames14a22a42017-08-09 20:19:27 +000099 ARMJITSymbolFlags Flags;
vgxbjac003762020-04-10 20:24:21 +0800100 if (*SymbolFlagsOrErr & object::BasicSymbolRef::SF_Thumb)
Lang Hames14a22a42017-08-09 20:19:27 +0000101 Flags |= ARMJITSymbolFlags::Thumb;
102 return Flags;
103}
Lang Hamesb72f4842018-01-19 22:24:13 +0000104
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000105/// Performs lookup by, for each symbol, first calling
Lang Hamesb72f4842018-01-19 22:24:13 +0000106/// findSymbolInLogicalDylib and if that fails calling
107/// findSymbol.
Lang Hamesadde5ba2018-09-25 19:48:46 +0000108void LegacyJITSymbolResolver::lookup(const LookupSet &Symbols,
109 OnResolvedFunction OnResolved) {
Lang Hamesb72f4842018-01-19 22:24:13 +0000110 JITSymbolResolver::LookupResult Result;
111 for (auto &Symbol : Symbols) {
112 std::string SymName = Symbol.str();
113 if (auto Sym = findSymbolInLogicalDylib(SymName)) {
114 if (auto AddrOrErr = Sym.getAddress())
115 Result[Symbol] = JITEvaluatedSymbol(*AddrOrErr, Sym.getFlags());
Lang Hamesadde5ba2018-09-25 19:48:46 +0000116 else {
117 OnResolved(AddrOrErr.takeError());
118 return;
119 }
120 } else if (auto Err = Sym.takeError()) {
121 OnResolved(std::move(Err));
122 return;
123 } else {
Lang Hamesb72f4842018-01-19 22:24:13 +0000124 // findSymbolInLogicalDylib failed. Lets try findSymbol.
125 if (auto Sym = findSymbol(SymName)) {
126 if (auto AddrOrErr = Sym.getAddress())
127 Result[Symbol] = JITEvaluatedSymbol(*AddrOrErr, Sym.getFlags());
Lang Hamesadde5ba2018-09-25 19:48:46 +0000128 else {
129 OnResolved(AddrOrErr.takeError());
130 return;
131 }
132 } else if (auto Err = Sym.takeError()) {
133 OnResolved(std::move(Err));
134 return;
135 } else {
136 OnResolved(make_error<StringError>("Symbol not found: " + Symbol,
137 inconvertibleErrorCode()));
138 return;
139 }
Lang Hamesb72f4842018-01-19 22:24:13 +0000140 }
141 }
142
Lang Hamesadde5ba2018-09-25 19:48:46 +0000143 OnResolved(std::move(Result));
Lang Hamesb72f4842018-01-19 22:24:13 +0000144}
145
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000146/// Performs flags lookup by calling findSymbolInLogicalDylib and
Lang Hamesb72f4842018-01-19 22:24:13 +0000147/// returning the flags value for that symbol.
Lang Hames6cadc7c2018-08-28 21:18:05 +0000148Expected<JITSymbolResolver::LookupSet>
149LegacyJITSymbolResolver::getResponsibilitySet(const LookupSet &Symbols) {
150 JITSymbolResolver::LookupSet Result;
Lang Hamesb72f4842018-01-19 22:24:13 +0000151
152 for (auto &Symbol : Symbols) {
153 std::string SymName = Symbol.str();
Lang Hames6cadc7c2018-08-28 21:18:05 +0000154 if (auto Sym = findSymbolInLogicalDylib(SymName)) {
155 // If there's an existing def but it is not strong, then the caller is
156 // responsible for it.
157 if (!Sym.getFlags().isStrong())
158 Result.insert(Symbol);
159 } else if (auto Err = Sym.takeError())
Bill Wendlingc55cf4a2020-02-10 07:06:45 -0800160 return std::move(Err);
Lang Hames6cadc7c2018-08-28 21:18:05 +0000161 else {
162 // If there is no existing definition then the caller is responsible for
163 // it.
164 Result.insert(Symbol);
165 }
Lang Hamesb72f4842018-01-19 22:24:13 +0000166 }
167
Bill Wendlingc55cf4a2020-02-10 07:06:45 -0800168 return std::move(Result);
Lang Hamesb72f4842018-01-19 22:24:13 +0000169}