blob: b445d3d49d7e4bc2b2a8d0c464889d223569a78e [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) {
23 JITSymbolFlags Flags = JITSymbolFlags::None;
Lang Hames73976f62016-08-06 22:36:26 +000024 if (GV.hasWeakLinkage() || GV.hasLinkOnceLinkage())
Lang Hamesaac59a22016-08-04 20:32:37 +000025 Flags |= JITSymbolFlags::Weak;
26 if (GV.hasCommonLinkage())
27 Flags |= JITSymbolFlags::Common;
28 if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
29 Flags |= JITSymbolFlags::Exported;
Lang Hames98440292018-09-29 23:49:57 +000030
Lang Hamesbfea8cd2018-08-01 22:42:23 +000031 if (isa<Function>(GV))
32 Flags |= JITSymbolFlags::Callable;
Lang Hames98440292018-09-29 23:49:57 +000033 else if (isa<GlobalAlias>(GV) &&
34 isa<Function>(cast<GlobalAlias>(GV).getAliasee()))
35 Flags |= JITSymbolFlags::Callable;
36
Lang Hamesaac59a22016-08-04 20:32:37 +000037 return Flags;
38}
39
Stefan Gränitzec1e7fa2020-02-29 11:52:19 +000040JITSymbolFlags llvm::JITSymbolFlags::fromSummary(GlobalValueSummary *S) {
41 JITSymbolFlags Flags = JITSymbolFlags::None;
42 auto L = S->linkage();
43 if (GlobalValue::isWeakLinkage(L) || GlobalValue::isLinkOnceLinkage(L))
44 Flags |= JITSymbolFlags::Weak;
45 if (GlobalValue::isCommonLinkage(L))
46 Flags |= JITSymbolFlags::Common;
47 if (GlobalValue::isExternalLinkage(L) || GlobalValue::isExternalWeakLinkage(L))
48 Flags |= JITSymbolFlags::Exported;
49
50 if (isa<FunctionSummary>(S))
51 Flags |= JITSymbolFlags::Callable;
52
53 return Flags;
54}
55
Lang Hamesbfea8cd2018-08-01 22:42:23 +000056Expected<JITSymbolFlags>
57llvm::JITSymbolFlags::fromObjectSymbol(const object::SymbolRef &Symbol) {
vgxbjac003762020-04-10 20:24:21 +080058 Expected<uint32_t> SymbolFlagsOrErr = Symbol.getFlags();
59 if (!SymbolFlagsOrErr)
60 // TODO: Test this error.
61 return SymbolFlagsOrErr.takeError();
62
Lang Hamesaac59a22016-08-04 20:32:37 +000063 JITSymbolFlags Flags = JITSymbolFlags::None;
vgxbjac003762020-04-10 20:24:21 +080064 if (*SymbolFlagsOrErr & object::BasicSymbolRef::SF_Weak)
Lang Hamesaac59a22016-08-04 20:32:37 +000065 Flags |= JITSymbolFlags::Weak;
vgxbjac003762020-04-10 20:24:21 +080066 if (*SymbolFlagsOrErr & object::BasicSymbolRef::SF_Common)
Lang Hamesaac59a22016-08-04 20:32:37 +000067 Flags |= JITSymbolFlags::Common;
vgxbjac003762020-04-10 20:24:21 +080068 if (*SymbolFlagsOrErr & object::BasicSymbolRef::SF_Exported)
Lang Hamesaac59a22016-08-04 20:32:37 +000069 Flags |= JITSymbolFlags::Exported;
Lang Hamesbfea8cd2018-08-01 22:42:23 +000070
71 auto SymbolType = Symbol.getType();
72 if (!SymbolType)
73 return SymbolType.takeError();
74
75 if (*SymbolType & object::SymbolRef::ST_Function)
76 Flags |= JITSymbolFlags::Callable;
77
Lang Hamesaac59a22016-08-04 20:32:37 +000078 return Flags;
79}
Lang Hames14a22a42017-08-09 20:19:27 +000080
Lang Hamesbfea8cd2018-08-01 22:42:23 +000081ARMJITSymbolFlags
82llvm::ARMJITSymbolFlags::fromObjectSymbol(const object::SymbolRef &Symbol) {
vgxbjac003762020-04-10 20:24:21 +080083 Expected<uint32_t> SymbolFlagsOrErr = Symbol.getFlags();
84 if (!SymbolFlagsOrErr)
85 // TODO: Actually report errors helpfully.
86 report_fatal_error(SymbolFlagsOrErr.takeError());
Lang Hames14a22a42017-08-09 20:19:27 +000087 ARMJITSymbolFlags Flags;
vgxbjac003762020-04-10 20:24:21 +080088 if (*SymbolFlagsOrErr & object::BasicSymbolRef::SF_Thumb)
Lang Hames14a22a42017-08-09 20:19:27 +000089 Flags |= ARMJITSymbolFlags::Thumb;
90 return Flags;
91}
Lang Hamesb72f4842018-01-19 22:24:13 +000092
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +000093/// Performs lookup by, for each symbol, first calling
Lang Hamesb72f4842018-01-19 22:24:13 +000094/// findSymbolInLogicalDylib and if that fails calling
95/// findSymbol.
Lang Hamesadde5ba2018-09-25 19:48:46 +000096void LegacyJITSymbolResolver::lookup(const LookupSet &Symbols,
97 OnResolvedFunction OnResolved) {
Lang Hamesb72f4842018-01-19 22:24:13 +000098 JITSymbolResolver::LookupResult Result;
99 for (auto &Symbol : Symbols) {
100 std::string SymName = Symbol.str();
101 if (auto Sym = findSymbolInLogicalDylib(SymName)) {
102 if (auto AddrOrErr = Sym.getAddress())
103 Result[Symbol] = JITEvaluatedSymbol(*AddrOrErr, Sym.getFlags());
Lang Hamesadde5ba2018-09-25 19:48:46 +0000104 else {
105 OnResolved(AddrOrErr.takeError());
106 return;
107 }
108 } else if (auto Err = Sym.takeError()) {
109 OnResolved(std::move(Err));
110 return;
111 } else {
Lang Hamesb72f4842018-01-19 22:24:13 +0000112 // findSymbolInLogicalDylib failed. Lets try findSymbol.
113 if (auto Sym = findSymbol(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 {
124 OnResolved(make_error<StringError>("Symbol not found: " + Symbol,
125 inconvertibleErrorCode()));
126 return;
127 }
Lang Hamesb72f4842018-01-19 22:24:13 +0000128 }
129 }
130
Lang Hamesadde5ba2018-09-25 19:48:46 +0000131 OnResolved(std::move(Result));
Lang Hamesb72f4842018-01-19 22:24:13 +0000132}
133
Adrian Prantl4dfcc4a2018-05-01 16:10:38 +0000134/// Performs flags lookup by calling findSymbolInLogicalDylib and
Lang Hamesb72f4842018-01-19 22:24:13 +0000135/// returning the flags value for that symbol.
Lang Hames6cadc7c2018-08-28 21:18:05 +0000136Expected<JITSymbolResolver::LookupSet>
137LegacyJITSymbolResolver::getResponsibilitySet(const LookupSet &Symbols) {
138 JITSymbolResolver::LookupSet Result;
Lang Hamesb72f4842018-01-19 22:24:13 +0000139
140 for (auto &Symbol : Symbols) {
141 std::string SymName = Symbol.str();
Lang Hames6cadc7c2018-08-28 21:18:05 +0000142 if (auto Sym = findSymbolInLogicalDylib(SymName)) {
143 // If there's an existing def but it is not strong, then the caller is
144 // responsible for it.
145 if (!Sym.getFlags().isStrong())
146 Result.insert(Symbol);
147 } else if (auto Err = Sym.takeError())
Bill Wendlingc55cf4a2020-02-10 07:06:45 -0800148 return std::move(Err);
Lang Hames6cadc7c2018-08-28 21:18:05 +0000149 else {
150 // If there is no existing definition then the caller is responsible for
151 // it.
152 Result.insert(Symbol);
153 }
Lang Hamesb72f4842018-01-19 22:24:13 +0000154 }
155
Bill Wendlingc55cf4a2020-02-10 07:06:45 -0800156 return std::move(Result);
Lang Hamesb72f4842018-01-19 22:24:13 +0000157}