Index: llvm/tools/llvm-jitlink/llvm-jitlink.cpp =================================================================== --- llvm/tools/llvm-jitlink/llvm-jitlink.cpp +++ llvm/tools/llvm-jitlink/llvm-jitlink.cpp @@ -14,6 +14,7 @@ #include "llvm-jitlink.h" +#include "llvm/ADT/PriorityQueue.h" #include "llvm/BinaryFormat/Magic.h" #include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h" #include "llvm/ExecutionEngine/Orc/DebuggerSupportPlugin.h" @@ -51,7 +52,6 @@ #include #include -#include #include #ifdef LLVM_ON_UNIX @@ -1587,7 +1587,14 @@ StringRef *CandidateExtensions; enum { Standard, Hidden } Modifier; }; - std::vector LibraryLoads; + + // Stack to load library one by one with an option to push another library + // load. + auto Comp = [](const LibraryLoad &LHS, const LibraryLoad &RHS) -> bool { + return LHS.Position > RHS.Position; + }; + llvm::PriorityQueue, decltype(Comp)> + LibraryLoadStack(Comp); // Add archive files from the inputs to LibraryLoads. for (auto InputFileItr = InputFiles.begin(), InputFileEnd = InputFiles.end(); InputFileItr != InputFileEnd; ++InputFileItr) { @@ -1600,7 +1607,7 @@ LL.Position = InputFiles.getPosition(InputFileItr - InputFiles.begin()); LL.CandidateExtensions = nullptr; LL.Modifier = LibraryLoad::Standard; - LibraryLoads.push_back(std::move(LL)); + LibraryLoadStack.push(std::move(LL)); } // Add -load_hidden arguments to LibraryLoads. @@ -1612,7 +1619,7 @@ LL.Position = LoadHidden.getPosition(LibItr - LoadHidden.begin()); LL.CandidateExtensions = nullptr; LL.Modifier = LibraryLoad::Hidden; - LibraryLoads.push_back(std::move(LL)); + LibraryLoadStack.push(std::move(LL)); } StringRef StandardExtensions[] = {".so", ".dylib", ".dll", ".a", ".lib"}; StringRef DynLibExtensionsOnly[] = {".so", ".dylib", ".dll"}; @@ -1626,7 +1633,7 @@ LL.Position = Libraries.getPosition(LibItr - Libraries.begin()); LL.CandidateExtensions = StandardExtensions; LL.Modifier = LibraryLoad::Standard; - LibraryLoads.push_back(std::move(LL)); + LibraryLoadStack.push(std::move(LL)); } // Add -hidden-lx arguments to LibraryLoads. @@ -1639,7 +1646,7 @@ LibrariesHidden.getPosition(LibHiddenItr - LibrariesHidden.begin()); LL.CandidateExtensions = ArchiveExtensionsOnly; LL.Modifier = LibraryLoad::Hidden; - LibraryLoads.push_back(std::move(LL)); + LibraryLoadStack.push(std::move(LL)); } // If there are any load- options then turn on flag overrides @@ -1647,17 +1654,6 @@ if (!LibrariesHidden.empty() || !LoadHidden.empty()) S.ObjLayer.setOverrideObjectFlagsWithResponsibilityFlags(true); - // Sort library loads by position in the argument list. - llvm::sort(LibraryLoads, [](const LibraryLoad &LHS, const LibraryLoad &RHS) { - return LHS.Position < RHS.Position; - }); - - // Stack to load library one by one with an option to push another library - // load. - std::stack LibraryLoadStack; - for (auto It = LibraryLoads.rbegin(); It != LibraryLoads.rend(); ++It) - LibraryLoadStack.push(*It); - // 3. Process library loads. auto AddArchive = [&](const char *Path, const LibraryLoad &LL) -> Expected> {