<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p>If I'm reading this correctly, the bot is running an invalid test/binary.</p>
<p>The <span style="font-size: 13.333333015441895px;"><span style="font-size: 11pt;">DynamicLibrary</span> </span><span style="font-size: 12pt;">test was added in the original commit and is passing on the bot as of </span><b><span style="color: rgb(51, 51, 51); font-family: Verdana, sans-serif; font-size: 11pt; text-align: center;">r</span><span style="color: rgb(51, 51, 51); font-family: Verdana, sans-serif; font-size: 11pt; text-align: center;">30</span></b><span style="color: rgb(51, 51, 51); font-family: Verdana, sans-serif; font-size: 11pt; text-align: center;"><b>1238</b></span></p>
<p><a href="http://lab.llvm.org:8011/builders/clang-ppc64le-linux-multistage/builds/2052/steps/ninja%20check%201/logs/stdio" class="OWAAutoLink" id="LPlnk903791" previewremoved="true">http://lab.llvm.org:8011/builders/clang-ppc64le-linux-multistage/builds/2052/steps/ninja%20check%201/logs/stdio</a><span style="font-size: 12pt;"><br>
</span></p>
<p><br>
</p>
<p>After the reversion the binary sticks around, but the changes that allow the test to pass are gone.</p>
<p><br>
</p>
<div style="color: rgb(0, 0, 0);">
<div>
<hr style="display:inline-block; width:98%" tabindex="-1">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Bill Seurer <seurer@linux.vnet.ibm.com><br>
<b>Sent:</b> Tuesday, April 25, 2017 8:00 PM<br>
<b>To:</b> Frederich Munch; llvm-commits@lists.llvm.org<br>
<b>Subject:</b> Re: [llvm] r301240 - Revert "Refactor DynamicLibrary so searching for a symbol will have a defined order"</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt;">
<div class="PlainText">It looks like this revision may be causing a test case failure on
<br>
ppc64le: <br>
<a href="http://lab.llvm.org:8011/builders/clang-ppc64le-linux-multistage/builds/2053" id="LPlnk67310" previewremoved="true">http://lab.llvm.org:8011/builders/clang-ppc64le-linux-multistage/builds/2053</a><br>
<br>
******************** TEST 'LLVM-Unit :: <br>
Support/DynamicLibrary/DynamicLibraryTests/DynamicLibrary.Shutdown' <br>
FAILED ********************<br>
Note: Google Test filter = DynamicLibrary.Shutdown<br>
[==========] Running 1 test from 1 test case.<br>
[----------] Global test environment set-up.<br>
[----------] 1 test from DynamicLibrary<br>
[ RUN      ] DynamicLibrary.Shutdown<br>
/home/buildbots/ppc64le-clang-multistage-test/clang-ppc64le-multistage/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp:117:
<br>
Failure<br>
       Expected: A<br>
       Which is: ""<br>
To be equal to: "Global::~Global"<br>
/home/buildbots/ppc64le-clang-multistage-test/clang-ppc64le-multistage/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp:118:
<br>
Failure<br>
       Expected: B<br>
       Which is: "Local::Local"<br>
To be equal to: "Local::~Local"<br>
[  FAILED  ] DynamicLibrary.Shutdown (11 ms)<br>
[----------] 1 test from DynamicLibrary (11 ms total)<br>
<br>
[----------] Global test environment tear-down<br>
[==========] 1 test from 1 test case ran. (11 ms total)<br>
[  PASSED  ] 0 tests.<br>
[  FAILED  ] 1 test, listed below:<br>
[  FAILED  ] DynamicLibrary.Shutdown<br>
<br>
  1 FAILED TEST<br>
<br>
<br>
I haven't been able to reproduce this on another machine, though.<br>
<br>
On 04/24/2017 03:16 PM, Frederich Munch via llvm-commits wrote:<br>
> Author: marsupial<br>
> Date: Mon Apr 24 15:16:01 2017<br>
> New Revision: 301240<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=301240&view=rev" id="LPlnk212583" previewremoved="true">
http://llvm.org/viewvc/llvm-project?rev=301240&view=rev</a><br>
> Log:<br>
> Revert "Refactor DynamicLibrary so searching for a symbol will have a defined order"<br>
> The i686-mingw32-RA-on-linux bot is still having errors.<br>
><br>
> This reverts commit r301236.<br>
><br>
> Added:<br>
>     llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp<br>
> Removed:<br>
>     llvm/trunk/lib/Support/Unix/DynamicLibrary.inc<br>
>     llvm/trunk/unittests/Support/DynamicLibrary/CMakeLists.txt<br>
>     llvm/trunk/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
>     llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.cxx<br>
>     llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.h<br>
> Modified:<br>
>     llvm/trunk/include/llvm/Support/DynamicLibrary.h<br>
>     llvm/trunk/lib/Support/CMakeLists.txt<br>
>     llvm/trunk/lib/Support/DynamicLibrary.cpp<br>
>     llvm/trunk/lib/Support/Windows/DynamicLibrary.inc<br>
>     llvm/trunk/unittests/Support/CMakeLists.txt<br>
><br>
> Modified: llvm/trunk/include/llvm/Support/DynamicLibrary.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DynamicLibrary.h?rev=301240&r1=301239&r2=301240&view=diff" id="LPlnk7766" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DynamicLibrary.h?rev=301240&r1=301239&r2=301240&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/Support/DynamicLibrary.h (original)<br>
> +++ llvm/trunk/include/llvm/Support/DynamicLibrary.h Mon Apr 24 15:16:01 2017<br>
> @@ -58,7 +58,7 @@ namespace sys {<br>
>      void *getAddressOfSymbol(const char *symbolName);<br>
><br>
>      /// This function permanently loads the dynamic library at the given path.<br>
> -    /// The library will only be unloaded when llvm_shutdown() is called.<br>
> +    /// The library will only be unloaded when the program terminates.<br>
>      /// This returns a valid DynamicLibrary instance on success and an invalid<br>
>      /// instance on failure (see isValid()). \p *errMsg will only be modified<br>
>      /// if the library fails to load.<br>
> @@ -71,8 +71,7 @@ namespace sys {<br>
>      /// Registers an externally loaded library. The library will be unloaded<br>
>      /// when the program terminates.<br>
>      ///<br>
> -    /// It is safe to call this function multiple times for the same library,<br>
> -    /// though ownership is only taken if there was no error.<br>
> +    /// It is safe to call this function multiple times for the same library.<br>
>      ///<br>
>      /// \returns An empty \p DynamicLibrary if the library was already loaded.<br>
>      static DynamicLibrary addPermanentLibrary(void *handle,<br>
> @@ -107,8 +106,6 @@ namespace sys {<br>
>      /// libraries.<br>
>      /// @brief Add searchable symbol/value pair.<br>
>      static void AddSymbol(StringRef symbolName, void *symbolValue);<br>
> -<br>
> -    class HandleSet;<br>
>    };<br>
><br>
>  } // End sys namespace<br>
><br>
> Modified: llvm/trunk/lib/Support/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CMakeLists.txt?rev=301240&r1=301239&r2=301240&view=diff" id="LPlnk41546" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CMakeLists.txt?rev=301240&r1=301239&r2=301240&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Support/CMakeLists.txt (original)<br>
> +++ llvm/trunk/lib/Support/CMakeLists.txt Mon Apr 24 15:16:01 2017<br>
> @@ -130,6 +130,7 @@ add_llvm_library(LLVMSupport<br>
>    Process.cpp<br>
>    Program.cpp<br>
>    RWMutex.cpp<br>
> +  SearchForAddressOfSpecialSymbol.cpp<br>
>    Signals.cpp<br>
>    TargetRegistry.cpp<br>
>    ThreadLocal.cpp<br>
><br>
> Modified: llvm/trunk/lib/Support/DynamicLibrary.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/DynamicLibrary.cpp?rev=301240&r1=301239&r2=301240&view=diff" id="LPlnk289821" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/DynamicLibrary.cpp?rev=301240&r1=301239&r2=301240&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Support/DynamicLibrary.cpp (original)<br>
> +++ llvm/trunk/lib/Support/DynamicLibrary.cpp Mon Apr 24 15:16:01 2017<br>
> @@ -20,164 +20,169 @@<br>
>  #include "llvm/Support/Mutex.h"<br>
>  #include <cstdio><br>
>  #include <cstring><br>
> -#include <vector><br>
><br>
> -using namespace llvm;<br>
> -using namespace llvm::sys;<br>
> +// Collection of symbol name/value pairs to be searched prior to any libraries.<br>
> +static llvm::ManagedStatic<llvm::StringMap<void *> > ExplicitSymbols;<br>
> +static llvm::ManagedStatic<llvm::sys::SmartMutex<true> > SymbolsMutex;<br>
><br>
> -// All methods for HandleSet should be used holding SymbolsMutex.<br>
> -class DynamicLibrary::HandleSet {<br>
> -  typedef std::vector<void *> HandleList;<br>
> -  HandleList Handles;<br>
> -  void *Process;<br>
> +void llvm::sys::DynamicLibrary::AddSymbol(StringRef symbolName,<br>
> +                                          void *symbolValue) {<br>
> +  SmartScopedLock<true> lock(*SymbolsMutex);<br>
> +  (*ExplicitSymbols)[symbolName] = symbolValue;<br>
> +}<br>
><br>
> -public:<br>
> -  static void *DLOpen(const char *Filename, std::string *Err);<br>
> -  static void DLClose(void *Handle);<br>
> -  static void *DLSym(void *Handle, const char *Symbol);<br>
> +char llvm::sys::DynamicLibrary::Invalid = 0;<br>
><br>
> -  HandleSet() : Process(nullptr) {}<br>
> -  ~HandleSet();<br>
> +#ifdef LLVM_ON_WIN32<br>
><br>
> -  HandleList::iterator Find(void *Handle) {<br>
> -    return std::find(Handles.begin(), Handles.end(), Handle);<br>
> -  }<br>
> +#include "Windows/DynamicLibrary.inc"<br>
> +<br>
> +#else<br>
><br>
> -  bool Contains(void *Handle) {<br>
> -    return Handle == Process || Find(Handle) != Handles.end();<br>
> +#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)<br>
> +#include <dlfcn.h><br>
> +using namespace llvm;<br>
> +using namespace llvm::sys;<br>
> +<br>
> +//===----------------------------------------------------------------------===//<br>
> +//=== WARNING: Implementation here must contain only TRULY operating system<br>
> +//===          independent code.<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +static llvm::ManagedStatic<DenseSet<void *> > OpenedHandles;<br>
> +<br>
> +DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename,<br>
> +                                                   std::string *errMsg) {<br>
> +  SmartScopedLock<true> lock(*SymbolsMutex);<br>
> +<br>
> +  void *handle = dlopen(filename, RTLD_LAZY|RTLD_GLOBAL);<br>
> +  if (!handle) {<br>
> +    if (errMsg) *errMsg = dlerror();<br>
> +    return DynamicLibrary();<br>
>    }<br>
><br>
> -  bool AddLibrary(void *Handle, bool IsProcess = false, bool CanClose = true) {<br>
> -#ifdef LLVM_ON_WIN32<br>
> -    assert((Handle == this ? IsProcess : !IsProcess) && "Bad Handle.");<br>
> +#ifdef __CYGWIN__<br>
> +  // Cygwin searches symbols only in the main<br>
> +  // with the handle of dlopen(NULL, RTLD_GLOBAL).<br>
> +  if (!filename)<br>
> +    handle = RTLD_DEFAULT;<br>
>  #endif<br>
><br>
> -    if (LLVM_LIKELY(!IsProcess)) {<br>
> -      if (Find(Handle) != Handles.end()) {<br>
> -        if (CanClose)<br>
> -          DLClose(Handle);<br>
> -        return false;<br>
> -      }<br>
> -      Handles.push_back(Handle);<br>
> -    } else {<br>
> -#ifndef LLVM_ON_WIN32<br>
> -      if (Process) {<br>
> -        if (CanClose)<br>
> -          DLClose(Process);<br>
> -        if (Process == Handle)<br>
> -          return false;<br>
> -      }<br>
> -#endif<br>
> -      Process = Handle;<br>
> -    }<br>
> -    return true;<br>
> -  }<br>
> +  // If we've already loaded this library, dlclose() the handle in order to<br>
> +  // keep the internal refcount at +1.<br>
> +  if (!OpenedHandles->insert(handle).second)<br>
> +    dlclose(handle);<br>
><br>
> -  void *Lookup(const char *Symbol) {<br>
> -    // Process handle gets first try.<br>
> -    if (Process) {<br>
> -      if (void *Ptr = DLSym(Process, Symbol))<br>
> -        return Ptr;<br>
> -#ifndef NDEBUG<br>
> -      for (void *Handle : Handles)<br>
> -        assert(!DLSym(Handle, Symbol) && "Symbol exists in non process handle");<br>
> -#endif<br>
> -    } else {<br>
> -      // Iterate in reverse, so newer libraries/symbols override older.<br>
> -      for (auto &&I = Handles.rbegin(), E = Handles.rend(); I != E; ++I) {<br>
> -        if (void *Ptr = DLSym(*I, Symbol))<br>
> -          return Ptr;<br>
> -      }<br>
> -    }<br>
> -    return nullptr;<br>
> +  return DynamicLibrary(handle);<br>
> +}<br>
> +<br>
> +DynamicLibrary DynamicLibrary::addPermanentLibrary(void *handle,<br>
> +                                                   std::string *errMsg) {<br>
> +  SmartScopedLock<true> lock(*SymbolsMutex);<br>
> +  // If we've already loaded this library, tell the caller.<br>
> +  if (!OpenedHandles->insert(handle).second) {<br>
> +    if (errMsg) *errMsg = "Library already loaded";<br>
> +    return DynamicLibrary();<br>
>    }<br>
> -};<br>
><br>
> -namespace {<br>
> -// Collection of symbol name/value pairs to be searched prior to any libraries.<br>
> -static llvm::ManagedStatic<llvm::StringMap<void *>> ExplicitSymbols;<br>
> -// Collection of known library handles.<br>
> -static llvm::ManagedStatic<DynamicLibrary::HandleSet> OpenedHandles;<br>
> -// Lock for ExplicitSymbols and OpenedHandles.<br>
> -static llvm::ManagedStatic<llvm::sys::SmartMutex<true>> SymbolsMutex;<br>
> +  return DynamicLibrary(handle);<br>
>  }<br>
><br>
> -#ifdef LLVM_ON_WIN32<br>
> -<br>
> -#include "Windows/DynamicLibrary.inc"<br>
> +void *DynamicLibrary::getAddressOfSymbol(const char *symbolName) {<br>
> +  if (!isValid())<br>
> +    return nullptr;<br>
> +  return dlsym(Data, symbolName);<br>
> +}<br>
><br>
>  #else<br>
><br>
> -#include "Unix/DynamicLibrary.inc"<br>
> -<br>
> -#endif<br>
> -<br>
> -char DynamicLibrary::Invalid;<br>
> +using namespace llvm;<br>
> +using namespace llvm::sys;<br>
><br>
> -namespace llvm {<br>
> -void *SearchForAddressOfSpecialSymbol(const char *SymbolName) {<br>
> -  return DoSearch(SymbolName); // DynamicLibrary.inc<br>
> -}<br>
> +DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename,<br>
> +                                                   std::string *errMsg) {<br>
> +  if (errMsg) *errMsg = "dlopen() not supported on this platform";<br>
> +  return DynamicLibrary();<br>
>  }<br>
><br>
> -void DynamicLibrary::AddSymbol(StringRef SymbolName, void *SymbolValue) {<br>
> -  SmartScopedLock<true> Lock(*SymbolsMutex);<br>
> -  (*ExplicitSymbols)[SymbolName] = SymbolValue;<br>
> +void *DynamicLibrary::getAddressOfSymbol(const char *symbolName) {<br>
> +  return NULL;<br>
>  }<br>
><br>
> -DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *FileName,<br>
> -                                                   std::string *Err) {<br>
> -  SmartScopedLock<true> Lock(*SymbolsMutex);<br>
> -  void *Handle = HandleSet::DLOpen(FileName, Err);<br>
> -  if (Handle != &Invalid)<br>
> -    OpenedHandles->AddLibrary(Handle, /*IsProcess*/ FileName == nullptr);<br>
> +#endif<br>
><br>
> -  return DynamicLibrary(Handle);<br>
> +namespace llvm {<br>
> +void *SearchForAddressOfSpecialSymbol(const char* symbolName);<br>
>  }<br>
><br>
> -DynamicLibrary DynamicLibrary::addPermanentLibrary(void *Handle,<br>
> -                                                   std::string *Err) {<br>
> +void* DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) {<br>
>    SmartScopedLock<true> Lock(*SymbolsMutex);<br>
> -  // If we've already loaded this library, tell the caller.<br>
> -  if (!OpenedHandles->AddLibrary(Handle, /*IsProcess*/false, /*CanClose*/false))<br>
> -    *Err = "Library already loaded";<br>
> -<br>
> -  return DynamicLibrary(Handle);<br>
> -}<br>
> -<br>
> -void *DynamicLibrary::getAddressOfSymbol(const char *SymbolName) {<br>
> -  if (!isValid())<br>
> -    return nullptr;<br>
> -  return HandleSet::DLSym(Data, SymbolName);<br>
> -}<br>
><br>
> -void *DynamicLibrary::SearchForAddressOfSymbol(const char *SymbolName) {<br>
> -  {<br>
> -    SmartScopedLock<true> Lock(*SymbolsMutex);<br>
> +  // First check symbols added via AddSymbol().<br>
> +  if (ExplicitSymbols.isConstructed()) {<br>
> +    StringMap<void *>::iterator i = ExplicitSymbols->find(symbolName);<br>
><br>
> -    // First check symbols added via AddSymbol().<br>
> -    if (ExplicitSymbols.isConstructed()) {<br>
> -      StringMap<void *>::iterator i = ExplicitSymbols->find(SymbolName);<br>
> +    if (i != ExplicitSymbols->end())<br>
> +      return i->second;<br>
> +  }<br>
><br>
> -      if (i != ExplicitSymbols->end())<br>
> -        return i->second;<br>
> +#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)<br>
> +  // Now search the libraries.<br>
> +  if (OpenedHandles.isConstructed()) {<br>
> +    for (DenseSet<void *>::iterator I = OpenedHandles->begin(),<br>
> +         E = OpenedHandles->end(); I != E; ++I) {<br>
> +      //lt_ptr ptr = lt_dlsym(*I, symbolName);<br>
> +      void *ptr = dlsym(*I, symbolName);<br>
> +      if (ptr) {<br>
> +        return ptr;<br>
> +      }<br>
>      }<br>
> +  }<br>
> +#endif<br>
><br>
> -    // Now search the libraries.<br>
> -    if (OpenedHandles.isConstructed()) {<br>
> -      if (void *Ptr = OpenedHandles->Lookup(SymbolName))<br>
> -        return Ptr;<br>
> -    }<br>
> +  if (void *Result = llvm::SearchForAddressOfSpecialSymbol(symbolName))<br>
> +    return Result;<br>
> +<br>
> +// This macro returns the address of a well-known, explicit symbol<br>
> +#define EXPLICIT_SYMBOL(SYM) \<br>
> +   if (!strcmp(symbolName, #SYM)) return &SYM<br>
> +<br>
> +// On linux we have a weird situation. The stderr/out/in symbols are both<br>
> +// macros and global variables because of standards requirements. So, we<br>
> +// boldly use the EXPLICIT_SYMBOL macro without checking for a #define first.<br>
> +#if defined(__linux__) and !defined(__ANDROID__)<br>
> +  {<br>
> +    EXPLICIT_SYMBOL(stderr);<br>
> +    EXPLICIT_SYMBOL(stdout);<br>
> +    EXPLICIT_SYMBOL(stdin);<br>
>    }<br>
> +#else<br>
> +  // For everything else, we want to check to make sure the symbol isn't defined<br>
> +  // as a macro before using EXPLICIT_SYMBOL.<br>
> +  {<br>
> +#ifndef stdin<br>
> +    EXPLICIT_SYMBOL(stdin);<br>
> +#endif<br>
> +#ifndef stdout<br>
> +    EXPLICIT_SYMBOL(stdout);<br>
> +#endif<br>
> +#ifndef stderr<br>
> +    EXPLICIT_SYMBOL(stderr);<br>
> +#endif<br>
> +  }<br>
> +#endif<br>
> +#undef EXPLICIT_SYMBOL<br>
><br>
> -  return llvm::SearchForAddressOfSpecialSymbol(SymbolName);<br>
> +  return nullptr;<br>
>  }<br>
><br>
> +#endif // LLVM_ON_WIN32<br>
> +<br>
>  //===----------------------------------------------------------------------===//<br>
>  // C API.<br>
>  //===----------------------------------------------------------------------===//<br>
><br>
> -LLVMBool LLVMLoadLibraryPermanently(const char *Filename) {<br>
> +LLVMBool LLVMLoadLibraryPermanently(const char* Filename) {<br>
>    return llvm::sys::DynamicLibrary::LoadLibraryPermanently(Filename);<br>
>  }<br>
><br>
><br>
> Added: llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp?rev=301240&view=auto" id="LPlnk305634" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp?rev=301240&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp (added)<br>
> +++ llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp Mon Apr 24 15:16:01 2017<br>
> @@ -0,0 +1,58 @@<br>
> +//===- SearchForAddressOfSpecialSymbol.cpp - Function addresses -*- 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>
> +//  This file pulls the addresses of certain symbols out of the linker.  It must<br>
> +//  include as few header files as possible because it declares the symbols as<br>
> +//  void*, which would conflict with the actual symbol type if any header<br>
> +//  declared it.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#include <string.h><br>
> +<br>
> +// Must declare the symbols in the global namespace.<br>
> +static void *DoSearch(const char* symbolName) {<br>
> +#define EXPLICIT_SYMBOL(SYM) \<br>
> +   extern void *SYM; if (!strcmp(symbolName, #SYM)) return &SYM<br>
> +<br>
> +  // If this is darwin, it has some funky issues, try to solve them here.  Some<br>
> +  // important symbols are marked 'private external' which doesn't allow<br>
> +  // SearchForAddressOfSymbol to find them.  As such, we special case them here,<br>
> +  // there is only a small handful of them.<br>
> +<br>
> +#ifdef __APPLE__<br>
> +  {<br>
> +    // __eprintf is sometimes used for assert() handling on x86.<br>
> +    //<br>
> +    // FIXME: Currently disabled when using Clang, as we don't always have our<br>
> +    // runtime support libraries available.<br>
> +#ifndef __clang__<br>
> +#ifdef __i386__<br>
> +    EXPLICIT_SYMBOL(__eprintf);<br>
> +#endif<br>
> +#endif<br>
> +  }<br>
> +#endif<br>
> +<br>
> +#ifdef __CYGWIN__<br>
> +  {<br>
> +    EXPLICIT_SYMBOL(_alloca);<br>
> +    EXPLICIT_SYMBOL(__main);<br>
> +  }<br>
> +#endif<br>
> +<br>
> +#undef EXPLICIT_SYMBOL<br>
> +  return nullptr;<br>
> +}<br>
> +<br>
> +namespace llvm {<br>
> +void *SearchForAddressOfSpecialSymbol(const char* symbolName) {<br>
> +  return DoSearch(symbolName);<br>
> +}<br>
> +}  // namespace llvm<br>
><br>
> Removed: llvm/trunk/lib/Support/Unix/DynamicLibrary.inc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/DynamicLibrary.inc?rev=301239&view=auto" id="LPlnk109311" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/DynamicLibrary.inc?rev=301239&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Support/Unix/DynamicLibrary.inc (original)<br>
> +++ llvm/trunk/lib/Support/Unix/DynamicLibrary.inc (removed)<br>
> @@ -1,131 +0,0 @@<br>
> -//===- Unix/DynamicLibrary.cpp - Unix DL Implementation ---------*- 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>
> -// This file provides the UNIX specific implementation of DynamicLibrary.<br>
> -//<br>
> -//===----------------------------------------------------------------------===//<br>
> -<br>
> -#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)<br>
> -#include <dlfcn.h><br>
> -<br>
> -DynamicLibrary::HandleSet::~HandleSet() {<br>
> -  for (void *Handle : Handles)<br>
> -    ::dlclose(Handle);<br>
> -  if (Process)<br>
> -    ::dlclose(Process);<br>
> -}<br>
> -<br>
> -void *DynamicLibrary::HandleSet::DLOpen(const char *File, std::string *Err) {<br>
> -  void *Handle = ::dlopen(File, RTLD_LAZY|RTLD_GLOBAL);<br>
> -  if (!Handle) {<br>
> -    if (Err) *Err = ::dlerror();<br>
> -    return &DynamicLibrary::Invalid;<br>
> -  }<br>
> -<br>
> -#ifdef __CYGWIN__<br>
> -  // Cygwin searches symbols only in the main<br>
> -  // with the handle of dlopen(NULL, RTLD_GLOBAL).<br>
> -  if (!Filename)<br>
> -    Handle = RTLD_DEFAULT;<br>
> -#endif<br>
> -<br>
> -  return Handle;<br>
> -}<br>
> -<br>
> -void DynamicLibrary::HandleSet::DLClose(void *Handle) {<br>
> -  ::dlclose(Handle);<br>
> -}<br>
> -<br>
> -void *DynamicLibrary::HandleSet::DLSym(void *Handle, const char *Symbol) {<br>
> -  return ::dlsym(Handle, Symbol);<br>
> -}<br>
> -<br>
> -#else // !HAVE_DLOPEN<br>
> -<br>
> -DynamicLibrary::HandleSet::~HandleSet() {}<br>
> -<br>
> -void *DynamicLibrary::HandleSet::DLOpen(const char *File, std::string *Err) {<br>
> -  if (Err) *Err = "dlopen() not supported on this platform";<br>
> -  return &Invalid;<br>
> -}<br>
> -<br>
> -void DynamicLibrary::HandleSet::DLClose(void *Handle) {<br>
> -}<br>
> -<br>
> -void *DynamicLibrary::HandleSet::DLSym(void *Handle, const char *Symbol) {<br>
> -  return nullptr;<br>
> -}<br>
> -<br>
> -#endif<br>
> -<br>
> -// Must declare the symbols in the global namespace.<br>
> -static void *DoSearch(const char* SymbolName) {<br>
> -#define EXPLICIT_SYMBOL(SYM) \<br>
> -   extern void *SYM; if (!strcmp(SymbolName, #SYM)) return &SYM<br>
> -<br>
> -  // If this is darwin, it has some funky issues, try to solve them here.  Some<br>
> -  // important symbols are marked 'private external' which doesn't allow<br>
> -  // SearchForAddressOfSymbol to find them.  As such, we special case them here,<br>
> -  // there is only a small handful of them.<br>
> -<br>
> -#ifdef __APPLE__<br>
> -  {<br>
> -    // __eprintf is sometimes used for assert() handling on x86.<br>
> -    //<br>
> -    // FIXME: Currently disabled when using Clang, as we don't always have our<br>
> -    // runtime support libraries available.<br>
> -#ifndef __clang__<br>
> -#ifdef __i386__<br>
> -    EXPLICIT_SYMBOL(__eprintf);<br>
> -#endif<br>
> -#endif<br>
> -  }<br>
> -#endif<br>
> -<br>
> -#ifdef __CYGWIN__<br>
> -  {<br>
> -    EXPLICIT_SYMBOL(_alloca);<br>
> -    EXPLICIT_SYMBOL(__main);<br>
> -  }<br>
> -#endif<br>
> -<br>
> -#undef EXPLICIT_SYMBOL<br>
> -<br>
> -// This macro returns the address of a well-known, explicit symbol<br>
> -#define EXPLICIT_SYMBOL(SYM) \<br>
> -   if (!strcmp(SymbolName, #SYM)) return &SYM<br>
> -<br>
> -// On linux we have a weird situation. The stderr/out/in symbols are both<br>
> -// macros and global variables because of standards requirements. So, we<br>
> -// boldly use the EXPLICIT_SYMBOL macro without checking for a #define first.<br>
> -#if defined(__linux__) and !defined(__ANDROID__)<br>
> -  {<br>
> -    EXPLICIT_SYMBOL(stderr);<br>
> -    EXPLICIT_SYMBOL(stdout);<br>
> -    EXPLICIT_SYMBOL(stdin);<br>
> -  }<br>
> -#else<br>
> -  // For everything else, we want to check to make sure the symbol isn't defined<br>
> -  // as a macro before using EXPLICIT_SYMBOL.<br>
> -  {<br>
> -#ifndef stdin<br>
> -    EXPLICIT_SYMBOL(stdin);<br>
> -#endif<br>
> -#ifndef stdout<br>
> -    EXPLICIT_SYMBOL(stdout);<br>
> -#endif<br>
> -#ifndef stderr<br>
> -    EXPLICIT_SYMBOL(stderr);<br>
> -#endif<br>
> -  }<br>
> -#endif<br>
> -#undef EXPLICIT_SYMBOL<br>
> -<br>
> -  return nullptr;<br>
> -}<br>
><br>
> Modified: llvm/trunk/lib/Support/Windows/DynamicLibrary.inc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/DynamicLibrary.inc?rev=301240&r1=301239&r2=301240&view=diff" id="LPlnk377219" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/DynamicLibrary.inc?rev=301240&r1=301239&r2=301240&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Support/Windows/DynamicLibrary.inc (original)<br>
> +++ llvm/trunk/lib/Support/Windows/DynamicLibrary.inc Mon Apr 24 15:16:01 2017<br>
> @@ -12,139 +12,97 @@<br>
>  //===----------------------------------------------------------------------===//<br>
><br>
>  #include "WindowsSupport.h"<br>
> -#include "llvm/Support/raw_ostream.h"<br>
><br>
> -#include <Psapi.h><br>
> +#ifdef __MINGW32__<br>
> + #include <imagehlp.h><br>
> +#else<br>
> + #include <dbghelp.h><br>
> +#endif<br>
> +<br>
> +#ifdef _MSC_VER<br>
> + #include <ntverp.h><br>
> +#endif<br>
> +<br>
> +namespace llvm {<br>
><br>
>  //===----------------------------------------------------------------------===//<br>
>  //=== WARNING: Implementation here must contain only Win32 specific code<br>
>  //===          and must not be UNIX code.<br>
>  //===----------------------------------------------------------------------===//<br>
><br>
> +typedef BOOL (WINAPI *fpEnumerateLoadedModules)(HANDLE,PENUMLOADED_MODULES_CALLBACK64,PVOID);<br>
> +static fpEnumerateLoadedModules fEnumerateLoadedModules;<br>
> +static llvm::ManagedStatic<DenseSet<HMODULE> > OpenedHandles;<br>
> +<br>
> +static bool loadDebugHelp(void) {<br>
> +  HMODULE hLib = ::LoadLibraryW(L"Dbghelp.dll");<br>
> +  if (hLib) {<br>
> +    fEnumerateLoadedModules = (fpEnumerateLoadedModules)<br>
> +      ::GetProcAddress(hLib, "EnumerateLoadedModules64");<br>
> +  }<br>
> +  return fEnumerateLoadedModules != 0;<br>
> +}<br>
><br>
> -DynamicLibrary::HandleSet::~HandleSet() {<br>
> -  for (void *Handle : Handles)<br>
> -    FreeLibrary(HMODULE(Handle));<br>
> -<br>
> -  // 'Process' should not be released on Windows.<br>
> -  assert((!Process || Process==this) && "Bad Handle");<br>
> -}<br>
> -<br>
> -void *DynamicLibrary::HandleSet::DLOpen(const char *File, std::string *Err) {<br>
> -  // Create the instance and return it to be the *Process* handle<br>
> -  // simillar to dlopen(NULL, RTLD_LAZY|RTLD_GLOBAL)<br>
> -  if (!File)<br>
> -    return &(*OpenedHandles);<br>
> +static BOOL CALLBACK<br>
> +ELM_Callback(PCSTR ModuleName, DWORD64 ModuleBase,<br>
> +             ULONG ModuleSize, PVOID UserContext) {<br>
> +  OpenedHandles->insert((HMODULE)ModuleBase);<br>
> +  return TRUE;<br>
> +}<br>
> +<br>
> +sys::DynamicLibrary<br>
> +sys::DynamicLibrary::getPermanentLibrary(const char *filename,<br>
> +                                         std::string *errMsg) {<br>
> +  SmartScopedLock<true> lock(*SymbolsMutex);<br>
> +<br>
> +  if (!filename) {<br>
> +    // When no file is specified, enumerate all DLLs and EXEs in the process.<br>
> +    if (!fEnumerateLoadedModules) {<br>
> +      if (!loadDebugHelp()) {<br>
> +        assert(false && "These APIs should always be available");<br>
> +        return DynamicLibrary();<br>
> +      }<br>
> +    }<br>
><br>
> -  SmallVector<wchar_t, MAX_PATH> FileUnicode;<br>
> -  if (std::error_code ec = windows::UTF8ToUTF16(File, FileUnicode)) {<br>
> -    SetLastError(ec.value());<br>
> -    MakeErrMsg(Err, std::string(File) + ": Can't convert to UTF-16");<br>
> -    return &DynamicLibrary::Invalid;<br>
> +    fEnumerateLoadedModules(GetCurrentProcess(), ELM_Callback, 0);<br>
> +    // Dummy library that represents "search all handles".<br>
> +    // This is mostly to ensure that the return value still shows up as "valid".<br>
> +    return DynamicLibrary(&OpenedHandles);<br>
>    }<br>
><br>
> -  HMODULE Handle = LoadLibraryW(FileUnicode.data());<br>
> -  if (Handle == NULL) {<br>
> -    MakeErrMsg(Err, std::string(File) + ": Can't open");<br>
> -    return &DynamicLibrary::Invalid;<br>
> +  SmallVector<wchar_t, MAX_PATH> filenameUnicode;<br>
> +  if (std::error_code ec = windows::UTF8ToUTF16(filename, filenameUnicode)) {<br>
> +    SetLastError(ec.value());<br>
> +    MakeErrMsg(errMsg, std::string(filename) + ": Can't convert to UTF-16");<br>
> +    return DynamicLibrary();<br>
>    }<br>
><br>
> -  return reinterpret_cast<void*>(Handle);<br>
> -}<br>
> +  HMODULE a_handle = LoadLibraryW(filenameUnicode.data());<br>
><br>
> -static DynamicLibrary::HandleSet *IsOpenedHandlesInstance(void *Handle) {<br>
> -  if (!OpenedHandles.isConstructed())<br>
> -    return nullptr;<br>
> -  DynamicLibrary::HandleSet &Inst = *OpenedHandles;<br>
> -  return Handle == &Inst ? &Inst : nullptr;<br>
> -}<br>
> +  if (a_handle == 0) {<br>
> +    MakeErrMsg(errMsg, std::string(filename) + ": Can't open");<br>
> +    return DynamicLibrary();<br>
> +  }<br>
><br>
> -void DynamicLibrary::HandleSet::DLClose(void *Handle) {<br>
> -  if (HandleSet* HS = IsOpenedHandlesInstance(Handle))<br>
> -    HS->Process = nullptr; // Just drop the *Process* handle.<br>
> -  else<br>
> -    FreeLibrary((HMODULE)Handle);<br>
> +  // If we've already loaded this library, FreeLibrary() the handle in order to<br>
> +  // keep the internal refcount at +1.<br>
> +  if (!OpenedHandles->insert(a_handle).second)<br>
> +    FreeLibrary(a_handle);<br>
> +<br>
> +  return DynamicLibrary(a_handle);<br>
>  }<br>
><br>
> -static bool GetProcessModules(HANDLE H, DWORD &Bytes, HMODULE *Data = nullptr) {<br>
> -  // EnumProcessModules will fail on Windows 64 while MingW-32 doesn't have<br>
> -  // EnumProcessModulesEx.<br>
> -  if (<br>
> -#ifdef _WIN64<br>
> -      !EnumProcessModulesEx(H, Data, Bytes, &Bytes, LIST_MODULES_64BIT)<br>
> -#else<br>
> -      !EnumProcessModules(H, Data, Bytes, &Bytes)<br>
> -#endif<br>
> -     ) {<br>
> -    std::string Err;<br>
> -    if (MakeErrMsg(&Err, "EnumProcessModules failure"))<br>
> -      llvm::errs() << Err << "\n";<br>
> -    return false;<br>
> -  }<br>
> -  return true;<br>
> -}<br>
> -<br>
> -void *DynamicLibrary::HandleSet::DLSym(void *Handle, const char *Symbol) {<br>
> -  HandleSet* HS = IsOpenedHandlesInstance(Handle);<br>
> -  if (!HS)<br>
> -    return (void *)uintptr_t(GetProcAddress((HMODULE)Handle, Symbol));<br>
> -<br>
> -  // Could have done a dlclose on the *Process* handle<br>
> -  if (!HS->Process)<br>
> -    return nullptr;<br>
> -<br>
> -  // Trials indicate EnumProcessModulesEx is consistantly faster than using<br>
> -  // EnumerateLoadedModules64 or CreateToolhelp32Snapshot.<br>
> -  //<br>
> -  // | Handles | DbgHelp.dll | CreateSnapshot | EnumProcessModulesEx<br>
> -  // |=========|=============|========================================<br>
> -  // | 37      | 0.0000585 * | 0.0003031      | 0.0000152<br>
> -  // | 1020    | 0.0026310 * | 0.0121598      | 0.0002683<br>
> -  // | 2084    | 0.0149418 * | 0.0369936      | 0.0005610<br>
> -  //<br>
> -  // * Not including the load time of Dbghelp.dll (~.005 sec)<br>
> -  //<br>
> -  // There's still a case to somehow cache the result of EnumProcessModulesEx<br>
> -  // across invocations, but the complication of doing that properly...<br>
> -  // Possibly using LdrRegisterDllNotification to invalidate the cache?<br>
> -<br>
> -  DWORD Bytes = 0;<br>
> -  HMODULE Self = HMODULE(GetCurrentProcess());<br>
> -  if (!GetProcessModules(Self, Bytes))<br>
> -    return nullptr;<br>
> -<br>
> -  // Get the most recent list in case any modules added/removed between calls<br>
> -  // to EnumProcessModulesEx that gets the amount of, then copies the HMODULES.<br>
> -  // MSDN is pretty clear that if the module list changes during the call to<br>
> -  // EnumProcessModulesEx the results should not be used.<br>
> -  std::vector<HMODULE> Handles;<br>
> -  do {<br>
> -    assert(Bytes && ((Bytes % sizeof(HMODULE)) == 0) &&<br>
> -           "Should have at least one module and be aligned");<br>
> -    Handles.resize(Bytes / sizeof(HMODULE));<br>
> -    if (!GetProcessModules(Self, Bytes, Handles.data()))<br>
> -      return nullptr;<br>
> -  } while (Bytes != (Handles.size() * sizeof(HMODULE)));<br>
> -<br>
> -  // Try EXE first, mirroring what dlsym(dlopen(NULL)) does.<br>
> -  if (FARPROC Ptr = GetProcAddress(HMODULE(Handles.front()), Symbol))<br>
> -    return (void *) uintptr_t(Ptr);<br>
> -<br>
> -  if (Handles.size() > 1) {<br>
> -    // This is different behaviour than what Posix dlsym(dlopen(NULL)) does.<br>
> -    // Doing that here is causing real problems for the JIT where msvc.dll<br>
> -    // and ucrt.dll can define the same symbols. The runtime linker will choose<br>
> -    // symbols from ucrt.dll first, but iterating NOT in reverse here would<br>
> -    // mean that the msvc.dll versions would be returned.<br>
> -<br>
> -    for (auto I = Handles.rbegin(), E = Handles.rend()-1; I != E; ++I) {<br>
> -      if (FARPROC Ptr = GetProcAddress(HMODULE(*I), Symbol))<br>
> -        return (void *) uintptr_t(Ptr);<br>
> -    }<br>
> +sys::DynamicLibrary<br>
> +sys::DynamicLibrary::addPermanentLibrary(void *handle, std::string *errMsg) {<br>
> +  SmartScopedLock<true> lock(*SymbolsMutex);<br>
> +  // If we've already loaded this library, tell the caller.<br>
> +  if (!OpenedHandles->insert((HMODULE)handle).second) {<br>
> +    MakeErrMsg(errMsg, "Library already loaded");<br>
> +    return DynamicLibrary();<br>
>    }<br>
> -  return nullptr;<br>
> -}<br>
><br>
> +  return DynamicLibrary(handle);<br>
> +}<br>
><br>
>  // Stack probing routines are in the support library (e.g. libgcc), but we don't<br>
>  // have dynamic linking on windows. Provide a hook.<br>
> @@ -171,18 +129,38 @@ void *DynamicLibrary::HandleSet::DLSym(v<br>
>  #undef INLINE_DEF_SYMBOL1<br>
>  #undef INLINE_DEF_SYMBOL2<br>
><br>
> -static void *DoSearch(const char *SymbolName) {<br>
> +void *sys::DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) {<br>
> +  SmartScopedLock<true> Lock(*SymbolsMutex);<br>
> +<br>
> +  // First check symbols added via AddSymbol().<br>
> +  if (ExplicitSymbols.isConstructed()) {<br>
> +    StringMap<void *>::iterator i = ExplicitSymbols->find(symbolName);<br>
> +<br>
> +    if (i != ExplicitSymbols->end())<br>
> +      return i->second;<br>
> +  }<br>
> +<br>
> +  // Now search the libraries.<br>
> +  if (OpenedHandles.isConstructed()) {<br>
> +    for (DenseSet<HMODULE>::iterator I = OpenedHandles->begin(),<br>
> +         E = OpenedHandles->end(); I != E; ++I) {<br>
> +      FARPROC ptr = GetProcAddress((HMODULE)*I, symbolName);<br>
> +      if (ptr) {<br>
> +        return (void *)(intptr_t)ptr;<br>
> +      }<br>
> +    }<br>
> +  }<br>
><br>
>  #define EXPLICIT_SYMBOL(SYM)                                                   \<br>
> -  if (!strcmp(SymbolName, #SYM))                                               \<br>
> +  if (!strcmp(symbolName, #SYM))                                               \<br>
>      return (void *)&SYM;<br>
>  #define EXPLICIT_SYMBOL2(SYMFROM, SYMTO)                                       \<br>
> -  if (!strcmp(SymbolName, #SYMFROM))                                           \<br>
> +  if (!strcmp(symbolName, #SYMFROM))                                           \<br>
>      return (void *)&SYMTO;<br>
><br>
>  #ifdef _M_IX86<br>
>  #define INLINE_DEF_SYMBOL1(TYP, SYM)                                           \<br>
> -  if (!strcmp(SymbolName, #SYM))                                               \<br>
> +  if (!strcmp(symbolName, #SYM))                                               \<br>
>      return (void *)&inline_##SYM;<br>
>  #define INLINE_DEF_SYMBOL2(TYP, SYM) INLINE_DEF_SYMBOL1(TYP, SYM)<br>
>  #endif<br>
> @@ -196,5 +174,15 @@ static void *DoSearch(const char *Symbol<br>
>  #undef INLINE_DEF_SYMBOL1<br>
>  #undef INLINE_DEF_SYMBOL2<br>
><br>
> -  return nullptr;<br>
> +  return 0;<br>
> +}<br>
> +<br>
> +void *sys::DynamicLibrary::getAddressOfSymbol(const char *symbolName) {<br>
> +  if (!isValid())<br>
> +    return NULL;<br>
> +  if (Data == &OpenedHandles)<br>
> +    return SearchForAddressOfSymbol(symbolName);<br>
> +  return (void *)(intptr_t)GetProcAddress((HMODULE)Data, symbolName);<br>
> +}<br>
> +<br>
>  }<br>
><br>
> Modified: llvm/trunk/unittests/Support/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/CMakeLists.txt?rev=301240&r1=301239&r2=301240&view=diff" id="LPlnk686387" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/CMakeLists.txt?rev=301240&r1=301239&r2=301240&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/unittests/Support/CMakeLists.txt (original)<br>
> +++ llvm/trunk/unittests/Support/CMakeLists.txt Mon Apr 24 15:16:01 2017<br>
> @@ -67,5 +67,3 @@ add_llvm_unittest(SupportTests<br>
><br>
>  # ManagedStatic.cpp uses <pthread>.<br>
>  target_link_libraries(SupportTests ${LLVM_PTHREAD_LIB})<br>
> -<br>
> -add_subdirectory(DynamicLibrary)<br>
><br>
> Removed: llvm/trunk/unittests/Support/DynamicLibrary/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/DynamicLibrary/CMakeLists.txt?rev=301239&view=auto" id="LPlnk158399" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/DynamicLibrary/CMakeLists.txt?rev=301239&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/unittests/Support/DynamicLibrary/CMakeLists.txt (original)<br>
> +++ llvm/trunk/unittests/Support/DynamicLibrary/CMakeLists.txt (removed)<br>
> @@ -1,19 +0,0 @@<br>
> -set(LLVM_LINK_COMPONENTS Support)<br>
> -<br>
> -add_llvm_unittest(DynamicLibraryTests DynamicLibraryTest.cpp)<br>
> -<br>
> -export_executable_symbols(DynamicLibraryTests)<br>
> -<br>
> -add_library(PipSqueak SHARED PipSqueak.cxx)<br>
> -<br>
> -set_output_directory(PipSqueak<br>
> -  BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}<br>
> -  LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}<br>
> -  )<br>
> -<br>
> -set_target_properties(PipSqueak<br>
> -  PROPERTIES PREFIX ""<br>
> -  SUFFIX ".so"<br>
> -  )<br>
> -<br>
> -add_dependencies(DynamicLibraryTests PipSqueak)<br>
><br>
> Removed: llvm/trunk/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp?rev=301239&view=auto" id="LPlnk422039" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp?rev=301239&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp (original)<br>
> +++ llvm/trunk/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp (removed)<br>
> @@ -1,133 +0,0 @@<br>
> -//===- llvm/unittest/Support/DynamicLibrary/DynamicLibraryTest.cpp --------===//<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>
> -#include "llvm/Config/config.h"<br>
> -#include "llvm/Support/DynamicLibrary.h"<br>
> -#include "llvm/Support/FileSystem.h"<br>
> -#include "llvm/Support/ManagedStatic.h"<br>
> -#include "llvm/Support/Path.h"<br>
> -#include "gtest/gtest.h"<br>
> -<br>
> -#include "PipSqueak.h"<br>
> -#include <string><br>
> -<br>
> -using namespace llvm;<br>
> -using namespace llvm::sys;<br>
> -<br>
> -extern "C" PIPSQUEAK_EXPORT const char *TestA() { return "ProcessCall"; }<br>
> -<br>
> -std::string LibPath() {<br>
> -  std::string Path =<br>
> -      fs::getMainExecutable("DynamicLibraryTests", (void *)&TestA);<br>
> -  llvm::SmallString<256> Buf(path::parent_path(Path));<br>
> -  path::append(Buf, "PipSqueak.so");<br>
> -  return Buf.str();<br>
> -}<br>
> -<br>
> -#if defined(_WIN32) || (defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN))<br>
> -<br>
> -typedef void (*SetStrings)(std::string &GStr, std::string &LStr);<br>
> -typedef const char *(*GetString)();<br>
> -<br>
> -template <class T> static T FuncPtr(void *Ptr) {<br>
> -  union {<br>
> -    T F;<br>
> -    void *P;<br>
> -  } Tmp;<br>
> -  Tmp.P = Ptr;<br>
> -  return Tmp.F;<br>
> -}<br>
> -template <class T> static void* PtrFunc(T *Func) {<br>
> -  union {<br>
> -    T *F;<br>
> -    void *P;<br>
> -  } Tmp;<br>
> -  Tmp.F = Func;<br>
> -  return Tmp.P;<br>
> -}<br>
> -<br>
> -static const char *OverloadTestA() { return "OverloadCall"; }<br>
> -<br>
> -std::string StdString(const char *Ptr) { return Ptr ? Ptr : ""; }<br>
> -<br>
> -TEST(DynamicLibrary, Overload) {<br>
> -  {<br>
> -    std::string Err;<br>
> -    llvm_shutdown_obj Shutdown;<br>
> -    DynamicLibrary DL =<br>
> -        DynamicLibrary::getPermanentLibrary(LibPath().c_str(), &Err);<br>
> -    EXPECT_TRUE(DL.isValid());<br>
> -    EXPECT_TRUE(Err.empty());<br>
> -<br>
> -    GetString GS = FuncPtr<GetString>(DL.getAddressOfSymbol("TestA"));<br>
> -    EXPECT_TRUE(GS != nullptr && GS != &TestA);<br>
> -    EXPECT_EQ(StdString(GS()), "LibCall");<br>
> -<br>
> -    GS = FuncPtr<GetString>(DynamicLibrary::SearchForAddressOfSymbol("TestA"));<br>
> -    EXPECT_TRUE(GS != nullptr && GS != &TestA);<br>
> -    EXPECT_EQ(StdString(GS()), "LibCall");<br>
> -<br>
> -    DL = DynamicLibrary::getPermanentLibrary(nullptr, &Err);<br>
> -    EXPECT_TRUE(DL.isValid());<br>
> -    EXPECT_TRUE(Err.empty());<br>
> -<br>
> -    GS = FuncPtr<GetString>(DynamicLibrary::SearchForAddressOfSymbol("TestA"));<br>
> -    EXPECT_TRUE(GS != nullptr && GS == &TestA);<br>
> -    EXPECT_EQ(StdString(GS()), "ProcessCall");<br>
> -<br>
> -    GS = FuncPtr<GetString>(DL.getAddressOfSymbol("TestA"));<br>
> -    EXPECT_TRUE(GS != nullptr && GS == &TestA);<br>
> -    EXPECT_EQ(StdString(GS()), "ProcessCall");<br>
> -<br>
> -    DynamicLibrary::AddSymbol("TestA", PtrFunc(&OverloadTestA));<br>
> -    GS = FuncPtr<GetString>(DL.getAddressOfSymbol("TestA"));<br>
> -    EXPECT_TRUE(GS != nullptr && GS != &OverloadTestA);<br>
> -<br>
> -    GS = FuncPtr<GetString>(DynamicLibrary::SearchForAddressOfSymbol("TestA"));<br>
> -    EXPECT_TRUE(GS != nullptr && GS == &OverloadTestA);<br>
> -    EXPECT_EQ(StdString(GS()), "OverloadCall");<br>
> -  }<br>
> -  EXPECT_TRUE(FuncPtr<GetString>(DynamicLibrary::SearchForAddressOfSymbol(<br>
> -                  "TestA")) == nullptr);<br>
> -}<br>
> -<br>
> -TEST(DynamicLibrary, Shutdown) {<br>
> -  std::string A, B;<br>
> -  {<br>
> -    std::string Err;<br>
> -    llvm_shutdown_obj Shutdown;<br>
> -    DynamicLibrary DL =<br>
> -        DynamicLibrary::getPermanentLibrary(LibPath().c_str(), &Err);<br>
> -    EXPECT_TRUE(DL.isValid());<br>
> -    EXPECT_TRUE(Err.empty());<br>
> -<br>
> -    SetStrings SS = FuncPtr<SetStrings>(<br>
> -        DynamicLibrary::SearchForAddressOfSymbol("SetStrings"));<br>
> -    EXPECT_TRUE(SS != nullptr);<br>
> -<br>
> -    SS(A, B);<br>
> -    EXPECT_EQ(B, "Local::Local");<br>
> -  }<br>
> -  EXPECT_EQ(A, "Global::~Global");<br>
> -  EXPECT_EQ(B, "Local::~Local");<br>
> -  EXPECT_TRUE(FuncPtr<SetStrings>(DynamicLibrary::SearchForAddressOfSymbol(<br>
> -                  "SetStrings")) == nullptr);<br>
> -}<br>
> -<br>
> -#else<br>
> -<br>
> -TEST(DynamicLibrary, Unsupported) {<br>
> -  std::string Err;<br>
> -  DynamicLibrary DL =<br>
> -      DynamicLibrary::getPermanentLibrary(LibPath().c_str(), &Err);<br>
> -  EXPECT_FALSE(DL.isValid());<br>
> -  EXPECT_EQ(Err, "dlopen() not supported on this platform");<br>
> -}<br>
> -<br>
> -#endif<br>
><br>
> Removed: llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.cxx<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.cxx?rev=301239&view=auto" id="LPlnk602029" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.cxx?rev=301239&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.cxx (original)<br>
> +++ llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.cxx (removed)<br>
> @@ -1,36 +0,0 @@<br>
> -//===- llvm/unittest/Support/DynamicLibrary/PipSqueak.cxx -----------------===//<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>
> -#include "PipSqueak.h"<br>
> -#include <string><br>
> -<br>
> -struct Global {<br>
> -  std::string *Str;<br>
> -  Global() : Str(nullptr) {}<br>
> -  ~Global() {<br>
> -    if (Str)<br>
> -      *Str = "Global::~Global";<br>
> -  }<br>
> -};<br>
> -<br>
> -struct Local {<br>
> -  std::string &Str;<br>
> -  Local(std::string &S) : Str(S) { Str = "Local::Local"; }<br>
> -  ~Local() { Str = "Local::~Local"; }<br>
> -};<br>
> -<br>
> -static Global Glb;<br>
> -<br>
> -extern "C" PIPSQUEAK_EXPORT void SetStrings(std::string &GStr,<br>
> -                                            std::string &LStr) {<br>
> -  static Local Lcl(LStr);<br>
> -  Glb.Str = &GStr;<br>
> -}<br>
> -<br>
> -extern "C" PIPSQUEAK_EXPORT const char *TestA() { return "LibCall"; }<br>
><br>
> Removed: llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.h?rev=301239&view=auto" id="LPlnk716908" previewremoved="true">
http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.h?rev=301239&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.h (original)<br>
> +++ llvm/trunk/unittests/Support/DynamicLibrary/PipSqueak.h (removed)<br>
> @@ -1,19 +0,0 @@<br>
> -//===- llvm/unittest/Support/DynamicLibrary/PipSqueak.h -------------------===//<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>
> -#ifndef LLVM_PIPSQUEAK_H<br>
> -#define LLVM_PIPSQUEAK_H<br>
> -<br>
> -#ifdef _WIN32<br>
> -#define PIPSQUEAK_EXPORT __declspec(dllexport)<br>
> -#else<br>
> -#define PIPSQUEAK_EXPORT<br>
> -#endif<br>
> -<br>
> -#endif<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> llvm-commits@lists.llvm.org<br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" id="LPlnk261322" previewremoved="true">
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a>
<div id="LPBorder_GT_14931520336200.3090811184138258" style="margin-bottom: 20px; overflow: auto; width: 100%; text-indent: 0px;">
<table id="LPContainer_14931520336180.8614504670265397" role="presentation" cellspacing="0" style="width: 90%; background-color: rgb(255, 255, 255); position: relative; overflow: auto; padding-top: 20px; padding-bottom: 20px; margin-top: 20px; border-top-width: 1px; border-top-style: dotted; border-top-color: rgb(200, 200, 200); border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: rgb(200, 200, 200);">
<tbody>
<tr valign="top" style="border-spacing: 0px;">
<td id="TextCell_14931520336190.31151072477869635" colspan="2" style="vertical-align: top; position: relative; padding: 0px; display: table-cell;">
<div id="LPRemovePreviewContainer_14931520336190.7985076364789552"></div>
<div id="LPTitle_14931520336190.0563142238702774" style="top: 0px; color: rgb(0, 120, 215); font-weight: normal; font-size: 21px; font-family: wf_segoe-ui_light, 'Segoe UI Light', 'Segoe WP Light', 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; line-height: 21px;">
<a id="LPUrlAnchor_14931520336190.4979648772077996" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank" style="text-decoration: none;">llvm-commits Info Page</a></div>
<div id="LPMetadata_14931520336190.10896601968999742" style="margin: 10px 0px 16px; color: rgb(102, 102, 102); font-weight: normal; font-family: wf_segoe-ui_normal, 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 14px; line-height: 14px;">
lists.llvm.org</div>
<div id="LPDescription_14931520336200.1622428165142641" style="display: block; color: rgb(102, 102, 102); font-weight: normal; font-family: wf_segoe-ui_normal, 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 14px; line-height: 20px; max-height: 100px; overflow: hidden;">
To see the collection of prior postings to the list, visit the llvm-commits Archives. Using llvm-commits: To post a message to all the list members ...</div>
</td>
</tr>
</tbody>
</table>
</div>
<br>
<br>
><br>
<br>
<br>
-- <br>
<br>
-Bill Seurer<br>
<br>
</div>
</span></font></div>
</div>
</body>
</html>