<div dir="ltr">Hi Lang,<br><br>This was still breaking the build even after the header fix in 231726 so I've gone ahead and reverted for now.<div><br></div><div><a href="http://lab.llvm.org:8011/builders/lld-x86_64-freebsd/builds/10710">http://lab.llvm.org:8011/builders/lld-x86_64-freebsd/builds/10710</a><br></div><div><br></div><div>seems like a reasonable buildbot to look at :)</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote">On Mon, Mar 9, 2015 at 4:49 PM Lang Hames <<a href="mailto:lhames@gmail.com">lhames@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: lhames<br>
Date: Mon Mar 9 18:44:13 2015<br>
New Revision: 231724<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=231724&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=231724&view=rev</a><br>
Log:<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>
<br>
<br>
Modified:<br>
llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/JITSymbol.<u></u>h<br>
llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h<br>
llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h<br>
llvm/trunk/include/llvm/<u></u>ExecutionEngine/RuntimeDyld.h<br>
llvm/trunk/include/llvm/<u></u>ExecutionEngine/<u></u>RuntimeDyldChecker.h<br>
llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp<br>
llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp<br>
llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp<br>
llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h<br>
llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h<br>
llvm/trunk/tools/llvm-rtdyld/<u></u>llvm-rtdyld.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/JITSymbol.<u></u>h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/JITSymbol.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/Orc/<u></u>JITSymbol.h?rev=231724&r1=<u></u>231723&r2=231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/JITSymbol.<u></u>h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/JITSymbol.<u></u>h Mon Mar 9 18:44:13 2015<br>
@@ -14,6 +14,7 @@<br>
#ifndef LLVM_EXECUTIONENGINE_ORC_<u></u>JITSYMBOL_H<br>
#define LLVM_EXECUTIONENGINE_ORC_<u></u>JITSYMBOL_H<br>
<br>
+#include "llvm/ExecutionEngine/<u></u>JITSymbolFlags.h"<br>
#include "llvm/Support/DataTypes.h"<br>
#include <cassert><br>
#include <functional><br>
@@ -25,17 +26,19 @@ namespace orc {<br>
typedef uint64_t TargetAddress;<br>
<br>
/// @brief Represents a symbol in the JIT.<br>
-class JITSymbol {<br>
-public:<br>
+class JITSymbol : public JITSymbolBase {<br>
+public:<br>
+<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) : CachedAddr(0) {}<br>
+ JITSymbol(std::nullptr_t)<br>
+ : JITSymbolBase(JITSymbolFlags::<u></u>None), CachedAddr(0) {}<br>
<br>
/// @brief Create a symbol for a definition with a known address.<br>
- JITSymbol(TargetAddress Addr)<br>
- : CachedAddr(Addr) {}<br>
+ JITSymbol(TargetAddress Addr, JITSymbolFlags Flags)<br>
+ : JITSymbolBase(Flags), CachedAddr(Addr) {}<br>
<br>
/// @brief Create a symbol for a definition that doesn't have a known address<br>
/// yet.<br>
@@ -46,8 +49,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)<br>
- : CachedAddr(0), GetAddress(std::move(<u></u>GetAddress)) {}<br>
+ JITSymbol(GetAddressFtor GetAddress, JITSymbolFlags Flags)<br>
+ : JITSymbolBase(Flags), GetAddress(std::move(<u></u>GetAddress)), CachedAddr(0) {}<br>
<br>
/// @brief Returns true if the symbol exists, false otherwise.<br>
explicit operator bool() const { return CachedAddr || GetAddress; }<br>
@@ -64,8 +67,8 @@ public:<br>
}<br>
<br>
private:<br>
- TargetAddress CachedAddr;<br>
GetAddressFtor GetAddress;<br>
+ TargetAddress CachedAddr;<br>
};<br>
<br>
} // End namespace orc.<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>LazyEmittingLayer.h Mon Mar 9 18:44:13 2015<br>
@@ -45,23 +45,25 @@ private:<br>
JITSymbol find(StringRef Name, bool ExportedSymbolsOnly, BaseLayerT &B) {<br>
switch (EmitState) {<br>
case NotEmitted:<br>
- if (provides(Name, ExportedSymbolsOnly)) {<br>
+ if (auto GV = searchGVs(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>
- 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>
+ auto PName = Name;<br>
+ JITSymbolFlags Flags = JITSymbolBase::<u></u>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(<u></u>GetAddress), Flags);<br>
} else<br>
return nullptr;<br>
case Emitting:<br>
@@ -98,7 +100,8 @@ private:<br>
std::unique_ptr<<u></u>RTDyldMemoryManager> MM);<br>
<br>
protected:<br>
- virtual bool provides(StringRef Name, bool ExportedSymbolsOnly) const = 0;<br>
+ virtual const GlobalValue* searchGVs(StringRef Name,<br>
+ bool ExportedSymbolsOnly) const = 0;<br>
virtual BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) = 0;<br>
<br>
private:<br>
@@ -115,46 +118,48 @@ private:<br>
<br>
protected:<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>
- MangledNames.reset();<br>
- return BaseLayer.addModuleSet(std::<u></u>move(Ms), std::move(MM));<br>
- }<br>
-<br>
- bool provides(StringRef Name, bool ExportedSymbolsOnly) const override {<br>
+ const GlobalValue* searchGVs(StringRef Name,<br>
+ 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 (MangledNames) {<br>
- auto VI = MangledNames->find(Name);<br>
- if (VI == MangledNames->end())<br>
- return false;<br>
- return !ExportedSymbolsOnly || VI->second;<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>
}<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>
- buildMangledNames(Name, ExportedSymbolsOnly);<br>
- if (!MangledNames)<br>
- return true;<br>
- return false;<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::<u></u>move(Ms), std::move(MM));<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>
- // 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>
+ // 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>
// Modules don't "provide" decls or common symbols.<br>
if (GV.isDeclaration() || GV.hasCommonLinkage())<br>
- return false;<br>
+ return nullptr;<br>
<br>
// Mangle the GV name.<br>
std::string MangledName;<br>
@@ -167,39 +172,42 @@ private:<br>
// bail out early.<br>
if (MangledName == SearchName)<br>
if (!ExportedSymbolsOnly || GV.hasDefaultVisibility())<br>
- return true;<br>
+ return &GV;<br>
<br>
// Otherwise add this to the map for later.<br>
- Names[MangledName] = GV.hasDefaultVisibility();<br>
- return false;<br>
+ Names[MangledName] = &GV;<br>
+ return nullptr;<br>
}<br>
<br>
- // Build the MangledNames map. Bails out early (with MangledNames left set<br>
+ // Build the MangledSymbols map. Bails out early (with MangledSymbols left set<br>
// to nullptr) if the given SearchName is found while building the map.<br>
- void buildMangledNames(StringRef SearchName,<br>
- bool ExportedSymbolsOnly) const {<br>
- assert(!MangledNames && "Mangled names map already exists?");<br>
+ const GlobalValue* buildMangledSymbols(StringRef SearchName,<br>
+ bool ExportedSymbolsOnly) const {<br>
+ assert(!MangledSymbols && "Mangled symbols map already exists?");<br>
<br>
- auto Names = llvm::make_unique<StringMap<<u></u>bool>>();<br>
+ auto Symbols = llvm::make_unique<StringMap<<u></u>const GlobalValue*>>();<br>
<br>
for (const auto &M : Ms) {<br>
Mangler Mang(&M->getDataLayout());<br>
<br>
- for (const auto &GV : M->globals())<br>
- if (addGlobalValue(*Names, GV, Mang, SearchName, ExportedSymbolsOnly))<br>
- return;<br>
+ for (const auto &V : M->globals())<br>
+ if (auto GV = addGlobalValue(*Symbols, V, Mang, SearchName,<br>
+ ExportedSymbolsOnly))<br>
+ return GV;<br>
<br>
for (const auto &F : *M)<br>
- if (addGlobalValue(*Names, F, Mang, SearchName, ExportedSymbolsOnly))<br>
- return;<br>
+ if (auto GV = addGlobalValue(*Symbols, F, Mang, SearchName,<br>
+ ExportedSymbolsOnly))<br>
+ return GV;<br>
}<br>
<br>
- MangledNames = std::move(Names);<br>
+ MangledSymbols = std::move(Symbols);<br>
+ return nullptr;<br>
}<br>
<br>
ModuleSetT Ms;<br>
std::unique_ptr<<u></u>RTDyldMemoryManager> MM;<br>
- mutable std::unique_ptr<StringMap<<u></u>bool>> MangledNames;<br>
+ mutable std::unique_ptr<StringMap<<u></u>const GlobalValue*>> MangledSymbols;<br>
};<br>
<br>
typedef std::list<std::unique_ptr<<u></u>EmissionDeferredSet>> ModuleSetListT;<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/Orc/<u></u>ObjectLinkingLayer.h Mon Mar 9 18:44:13 2015<br>
@@ -51,10 +51,8 @@ protected:<br>
return RTDyld->loadObject(Obj);<br>
}<br>
<br>
- TargetAddress getSymbolAddress(StringRef Name, bool ExportedSymbolsOnly) {<br>
- if (ExportedSymbolsOnly)<br>
- return RTDyld-><u></u>getExportedSymbolLoadAddress(<u></u>Name);<br>
- return RTDyld->getSymbolLoadAddress(<u></u>Name);<br>
+ RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {<br>
+ return RTDyld->getSymbol(Name);<br>
}<br>
<br>
bool NeedsFinalization() const { return (State == Raw); }<br>
@@ -214,28 +212,32 @@ public:<br>
/// given object set.<br>
JITSymbol findSymbolIn(ObjSetHandleT H, StringRef Name,<br>
bool ExportedSymbolsOnly) {<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>
+ 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(<u></u>GetAddress), Flags);<br>
+ }<br>
}<br>
}<br>
-<br>
return nullptr;<br>
}<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/RuntimeDyld.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/<u></u>RuntimeDyld.h?rev=231724&r1=<u></u>231723&r2=231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/RuntimeDyld.h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/RuntimeDyld.h Mon Mar 9 18:44:13 2015<br>
@@ -14,6 +14,7 @@<br>
#ifndef LLVM_EXECUTIONENGINE_<u></u>RUNTIMEDYLD_H<br>
#define LLVM_EXECUTIONENGINE_<u></u>RUNTIMEDYLD_H<br>
<br>
+#include "JITSymbolFlags.h"<br>
#include "llvm/ADT/StringRef.h"<br>
#include "llvm/ExecutionEngine/<u></u>RTDyldMemoryManager.h"<br>
#include "llvm/Support/Memory.h"<br>
@@ -28,7 +29,7 @@ namespace object {<br>
<br>
class RuntimeDyldImpl;<br>
class RuntimeDyldCheckerImpl;<br>
-<br>
+<br>
class RuntimeDyld {<br>
friend class RuntimeDyldCheckerImpl;<br>
<br>
@@ -47,6 +48,18 @@ protected:<br>
void reassignSectionAddress(<u></u>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::<u></u>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>
@@ -79,15 +92,11 @@ 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 *getSymbolAddress(StringRef Name) const;<br>
+ void *getSymbolLocalAddress(<u></u>StringRef Name) const;<br>
<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(<u></u>StringRef Name) const;<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>
<br>
/// Resolve the relocations for all symbols we currently know about.<br>
void resolveRelocations();<br>
<br>
Modified: llvm/trunk/include/llvm/<u></u>ExecutionEngine/<u></u>RuntimeDyldChecker.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/ExecutionEngine/<u></u>RuntimeDyldChecker.h?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/include/llvm/<u></u>ExecutionEngine/<u></u>RuntimeDyldChecker.h (original)<br>
+++ llvm/trunk/include/llvm/<u></u>ExecutionEngine/<u></u>RuntimeDyldChecker.h Mon Mar 9 18:44:13 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 'LinkerAddress' is true, this returns the address of the section<br>
- /// within the linker's memory. If 'LinkerAddress' is false it returns the<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>
/// 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 LinkerAddress);<br>
+ bool LocalAddress);<br>
<br>
private:<br>
std::unique_ptr<<u></u>RuntimeDyldCheckerImpl> Impl;<br>
<br>
Modified: llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp?rev=231724&r1=231723&r2=<u></u>231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/MCJIT/MCJIT.<u></u>cpp Mon Mar 9 18:44:13 2015<br>
@@ -257,7 +257,7 @@ uint64_t MCJIT::<u></u>getExistingSymbolAddress<br>
Mangler Mang(TM->getDataLayout());<br>
SmallString<128> FullName;<br>
Mang.getNameWithPrefix(<u></u>FullName, Name);<br>
- return Dyld.getSymbolLoadAddress(<u></u>FullName);<br>
+ return Dyld.getSymbol(FullName).<u></u>getAddress();<br>
}<br>
<br>
Module *MCJIT::findModuleForSymbol(<u></u>const std::string &Name,<br>
@@ -383,7 +383,7 @@ void *MCJIT::getPointerToFunction(<u></u>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.<u></u>getSymbolLoadAddress(Name);<br>
+ return (void*)Dyld.getSymbol(Name).<u></u>getAddress();<br>
}<br>
<br>
void MCJIT::<u></u>runStaticConstructorsDestructo<u></u>rsInModulePtrSet(<br>
<br>
Modified: llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp?rev=231724&r1=<u></u>231723&r2=231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyld.cpp Mon Mar 9 18:44:13 2015<br>
@@ -197,10 +197,13 @@ RuntimeDyldImpl::<u></u>loadObjectImpl(const ob<br>
<< " SID: " << SectionID << " Offset: "<br>
<< format("%p", (uintptr_t)SectOffset)<br>
<< " flags: " << Flags << "\n");<br>
- SymbolInfo::Visibility Vis =<br>
- (Flags & SymbolRef::SF_Exported) ?<br>
- SymbolInfo::Default : SymbolInfo::Hidden;<br>
- GlobalSymbolTable[Name] = SymbolInfo(SectionID, SectOffset, Vis);<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>
}<br>
}<br>
}<br>
@@ -525,12 +528,15 @@ void RuntimeDyldImpl::<u></u>emitCommonSymbols(<br>
Offset += AlignOffset;<br>
}<br>
uint32_t Flags = Sym.getFlags();<br>
- SymbolInfo::Visibility Vis =<br>
- (Flags & SymbolRef::SF_Exported) ?<br>
- SymbolInfo::Default : SymbolInfo::Hidden;<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>
DEBUG(dbgs() << "Allocating common symbol " << Name << " address "<br>
<< format("%p", Addr) << "\n");<br>
- GlobalSymbolTable[Name] = SymbolInfo(SectionID, Offset, Vis);<br>
+ GlobalSymbolTable[Name] =<br>
+ SymbolTableEntry(SectionID, Offset, RTDyldSymFlags);<br>
Offset += Size;<br>
Addr += Size;<br>
}<br>
@@ -894,22 +900,16 @@ RuntimeDyld::loadObject(const ObjectFile<br>
return Dyld->loadObject(Obj);<br>
}<br>
<br>
-void *RuntimeDyld::<u></u>getSymbolAddress(StringRef Name) const {<br>
+void *RuntimeDyld::<u></u>getSymbolLocalAddress(<u></u>StringRef Name) const {<br>
if (!Dyld)<br>
return nullptr;<br>
- return Dyld->getSymbolAddress(Name);<br>
+ return Dyld->getSymbolLocalAddress(<u></u>Name);<br>
}<br>
<br>
-uint64_t RuntimeDyld::<u></u>getSymbolLoadAddress(StringRef Name) const {<br>
+RuntimeDyld::SymbolInfo RuntimeDyld::getSymbol(<u></u>StringRef Name) const {<br>
if (!Dyld)<br>
- return 0;<br>
- return Dyld->getSymbolLoadAddress(<u></u>Name);<br>
-}<br>
-<br>
-uint64_t RuntimeDyld::<u></u>getExportedSymbolLoadAddress(<u></u>StringRef Name) const {<br>
- if (!Dyld)<br>
- return 0;<br>
- return Dyld-><u></u>getExportedSymbolLoadAddress(<u></u>Name);<br>
+ return nullptr;<br>
+ return Dyld->getSymbol(Name);<br>
}<br>
<br>
void RuntimeDyld::<u></u>resolveRelocations() { Dyld->resolveRelocations(); }<br>
<br>
Modified: llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldChecker.cpp Mon Mar 9 18:44:13 2015<br>
@@ -310,7 +310,7 @@ private:<br>
"");<br>
<br>
uint64_t SymbolAddr = PCtx.IsInsideLoad<br>
- ? Checker.getSymbolLinkerAddr(<u></u>Symbol)<br>
+ ? Checker.getSymbolLocalAddr(<u></u>Symbol)<br>
: Checker.getSymbolRemoteAddr(<u></u>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.getSymbolLinkerAddr(<u></u>Symbol)<br>
+ uint64_t Value = PCtx.IsInsideLoad ? Checker.getSymbolLocalAddr(<u></u>Symbol)<br>
: Checker.getSymbolRemoteAddr(<u></u>Symbol);<br>
<br>
// Looks like a plain symbol reference.<br>
@@ -727,17 +727,17 @@ bool RuntimeDyldCheckerImpl::<u></u>checkAllRul<br>
}<br>
<br>
bool RuntimeDyldCheckerImpl::<u></u>isSymbolValid(StringRef Symbol) const {<br>
- return getRTDyld().getSymbolAddress(<u></u>Symbol) != nullptr;<br>
+ return getRTDyld().<u></u>getSymbolLocalAddress(Symbol) != nullptr;<br>
}<br>
<br>
-uint64_t RuntimeDyldCheckerImpl::<u></u>getSymbolLinkerAddr(StringRef Symbol) const {<br>
+uint64_t RuntimeDyldCheckerImpl::<u></u>getSymbolLocalAddr(StringRef Symbol) const {<br>
return static_cast<uint64_t>(<br>
- reinterpret_cast<uintptr_t>(<u></u>getRTDyld().getSymbolAddress(<u></u>Symbol)));<br>
+ reinterpret_cast<uintptr_t>(<u></u>getRTDyld().<u></u>getSymbolLocalAddress(Symbol))<u></u>);<br>
}<br>
<br>
uint64_t RuntimeDyldCheckerImpl::<u></u>getSymbolRemoteAddr(StringRef Symbol) const {<br>
- if (uint64_t InternalSymbolAddr = getRTDyld().<u></u>getSymbolLoadAddress(Symbol))<br>
- return InternalSymbolAddr;<br>
+ if (auto InternalSymbol = getRTDyld().getSymbol(Symbol))<br>
+ return InternalSymbol.getAddress();<br>
return getRTDyld().MemMgr-><u></u>getSymbolAddress(Symbol);<br>
}<br>
<br>
@@ -929,6 +929,6 @@ bool RuntimeDyldChecker::<u></u>checkAllRulesIn<br>
<br>
std::pair<uint64_t, std::string><br>
RuntimeDyldChecker::<u></u>getSectionAddr(StringRef FileName, StringRef SectionName,<br>
- bool LinkerAddress) {<br>
- return Impl->getSectionAddr(FileName, SectionName, LinkerAddress);<br>
+ bool LocalAddress) {<br>
+ return Impl->getSectionAddr(FileName, SectionName, LocalAddress);<br>
}<br>
<br>
Modified: llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldCheckerImpl.h Mon Mar 9 18:44:13 2015<br>
@@ -42,7 +42,7 @@ private:<br>
RuntimeDyldImpl &getRTDyld() const { return *RTDyld.Dyld; }<br>
<br>
bool isSymbolValid(StringRef Symbol) const;<br>
- uint64_t getSymbolLinkerAddr(StringRef Symbol) const;<br>
+ uint64_t getSymbolLocalAddr(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/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h?rev=231724&<u></u>r1=231723&r2=231724&view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h (original)<br>
+++ llvm/trunk/lib/<u></u>ExecutionEngine/RuntimeDyld/<u></u>RuntimeDyldImpl.h Mon Mar 9 18:44:13 2015<br>
@@ -164,27 +164,24 @@ public:<br>
}<br>
};<br>
<br>
-/// @brief Symbol info for RuntimeDyld.<br>
-class SymbolInfo {<br>
+/// @brief Symbol info for RuntimeDyld.<br>
+class SymbolTableEntry : public JITSymbolBase {<br>
public:<br>
- typedef enum { Hidden = 0, Default = 1 } Visibility;<br>
+ SymbolTableEntry()<br>
+ : JITSymbolBase(JITSymbolFlags::<u></u>None), Offset(0), SectionID(0) {}<br>
<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>
+ SymbolTableEntry(unsigned SectionID, uint64_t Offset, JITSymbolFlags Flags)<br>
+ : JITSymbolBase(Flags), Offset(Offset), SectionID(SectionID) {}<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 : 31;<br>
- Visibility Vis : 1;<br>
+ unsigned SectionID;<br>
};<br>
<br>
-typedef StringMap<SymbolInfo> RTDyldSymbolTable;<br>
+typedef StringMap<SymbolTableEntry> RTDyldSymbolTable;<br>
<br>
class RuntimeDyldImpl {<br>
friend class RuntimeDyld::LoadedObjectInfo;<br>
@@ -394,7 +391,7 @@ public:<br>
virtual std::unique_ptr<RuntimeDyld::<u></u>LoadedObjectInfo><br>
loadObject(const object::ObjectFile &Obj) = 0;<br>
<br>
- uint8_t* getSymbolAddress(StringRef Name) const {<br>
+ uint8_t* getSymbolLocalAddress(<u></u>StringRef Name) const {<br>
// FIXME: Just look up as a function for now. Overly simple of course.<br>
// Work in progress.<br>
RTDyldSymbolTable::const_<u></u>iterator pos = GlobalSymbolTable.find(Name);<br>
@@ -404,24 +401,16 @@ public:<br>
return getSectionAddress(SymInfo.<u></u>getSectionID()) + SymInfo.getOffset();<br>
}<br>
<br>
- uint64_t getSymbolLoadAddress(StringRef Name) const {<br>
+ RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {<br>
// FIXME: Just look up as a function for now. Overly simple of course.<br>
// Work in progress.<br>
RTDyldSymbolTable::const_<u></u>iterator pos = GlobalSymbolTable.find(Name);<br>
if (pos == GlobalSymbolTable.end())<br>
- return 0;<br>
- const auto &SymInfo = pos->second;<br>
- return getSectionLoadAddress(SymInfo.<u></u>getSectionID()) + SymInfo.getOffset();<br>
- }<br>
-<br>
- uint64_t getExportedSymbolLoadAddress(<u></u>StringRef Name) const {<br>
- RTDyldSymbolTable::const_<u></u>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.<u></u>getSectionID()) + SymInfo.getOffset();<br>
+ return nullptr;<br>
+ const auto &SymEntry = pos->second;<br>
+ uint64_t TargetAddr =<br>
+ getSectionLoadAddress(<u></u>SymEntry.getSectionID()) + SymEntry.getOffset();<br>
+ return RuntimeDyld::SymbolInfo(<u></u>TargetAddr, SymEntry.getFlags());<br>
}<br>
<br>
void resolveRelocations();<br>
<br>
Modified: llvm/trunk/tools/llvm-rtdyld/<u></u>llvm-rtdyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp?rev=231724&r1=231723&r2=231724&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/tools/llvm-<u></u>rtdyld/llvm-rtdyld.cpp?rev=<u></u>231724&r1=231723&r2=231724&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- llvm/trunk/tools/llvm-rtdyld/<u></u>llvm-rtdyld.cpp (original)<br>
+++ llvm/trunk/tools/llvm-rtdyld/<u></u>llvm-rtdyld.cpp Mon Mar 9 18:44:13 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.getSymbolAddress(<u></u>EntryPoint);<br>
+ void *MainAddress = Dyld.getSymbolLocalAddress(<u></u>EntryPoint);<br>
if (!MainAddress)<br>
return Error("no definition for '" + EntryPoint + "'");<br>
<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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/<u></u>mailman/listinfo/llvm-commits</a><br>
</blockquote></div>