diff options
Diffstat (limited to 'lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp')
| -rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp | 85 | 
1 files changed, 59 insertions, 26 deletions
diff --git a/lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp b/lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp index 18eb0e4619210..0553c217c2a23 100644 --- a/lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp @@ -12,8 +12,10 @@  //===----------------------------------------------------------------------===//  #include "llvm/ExecutionEngine/JITSymbol.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/GlobalAlias.h"  #include "llvm/IR/GlobalValue.h" -#include "llvm/Object/SymbolicFile.h" +#include "llvm/Object/ObjectFile.h"  using namespace llvm; @@ -25,11 +27,18 @@ JITSymbolFlags llvm::JITSymbolFlags::fromGlobalValue(const GlobalValue &GV) {      Flags |= JITSymbolFlags::Common;    if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())      Flags |= JITSymbolFlags::Exported; + +  if (isa<Function>(GV)) +    Flags |= JITSymbolFlags::Callable; +  else if (isa<GlobalAlias>(GV) && +           isa<Function>(cast<GlobalAlias>(GV).getAliasee())) +    Flags |= JITSymbolFlags::Callable; +    return Flags;  } -JITSymbolFlags -llvm::JITSymbolFlags::fromObjectSymbol(const object::BasicSymbolRef &Symbol) { +Expected<JITSymbolFlags> +llvm::JITSymbolFlags::fromObjectSymbol(const object::SymbolRef &Symbol) {    JITSymbolFlags Flags = JITSymbolFlags::None;    if (Symbol.getFlags() & object::BasicSymbolRef::SF_Weak)      Flags |= JITSymbolFlags::Weak; @@ -37,11 +46,19 @@ llvm::JITSymbolFlags::fromObjectSymbol(const object::BasicSymbolRef &Symbol) {      Flags |= JITSymbolFlags::Common;    if (Symbol.getFlags() & object::BasicSymbolRef::SF_Exported)      Flags |= JITSymbolFlags::Exported; + +  auto SymbolType = Symbol.getType(); +  if (!SymbolType) +    return SymbolType.takeError(); + +  if (*SymbolType & object::SymbolRef::ST_Function) +    Flags |= JITSymbolFlags::Callable; +    return Flags;  } -ARMJITSymbolFlags llvm::ARMJITSymbolFlags::fromObjectSymbol( -                                         const object::BasicSymbolRef &Symbol) { +ARMJITSymbolFlags +llvm::ARMJITSymbolFlags::fromObjectSymbol(const object::SymbolRef &Symbol) {    ARMJITSymbolFlags Flags;    if (Symbol.getFlags() & object::BasicSymbolRef::SF_Thumb)      Flags |= ARMJITSymbolFlags::Thumb; @@ -51,48 +68,64 @@ ARMJITSymbolFlags llvm::ARMJITSymbolFlags::fromObjectSymbol(  /// Performs lookup by, for each symbol, first calling  ///        findSymbolInLogicalDylib and if that fails calling  ///        findSymbol. -Expected<JITSymbolResolver::LookupResult> -LegacyJITSymbolResolver::lookup(const LookupSet &Symbols) { +void LegacyJITSymbolResolver::lookup(const LookupSet &Symbols, +                                     OnResolvedFunction OnResolved) {    JITSymbolResolver::LookupResult Result;    for (auto &Symbol : Symbols) {      std::string SymName = Symbol.str();      if (auto Sym = findSymbolInLogicalDylib(SymName)) {        if (auto AddrOrErr = Sym.getAddress())          Result[Symbol] = JITEvaluatedSymbol(*AddrOrErr, Sym.getFlags()); -      else -        return AddrOrErr.takeError(); -    } else if (auto Err = Sym.takeError()) -      return std::move(Err); -    else { +      else { +        OnResolved(AddrOrErr.takeError()); +        return; +      } +    } else if (auto Err = Sym.takeError()) { +      OnResolved(std::move(Err)); +      return; +    } else {        // findSymbolInLogicalDylib failed. Lets try findSymbol.        if (auto Sym = findSymbol(SymName)) {          if (auto AddrOrErr = Sym.getAddress())            Result[Symbol] = JITEvaluatedSymbol(*AddrOrErr, Sym.getFlags()); -        else -          return AddrOrErr.takeError(); -      } else if (auto Err = Sym.takeError()) -        return std::move(Err); -      else -        return make_error<StringError>("Symbol not found: " + Symbol, -                                       inconvertibleErrorCode()); +        else { +          OnResolved(AddrOrErr.takeError()); +          return; +        } +      } else if (auto Err = Sym.takeError()) { +        OnResolved(std::move(Err)); +        return; +      } else { +        OnResolved(make_error<StringError>("Symbol not found: " + Symbol, +                                           inconvertibleErrorCode())); +        return; +      }      }    } -  return std::move(Result); +  OnResolved(std::move(Result));  }  /// Performs flags lookup by calling findSymbolInLogicalDylib and  ///        returning the flags value for that symbol. -Expected<JITSymbolResolver::LookupFlagsResult> -LegacyJITSymbolResolver::lookupFlags(const LookupSet &Symbols) { -  JITSymbolResolver::LookupFlagsResult Result; +Expected<JITSymbolResolver::LookupSet> +LegacyJITSymbolResolver::getResponsibilitySet(const LookupSet &Symbols) { +  JITSymbolResolver::LookupSet Result;    for (auto &Symbol : Symbols) {      std::string SymName = Symbol.str(); -    if (auto Sym = findSymbolInLogicalDylib(SymName)) -      Result[Symbol] = Sym.getFlags(); -    else if (auto Err = Sym.takeError()) +    if (auto Sym = findSymbolInLogicalDylib(SymName)) { +      // If there's an existing def but it is not strong, then the caller is +      // responsible for it. +      if (!Sym.getFlags().isStrong()) +        Result.insert(Symbol); +    } else if (auto Err = Sym.takeError())        return std::move(Err); +    else { +      // If there is no existing definition then the caller is responsible for +      // it. +      Result.insert(Symbol); +    }    }    return std::move(Result);  | 
