<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 9, 2015 at 5:33 PM, Eric Christopher <span dir="ltr"><<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: echristo<br>
Date: Mon Mar 9 19:33:27 2015<br>
New Revision: 231731<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=231731&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=231731&view=rev</a><br>
Log:<br>
Temporarily revert r231726 and r231724 as they're breaking the build.:<br>
<br>
Author: Lang Hames <<a href="mailto:lhames@gmail.com">lhames@gmail.com</a>><br>
Date: Mon Mar 9 23:51:09 2015 +0000<br>
<br>
[Orc][MCJIT][RuntimeDyld] Add header that was accidentally left out of r231724.<br>
<br>
Author: Lang Hames <<a href="mailto:lhames@gmail.com">lhames@gmail.com</a>><br>
Date: Mon Mar 9 23:44:13 2015 +0000<br>
<br>
[Orc][MCJIT][RuntimeDyld] Add symbol flags to symbols in RuntimeDyld. Thread the<br>
new types through MCJIT and Orc.<br>
<br>
In particular, add a 'weak' flag. When plumbed through RTDyldMemoryManager, this<br>
will allow us to distinguish between weak and strong definitions and find the<br>
right ones during symbol resolution.<br></blockquote><div><br>Looks like the op| & related functions just need to be marked inline.<br><br>Ben Kramer - another place/context where -Wmissing-prototype would help :)<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Removed:<br>
llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h<br>
Modified:<br>
llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h<br>
llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h<br>
llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h<br>
llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h<br>
llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h<br>
llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp<br>
llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp<br>
llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h<br>
llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h<br>
llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp<br>
<br>
Removed: llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h?rev=231730&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h?rev=231730&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h (removed)<br>
@@ -1,81 +0,0 @@<br>
-//===------ JITSymbolFlags.h - Flags for symbols in the JIT -----*- C++ -*-===//<br>
-//<br>
-// The LLVM Compiler Infrastructure<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-//<br>
-// Symbol flags for symbols in the JIT (e.g. weak, exported).<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-#ifndef LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H<br>
-#define LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H<br>
-<br>
-#include "llvm/IR/GlobalValue.h"<br>
-<br>
-namespace llvm {<br>
-<br>
-/// @brief Flags for symbols in the JIT.<br>
-enum class JITSymbolFlags : char {<br>
- None = 0,<br>
- Weak = 1U << 0,<br>
- Exported = 1U << 1<br>
-};<br>
-<br>
-JITSymbolFlags operator|(JITSymbolFlags LHS, JITSymbolFlags RHS) {<br>
- typedef std::underlying_type<JITSymbolFlags>::type UT;<br>
- return static_cast<JITSymbolFlags>(<br>
- static_cast<UT>(LHS) | static_cast<UT>(RHS));<br>
-}<br>
-<br>
-JITSymbolFlags& operator |=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {<br>
- LHS = LHS | RHS;<br>
- return LHS;<br>
-}<br>
-<br>
-JITSymbolFlags operator&(JITSymbolFlags LHS, JITSymbolFlags RHS) {<br>
- typedef std::underlying_type<JITSymbolFlags>::type UT;<br>
- return static_cast<JITSymbolFlags>(<br>
- static_cast<UT>(LHS) & static_cast<UT>(RHS));<br>
-}<br>
-<br>
-JITSymbolFlags& operator &=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {<br>
- LHS = LHS & RHS;<br>
- return LHS;<br>
-}<br>
-<br>
-/// @brief Base class for symbols in the JIT.<br>
-class JITSymbolBase {<br>
-public:<br>
- JITSymbolBase(JITSymbolFlags Flags) : Flags(Flags) {}<br>
-<br>
- JITSymbolFlags getFlags() const { return Flags; }<br>
-<br>
- bool isWeak() const {<br>
- return (Flags & JITSymbolFlags::Weak) == JITSymbolFlags::Weak;<br>
- }<br>
-<br>
- bool isExported() const {<br>
- return (Flags & JITSymbolFlags::Exported) == JITSymbolFlags::Exported;<br>
- }<br>
-<br>
- static JITSymbolFlags flagsFromGlobalValue(const GlobalValue &GV) {<br>
- JITSymbolFlags Flags = JITSymbolFlags::None;<br>
- if (GV.hasWeakLinkage())<br>
- Flags |= JITSymbolFlags::Weak;<br>
- if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())<br>
- Flags |= JITSymbolFlags::Exported;<br>
- return Flags;<br>
-<br>
- }<br>
-<br>
-private:<br>
- JITSymbolFlags Flags;<br>
-};<br>
-<br>
-} // end namespace llvm<br>
-<br>
-#endif<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h Mon Mar 9 19:33:27 2015<br>
@@ -14,7 +14,6 @@<br>
#ifndef LLVM_EXECUTIONENGINE_ORC_JITSYMBOL_H<br>
#define LLVM_EXECUTIONENGINE_ORC_JITSYMBOL_H<br>
<br>
-#include "llvm/ExecutionEngine/JITSymbolFlags.h"<br>
#include "llvm/Support/DataTypes.h"<br>
#include <cassert><br>
#include <functional><br>
@@ -26,19 +25,17 @@ namespace orc {<br>
typedef uint64_t TargetAddress;<br>
<br>
/// @brief Represents a symbol in the JIT.<br>
-class JITSymbol : public JITSymbolBase {<br>
-public:<br>
-<br>
+class JITSymbol {<br>
+public:<br>
typedef std::function<TargetAddress()> GetAddressFtor;<br>
<br>
/// @brief Create a 'null' symbol that represents failure to find a symbol<br>
/// definition.<br>
- JITSymbol(std::nullptr_t)<br>
- : JITSymbolBase(JITSymbolFlags::None), CachedAddr(0) {}<br>
+ JITSymbol(std::nullptr_t) : CachedAddr(0) {}<br>
<br>
/// @brief Create a symbol for a definition with a known address.<br>
- JITSymbol(TargetAddress Addr, JITSymbolFlags Flags)<br>
- : JITSymbolBase(Flags), CachedAddr(Addr) {}<br>
+ JITSymbol(TargetAddress Addr)<br>
+ : CachedAddr(Addr) {}<br>
<br>
/// @brief Create a symbol for a definition that doesn't have a known address<br>
/// yet.<br>
@@ -49,8 +46,8 @@ public:<br>
/// definition without actually materializing the definition up front. The<br>
/// user can materialize the definition at any time by calling the getAddress<br>
/// method.<br>
- JITSymbol(GetAddressFtor GetAddress, JITSymbolFlags Flags)<br>
- : JITSymbolBase(Flags), GetAddress(std::move(GetAddress)), CachedAddr(0) {}<br>
+ JITSymbol(GetAddressFtor GetAddress)<br>
+ : CachedAddr(0), GetAddress(std::move(GetAddress)) {}<br>
<br>
/// @brief Returns true if the symbol exists, false otherwise.<br>
explicit operator bool() const { return CachedAddr || GetAddress; }<br>
@@ -67,8 +64,8 @@ public:<br>
}<br>
<br>
private:<br>
- GetAddressFtor GetAddress;<br>
TargetAddress CachedAddr;<br>
+ GetAddressFtor GetAddress;<br>
};<br>
<br>
} // End namespace orc.<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h Mon Mar 9 19:33:27 2015<br>
@@ -45,25 +45,23 @@ private:<br>
JITSymbol find(StringRef Name, bool ExportedSymbolsOnly, BaseLayerT &B) {<br>
switch (EmitState) {<br>
case NotEmitted:<br>
- if (auto GV = searchGVs(Name, ExportedSymbolsOnly)) {<br>
+ if (provides(Name, ExportedSymbolsOnly)) {<br>
// Create a std::string version of Name to capture here - the argument<br>
// (a StringRef) may go away before the lambda is executed.<br>
// FIXME: Use capture-init when we move to C++14.<br>
- auto PName = Name;<br>
- JITSymbolFlags Flags = JITSymbolBase::flagsFromGlobalValue(*GV);<br>
- auto GetAddress =<br>
- [this, ExportedSymbolsOnly, PName, &B]() -> TargetAddress {<br>
- if (this->EmitState == Emitting)<br>
- return 0;<br>
- else if (this->EmitState == NotEmitted) {<br>
- this->EmitState = Emitting;<br>
- Handle = this->emitToBaseLayer(B);<br>
- this->EmitState = Emitted;<br>
- }<br>
- auto Sym = B.findSymbolIn(Handle, PName, ExportedSymbolsOnly);<br>
- return Sym.getAddress();<br>
- };<br>
- return JITSymbol(std::move(GetAddress), Flags);<br>
+ std::string PName = Name;<br>
+ return JITSymbol(<br>
+ [this, ExportedSymbolsOnly, PName, &B]() -> TargetAddress {<br>
+ if (this->EmitState == Emitting)<br>
+ return 0;<br>
+ else if (this->EmitState == NotEmitted) {<br>
+ this->EmitState = Emitting;<br>
+ Handle = this->emitToBaseLayer(B);<br>
+ this->EmitState = Emitted;<br>
+ }<br>
+ return B.findSymbolIn(Handle, PName, ExportedSymbolsOnly)<br>
+ .getAddress();<br>
+ });<br>
} else<br>
return nullptr;<br>
case Emitting:<br>
@@ -100,8 +98,7 @@ private:<br>
std::unique_ptr<RTDyldMemoryManager> MM);<br>
<br>
protected:<br>
- virtual const GlobalValue* searchGVs(StringRef Name,<br>
- bool ExportedSymbolsOnly) const = 0;<br>
+ virtual bool provides(StringRef Name, bool ExportedSymbolsOnly) const = 0;<br>
virtual BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) = 0;<br>
<br>
private:<br>
@@ -118,48 +115,46 @@ private:<br>
<br>
protected:<br>
<br>
- const GlobalValue* searchGVs(StringRef Name,<br>
- bool ExportedSymbolsOnly) const override {<br>
+ BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) override {<br>
+ // We don't need the mangled names set any more: Once we've emitted this<br>
+ // to the base layer we'll just look for symbols there.<br>
+ MangledNames.reset();<br>
+ return BaseLayer.addModuleSet(std::move(Ms), std::move(MM));<br>
+ }<br>
+<br>
+ bool provides(StringRef Name, bool ExportedSymbolsOnly) const override {<br>
// FIXME: We could clean all this up if we had a way to reliably demangle<br>
// names: We could just demangle name and search, rather than<br>
// mangling everything else.<br>
<br>
// If we have already built the mangled name set then just search it.<br>
- if (MangledSymbols) {<br>
- auto VI = MangledSymbols->find(Name);<br>
- if (VI == MangledSymbols->end())<br>
- return nullptr;<br>
- auto GV = VI->second;<br>
- if (!ExportedSymbolsOnly || GV->hasDefaultVisibility())<br>
- return GV;<br>
- return nullptr;<br>
+ if (MangledNames) {<br>
+ auto VI = MangledNames->find(Name);<br>
+ if (VI == MangledNames->end())<br>
+ return false;<br>
+ return !ExportedSymbolsOnly || VI->second;<br>
}<br>
<br>
// If we haven't built the mangled name set yet, try to build it. As an<br>
// optimization this will leave MangledNames set to nullptr if we find<br>
// Name in the process of building the set.<br>
- return buildMangledSymbols(Name, ExportedSymbolsOnly);<br>
- }<br>
-<br>
- BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) override {<br>
- // We don't need the mangled names set any more: Once we've emitted this<br>
- // to the base layer we'll just look for symbols there.<br>
- MangledSymbols.reset();<br>
- return BaseLayer.addModuleSet(std::move(Ms), std::move(MM));<br>
+ buildMangledNames(Name, ExportedSymbolsOnly);<br>
+ if (!MangledNames)<br>
+ return true;<br>
+ return false;<br>
}<br>
<br>
private:<br>
// If the mangled name of the given GlobalValue matches the given search<br>
// name (and its visibility conforms to the ExportedSymbolsOnly flag) then<br>
- // return the symbol. Otherwise, add the mangled name to the Names map and<br>
- // return nullptr.<br>
- const GlobalValue* addGlobalValue(StringMap<const GlobalValue*> &Names,<br>
- const GlobalValue &GV,<br>
- const Mangler &Mang, StringRef SearchName,<br>
- bool ExportedSymbolsOnly) const {<br>
+ // just return 'true'. Otherwise, add the mangled name to the Names map and<br>
+ // return 'false'.<br>
+ bool addGlobalValue(StringMap<bool> &Names, const GlobalValue &GV,<br>
+ const Mangler &Mang, StringRef SearchName,<br>
+ bool ExportedSymbolsOnly) const {<br>
// Modules don't "provide" decls or common symbols.<br>
if (GV.isDeclaration() || GV.hasCommonLinkage())<br>
- return nullptr;<br>
+ return false;<br>
<br>
// Mangle the GV name.<br>
std::string MangledName;<br>
@@ -172,42 +167,39 @@ private:<br>
// bail out early.<br>
if (MangledName == SearchName)<br>
if (!ExportedSymbolsOnly || GV.hasDefaultVisibility())<br>
- return &GV;<br>
+ return true;<br>
<br>
// Otherwise add this to the map for later.<br>
- Names[MangledName] = &GV;<br>
- return nullptr;<br>
+ Names[MangledName] = GV.hasDefaultVisibility();<br>
+ return false;<br>
}<br>
<br>
- // Build the MangledSymbols map. Bails out early (with MangledSymbols left set<br>
+ // Build the MangledNames map. Bails out early (with MangledNames left set<br>
// to nullptr) if the given SearchName is found while building the map.<br>
- const GlobalValue* buildMangledSymbols(StringRef SearchName,<br>
- bool ExportedSymbolsOnly) const {<br>
- assert(!MangledSymbols && "Mangled symbols map already exists?");<br>
+ void buildMangledNames(StringRef SearchName,<br>
+ bool ExportedSymbolsOnly) const {<br>
+ assert(!MangledNames && "Mangled names map already exists?");<br>
<br>
- auto Symbols = llvm::make_unique<StringMap<const GlobalValue*>>();<br>
+ auto Names = llvm::make_unique<StringMap<bool>>();<br>
<br>
for (const auto &M : Ms) {<br>
Mangler Mang(&M->getDataLayout());<br>
<br>
- for (const auto &V : M->globals())<br>
- if (auto GV = addGlobalValue(*Symbols, V, Mang, SearchName,<br>
- ExportedSymbolsOnly))<br>
- return GV;<br>
+ for (const auto &GV : M->globals())<br>
+ if (addGlobalValue(*Names, GV, Mang, SearchName, ExportedSymbolsOnly))<br>
+ return;<br>
<br>
for (const auto &F : *M)<br>
- if (auto GV = addGlobalValue(*Symbols, F, Mang, SearchName,<br>
- ExportedSymbolsOnly))<br>
- return GV;<br>
+ if (addGlobalValue(*Names, F, Mang, SearchName, ExportedSymbolsOnly))<br>
+ return;<br>
}<br>
<br>
- MangledSymbols = std::move(Symbols);<br>
- return nullptr;<br>
+ MangledNames = std::move(Names);<br>
}<br>
<br>
ModuleSetT Ms;<br>
std::unique_ptr<RTDyldMemoryManager> MM;<br>
- mutable std::unique_ptr<StringMap<const GlobalValue*>> MangledSymbols;<br>
+ mutable std::unique_ptr<StringMap<bool>> MangledNames;<br>
};<br>
<br>
typedef std::list<std::unique_ptr<EmissionDeferredSet>> ModuleSetListT;<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h Mon Mar 9 19:33:27 2015<br>
@@ -51,8 +51,10 @@ protected:<br>
return RTDyld->loadObject(Obj);<br>
}<br>
<br>
- RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {<br>
- return RTDyld->getSymbol(Name);<br>
+ TargetAddress getSymbolAddress(StringRef Name, bool ExportedSymbolsOnly) {<br>
+ if (ExportedSymbolsOnly)<br>
+ return RTDyld->getExportedSymbolLoadAddress(Name);<br>
+ return RTDyld->getSymbolLoadAddress(Name);<br>
}<br>
<br>
bool NeedsFinalization() const { return (State == Raw); }<br>
@@ -212,32 +214,28 @@ public:<br>
/// given object set.<br>
JITSymbol findSymbolIn(ObjSetHandleT H, StringRef Name,<br>
bool ExportedSymbolsOnly) {<br>
- if (auto Sym = H->getSymbol(Name)) {<br>
- if (Sym.isExported() || !ExportedSymbolsOnly) {<br>
- auto Addr = Sym.getAddress();<br>
- auto Flags = Sym.getFlags();<br>
- if (!H->NeedsFinalization()) {<br>
- // If this instance has already been finalized then we can just return<br>
- // the address.<br>
- return JITSymbol(Addr, Flags);<br>
- } else {<br>
- // If this instance needs finalization return a functor that will do<br>
- // it. The functor still needs to double-check whether finalization is<br>
- // required, in case someone else finalizes this set before the<br>
- // functor is called.<br>
- auto GetAddress =<br>
- [this, Addr, H]() {<br>
- if (H->NeedsFinalization()) {<br>
- H->Finalize();<br>
- if (NotifyFinalized)<br>
- NotifyFinalized(H);<br>
- }<br>
- return Addr;<br>
- };<br>
- return JITSymbol(std::move(GetAddress), Flags);<br>
- }<br>
+ if (auto Addr = H->getSymbolAddress(Name, ExportedSymbolsOnly)) {<br>
+ if (!H->NeedsFinalization()) {<br>
+ // If this instance has already been finalized then we can just return<br>
+ // the address.<br>
+ return JITSymbol(Addr);<br>
+ } else {<br>
+ // If this instance needs finalization return a functor that will do it.<br>
+ // The functor still needs to double-check whether finalization is<br>
+ // required, in case someone else finalizes this set before the functor<br>
+ // is called.<br>
+ return JITSymbol(<br>
+ [this, Addr, H]() {<br>
+ if (H->NeedsFinalization()) {<br>
+ H->Finalize();<br>
+ if (NotifyFinalized)<br>
+ NotifyFinalized(H);<br>
+ }<br>
+ return Addr;<br>
+ });<br>
}<br>
}<br>
+<br>
return nullptr;<br>
}<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h Mon Mar 9 19:33:27 2015<br>
@@ -14,7 +14,6 @@<br>
#ifndef LLVM_EXECUTIONENGINE_RUNTIMEDYLD_H<br>
#define LLVM_EXECUTIONENGINE_RUNTIMEDYLD_H<br>
<br>
-#include "JITSymbolFlags.h"<br>
#include "llvm/ADT/StringRef.h"<br>
#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"<br>
#include "llvm/Support/Memory.h"<br>
@@ -29,7 +28,7 @@ namespace object {<br>
<br>
class RuntimeDyldImpl;<br>
class RuntimeDyldCheckerImpl;<br>
-<br>
+<br>
class RuntimeDyld {<br>
friend class RuntimeDyldCheckerImpl;<br>
<br>
@@ -48,18 +47,6 @@ protected:<br>
void reassignSectionAddress(unsigned SectionID, uint64_t Addr);<br>
public:<br>
<br>
- /// \brief Information about a named symbol.<br>
- class SymbolInfo : public JITSymbolBase {<br>
- public:<br>
- SymbolInfo(std::nullptr_t) : JITSymbolBase(JITSymbolFlags::None), Address(0) {}<br>
- SymbolInfo(uint64_t Address, JITSymbolFlags Flags)<br>
- : JITSymbolBase(Flags), Address(Address) {}<br>
- explicit operator bool() const { return Address != 0; }<br>
- uint64_t getAddress() const { return Address; }<br>
- private:<br>
- uint64_t Address;<br>
- };<br>
-<br>
/// \brief Information about the loaded object.<br>
class LoadedObjectInfo {<br>
friend class RuntimeDyldImpl;<br>
@@ -92,11 +79,15 @@ public:<br>
/// Get the address of our local copy of the symbol. This may or may not<br>
/// be the address used for relocation (clients can copy the data around<br>
/// and resolve relocatons based on where they put it).<br>
- void *getSymbolLocalAddress(StringRef Name) const;<br>
+ void *getSymbolAddress(StringRef Name) const;<br>
<br>
- /// Get the target address and flags for the named symbol.<br>
- /// This address is the one used for relocation.<br>
- SymbolInfo getSymbol(StringRef Name) const;<br>
+ /// Get the address of the target copy of the symbol (works for both exported<br>
+ /// and non-exported symbols). This is the address used for relocation.<br>
+ uint64_t getSymbolLoadAddress(StringRef Name) const;<br>
+<br>
+ /// Get the address of the target copy of the symbol (works for exported<br>
+ /// symbols only). This is the address used for relocation.<br>
+ uint64_t getExportedSymbolLoadAddress(StringRef Name) const;<br>
<br>
/// Resolve the relocations for all symbols we currently know about.<br>
void resolveRelocations();<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h Mon Mar 9 19:33:27 2015<br>
@@ -86,12 +86,12 @@ public:<br>
/// \brief Returns the address of the requested section (or an error message<br>
/// in the second element of the pair if the address cannot be found).<br>
///<br>
- /// if 'LocalAddress' is true, this returns the address of the section<br>
- /// within the linker's memory. If 'LocalAddress' is false it returns the<br>
+ /// if 'LinkerAddress' is true, this returns the address of the section<br>
+ /// within the linker's memory. If 'LinkerAddress' is false it returns the<br>
/// address within the target process (i.e. the load address).<br>
std::pair<uint64_t, std::string> getSectionAddr(StringRef FileName,<br>
StringRef SectionName,<br>
- bool LocalAddress);<br>
+ bool LinkerAddress);<br>
<br>
private:<br>
std::unique_ptr<RuntimeDyldCheckerImpl> Impl;<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Mon Mar 9 19:33:27 2015<br>
@@ -257,7 +257,7 @@ uint64_t MCJIT::getExistingSymbolAddress<br>
Mangler Mang(TM->getDataLayout());<br>
SmallString<128> FullName;<br>
Mang.getNameWithPrefix(FullName, Name);<br>
- return Dyld.getSymbol(FullName).getAddress();<br>
+ return Dyld.getSymbolLoadAddress(FullName);<br>
}<br>
<br>
Module *MCJIT::findModuleForSymbol(const std::string &Name,<br>
@@ -383,7 +383,7 @@ void *MCJIT::getPointerToFunction(Functi<br>
//<br>
// This is the accessor for the target address, so make sure to check the<br>
// load address of the symbol, not the local address.<br>
- return (void*)Dyld.getSymbol(Name).getAddress();<br>
+ return (void*)Dyld.getSymbolLoadAddress(Name);<br>
}<br>
<br>
void MCJIT::runStaticConstructorsDestructorsInModulePtrSet(<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Mon Mar 9 19:33:27 2015<br>
@@ -197,13 +197,10 @@ RuntimeDyldImpl::loadObjectImpl(const ob<br>
<< " SID: " << SectionID << " Offset: "<br>
<< format("%p", (uintptr_t)SectOffset)<br>
<< " flags: " << Flags << "\n");<br>
- JITSymbolFlags RTDyldSymFlags = JITSymbolFlags::None;<br>
- if (Flags & SymbolRef::SF_Weak)<br>
- RTDyldSymFlags |= JITSymbolFlags::Weak;<br>
- if (Flags & SymbolRef::SF_Exported)<br>
- RTDyldSymFlags |= JITSymbolFlags::Exported;<br>
- GlobalSymbolTable[Name] =<br>
- SymbolTableEntry(SectionID, SectOffset, RTDyldSymFlags);<br>
+ SymbolInfo::Visibility Vis =<br>
+ (Flags & SymbolRef::SF_Exported) ?<br>
+ SymbolInfo::Default : SymbolInfo::Hidden;<br>
+ GlobalSymbolTable[Name] = SymbolInfo(SectionID, SectOffset, Vis);<br>
}<br>
}<br>
}<br>
@@ -528,15 +525,12 @@ void RuntimeDyldImpl::emitCommonSymbols(<br>
Offset += AlignOffset;<br>
}<br>
uint32_t Flags = Sym.getFlags();<br>
- JITSymbolFlags RTDyldSymFlags = JITSymbolFlags::None;<br>
- if (Flags & SymbolRef::SF_Weak)<br>
- RTDyldSymFlags |= JITSymbolFlags::Weak;<br>
- if (Flags & SymbolRef::SF_Exported)<br>
- RTDyldSymFlags |= JITSymbolFlags::Exported;<br>
+ SymbolInfo::Visibility Vis =<br>
+ (Flags & SymbolRef::SF_Exported) ?<br>
+ SymbolInfo::Default : SymbolInfo::Hidden;<br>
DEBUG(dbgs() << "Allocating common symbol " << Name << " address "<br>
<< format("%p", Addr) << "\n");<br>
- GlobalSymbolTable[Name] =<br>
- SymbolTableEntry(SectionID, Offset, RTDyldSymFlags);<br>
+ GlobalSymbolTable[Name] = SymbolInfo(SectionID, Offset, Vis);<br>
Offset += Size;<br>
Addr += Size;<br>
}<br>
@@ -900,16 +894,22 @@ RuntimeDyld::loadObject(const ObjectFile<br>
return Dyld->loadObject(Obj);<br>
}<br>
<br>
-void *RuntimeDyld::getSymbolLocalAddress(StringRef Name) const {<br>
+void *RuntimeDyld::getSymbolAddress(StringRef Name) const {<br>
if (!Dyld)<br>
return nullptr;<br>
- return Dyld->getSymbolLocalAddress(Name);<br>
+ return Dyld->getSymbolAddress(Name);<br>
}<br>
<br>
-RuntimeDyld::SymbolInfo RuntimeDyld::getSymbol(StringRef Name) const {<br>
+uint64_t RuntimeDyld::getSymbolLoadAddress(StringRef Name) const {<br>
if (!Dyld)<br>
- return nullptr;<br>
- return Dyld->getSymbol(Name);<br>
+ return 0;<br>
+ return Dyld->getSymbolLoadAddress(Name);<br>
+}<br>
+<br>
+uint64_t RuntimeDyld::getExportedSymbolLoadAddress(StringRef Name) const {<br>
+ if (!Dyld)<br>
+ return 0;<br>
+ return Dyld->getExportedSymbolLoadAddress(Name);<br>
}<br>
<br>
void RuntimeDyld::resolveRelocations() { Dyld->resolveRelocations(); }<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp Mon Mar 9 19:33:27 2015<br>
@@ -310,7 +310,7 @@ private:<br>
"");<br>
<br>
uint64_t SymbolAddr = PCtx.IsInsideLoad<br>
- ? Checker.getSymbolLocalAddr(Symbol)<br>
+ ? Checker.getSymbolLinkerAddr(Symbol)<br>
: Checker.getSymbolRemoteAddr(Symbol);<br>
uint64_t NextPC = SymbolAddr + InstSize;<br>
<br>
@@ -437,7 +437,7 @@ private:<br>
// The value for the symbol depends on the context we're evaluating in:<br>
// Inside a load this is the address in the linker's memory, outside a<br>
// load it's the address in the target processes memory.<br>
- uint64_t Value = PCtx.IsInsideLoad ? Checker.getSymbolLocalAddr(Symbol)<br>
+ uint64_t Value = PCtx.IsInsideLoad ? Checker.getSymbolLinkerAddr(Symbol)<br>
: Checker.getSymbolRemoteAddr(Symbol);<br>
<br>
// Looks like a plain symbol reference.<br>
@@ -727,17 +727,17 @@ bool RuntimeDyldCheckerImpl::checkAllRul<br>
}<br>
<br>
bool RuntimeDyldCheckerImpl::isSymbolValid(StringRef Symbol) const {<br>
- return getRTDyld().getSymbolLocalAddress(Symbol) != nullptr;<br>
+ return getRTDyld().getSymbolAddress(Symbol) != nullptr;<br>
}<br>
<br>
-uint64_t RuntimeDyldCheckerImpl::getSymbolLocalAddr(StringRef Symbol) const {<br>
+uint64_t RuntimeDyldCheckerImpl::getSymbolLinkerAddr(StringRef Symbol) const {<br>
return static_cast<uint64_t>(<br>
- reinterpret_cast<uintptr_t>(getRTDyld().getSymbolLocalAddress(Symbol)));<br>
+ reinterpret_cast<uintptr_t>(getRTDyld().getSymbolAddress(Symbol)));<br>
}<br>
<br>
uint64_t RuntimeDyldCheckerImpl::getSymbolRemoteAddr(StringRef Symbol) const {<br>
- if (auto InternalSymbol = getRTDyld().getSymbol(Symbol))<br>
- return InternalSymbol.getAddress();<br>
+ if (uint64_t InternalSymbolAddr = getRTDyld().getSymbolLoadAddress(Symbol))<br>
+ return InternalSymbolAddr;<br>
return getRTDyld().MemMgr->getSymbolAddress(Symbol);<br>
}<br>
<br>
@@ -929,6 +929,6 @@ bool RuntimeDyldChecker::checkAllRulesIn<br>
<br>
std::pair<uint64_t, std::string><br>
RuntimeDyldChecker::getSectionAddr(StringRef FileName, StringRef SectionName,<br>
- bool LocalAddress) {<br>
- return Impl->getSectionAddr(FileName, SectionName, LocalAddress);<br>
+ bool LinkerAddress) {<br>
+ return Impl->getSectionAddr(FileName, SectionName, LinkerAddress);<br>
}<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h Mon Mar 9 19:33:27 2015<br>
@@ -42,7 +42,7 @@ private:<br>
RuntimeDyldImpl &getRTDyld() const { return *RTDyld.Dyld; }<br>
<br>
bool isSymbolValid(StringRef Symbol) const;<br>
- uint64_t getSymbolLocalAddr(StringRef Symbol) const;<br>
+ uint64_t getSymbolLinkerAddr(StringRef Symbol) const;<br>
uint64_t getSymbolRemoteAddr(StringRef Symbol) const;<br>
uint64_t readMemoryAtAddr(uint64_t Addr, unsigned Size) const;<br>
<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h Mon Mar 9 19:33:27 2015<br>
@@ -164,24 +164,27 @@ public:<br>
}<br>
};<br>
<br>
-/// @brief Symbol info for RuntimeDyld.<br>
-class SymbolTableEntry : public JITSymbolBase {<br>
+/// @brief Symbol info for RuntimeDyld.<br>
+class SymbolInfo {<br>
public:<br>
- SymbolTableEntry()<br>
- : JITSymbolBase(JITSymbolFlags::None), Offset(0), SectionID(0) {}<br>
+ typedef enum { Hidden = 0, Default = 1 } Visibility;<br>
<br>
- SymbolTableEntry(unsigned SectionID, uint64_t Offset, JITSymbolFlags Flags)<br>
- : JITSymbolBase(Flags), Offset(Offset), SectionID(SectionID) {}<br>
+ SymbolInfo() : Offset(0), SectionID(0), Vis(Hidden) {}<br>
+<br>
+ SymbolInfo(unsigned SectionID, uint64_t Offset, Visibility Vis)<br>
+ : Offset(Offset), SectionID(SectionID), Vis(Vis) {}<br>
<br>
unsigned getSectionID() const { return SectionID; }<br>
uint64_t getOffset() const { return Offset; }<br>
+ Visibility getVisibility() const { return Vis; }<br>
<br>
private:<br>
uint64_t Offset;<br>
- unsigned SectionID;<br>
+ unsigned SectionID : 31;<br>
+ Visibility Vis : 1;<br>
};<br>
<br>
-typedef StringMap<SymbolTableEntry> RTDyldSymbolTable;<br>
+typedef StringMap<SymbolInfo> RTDyldSymbolTable;<br>
<br>
class RuntimeDyldImpl {<br>
friend class RuntimeDyld::LoadedObjectInfo;<br>
@@ -391,7 +394,7 @@ public:<br>
virtual std::unique_ptr<RuntimeDyld::LoadedObjectInfo><br>
loadObject(const object::ObjectFile &Obj) = 0;<br>
<br>
- uint8_t* getSymbolLocalAddress(StringRef Name) const {<br>
+ uint8_t* getSymbolAddress(StringRef Name) const {<br>
// FIXME: Just look up as a function for now. Overly simple of course.<br>
// Work in progress.<br>
RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);<br>
@@ -401,16 +404,24 @@ public:<br>
return getSectionAddress(SymInfo.getSectionID()) + SymInfo.getOffset();<br>
}<br>
<br>
- RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {<br>
+ uint64_t getSymbolLoadAddress(StringRef Name) const {<br>
// FIXME: Just look up as a function for now. Overly simple of course.<br>
// Work in progress.<br>
RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);<br>
if (pos == GlobalSymbolTable.end())<br>
- return nullptr;<br>
- const auto &SymEntry = pos->second;<br>
- uint64_t TargetAddr =<br>
- getSectionLoadAddress(SymEntry.getSectionID()) + SymEntry.getOffset();<br>
- return RuntimeDyld::SymbolInfo(TargetAddr, SymEntry.getFlags());<br>
+ return 0;<br>
+ const auto &SymInfo = pos->second;<br>
+ return getSectionLoadAddress(SymInfo.getSectionID()) + SymInfo.getOffset();<br>
+ }<br>
+<br>
+ uint64_t getExportedSymbolLoadAddress(StringRef Name) const {<br>
+ RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);<br>
+ if (pos == GlobalSymbolTable.end())<br>
+ return 0;<br>
+ const auto &SymInfo = pos->second;<br>
+ if (SymInfo.getVisibility() == SymbolInfo::Hidden)<br>
+ return 0;<br>
+ return getSectionLoadAddress(SymInfo.getSectionID()) + SymInfo.getOffset();<br>
}<br>
<br>
void resolveRelocations();<br>
<br>
Modified: llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp?rev=231731&r1=231730&r2=231731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp?rev=231731&r1=231730&r2=231731&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp (original)<br>
+++ llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp Mon Mar 9 19:33:27 2015<br>
@@ -298,7 +298,7 @@ static int executeInput() {<br>
// FIXME: Error out if there are unresolved relocations.<br>
<br>
// Get the address of the entry point (_main by default).<br>
- void *MainAddress = Dyld.getSymbolLocalAddress(EntryPoint);<br>
+ void *MainAddress = Dyld.getSymbolAddress(EntryPoint);<br>
if (!MainAddress)<br>
return Error("no definition for '" + EntryPoint + "'");<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>