You've already forked linux-packaging-mono
Imported Upstream version 5.18.0.167
Former-commit-id: 289509151e0fee68a1b591a20c9f109c3c789d3a
This commit is contained in:
parent
e19d552987
commit
b084638f15
@ -1,35 +0,0 @@
|
||||
set(LLVM_LINK_COMPONENTS Support)
|
||||
|
||||
add_library(DynamicLibraryLib STATIC ExportedFuncs.cxx)
|
||||
set_target_properties(DynamicLibraryLib PROPERTIES FOLDER "Tests")
|
||||
|
||||
add_llvm_unittest(DynamicLibraryTests DynamicLibraryTest.cpp)
|
||||
target_link_libraries(DynamicLibraryTests PRIVATE DynamicLibraryLib)
|
||||
export_executable_symbols(DynamicLibraryTests)
|
||||
|
||||
function(dynlib_add_module NAME)
|
||||
add_library(${NAME} SHARED PipSqueak.cxx)
|
||||
set_target_properties(${NAME} PROPERTIES FOLDER "Tests")
|
||||
|
||||
set_output_directory(${NAME}
|
||||
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
|
||||
LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
|
||||
)
|
||||
|
||||
set_target_properties(${NAME}
|
||||
PROPERTIES PREFIX ""
|
||||
SUFFIX ".so"
|
||||
)
|
||||
|
||||
add_dependencies(DynamicLibraryTests ${NAME})
|
||||
endfunction(dynlib_add_module)
|
||||
|
||||
# Revert -Wl,-z,nodelete on this test since it relies on the file
|
||||
# being unloaded.
|
||||
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||
string(REPLACE "-Wl,-z,nodelete" "" CMAKE_SHARED_LINKER_FLAGS
|
||||
${CMAKE_SHARED_LINKER_FLAGS})
|
||||
endif()
|
||||
|
||||
dynlib_add_module(PipSqueak)
|
||||
dynlib_add_module(SecondLib)
|
@ -1,176 +0,0 @@
|
||||
//===- llvm/unittest/Support/DynamicLibrary/DynamicLibraryTest.cpp --------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Support/DynamicLibrary.h"
|
||||
#include "llvm/Config/config.h"
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include "PipSqueak.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace llvm::sys;
|
||||
|
||||
std::string LibPath(const std::string Name = "PipSqueak") {
|
||||
const std::vector<testing::internal::string>& Argvs = testing::internal::GetArgvs();
|
||||
const char *Argv0 = Argvs.size() > 0 ? Argvs[0].c_str() : "DynamicLibraryTests";
|
||||
void *Ptr = (void*)(intptr_t)TestA;
|
||||
std::string Path = fs::getMainExecutable(Argv0, Ptr);
|
||||
llvm::SmallString<256> Buf(path::parent_path(Path));
|
||||
path::append(Buf, (Name+".so").c_str());
|
||||
return Buf.str();
|
||||
}
|
||||
|
||||
#if defined(_WIN32) || (defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN))
|
||||
|
||||
typedef void (*SetStrings)(std::string &GStr, std::string &LStr);
|
||||
typedef void (*TestOrder)(std::vector<std::string> &V);
|
||||
typedef const char *(*GetString)();
|
||||
|
||||
template <class T> static T FuncPtr(void *Ptr) {
|
||||
union {
|
||||
T F;
|
||||
void *P;
|
||||
} Tmp;
|
||||
Tmp.P = Ptr;
|
||||
return Tmp.F;
|
||||
}
|
||||
template <class T> static void* PtrFunc(T *Func) {
|
||||
union {
|
||||
T *F;
|
||||
void *P;
|
||||
} Tmp;
|
||||
Tmp.F = Func;
|
||||
return Tmp.P;
|
||||
}
|
||||
|
||||
static const char *OverloadTestA() { return "OverloadCall"; }
|
||||
|
||||
std::string StdString(const char *Ptr) { return Ptr ? Ptr : ""; }
|
||||
|
||||
TEST(DynamicLibrary, Overload) {
|
||||
{
|
||||
std::string Err;
|
||||
llvm_shutdown_obj Shutdown;
|
||||
DynamicLibrary DL =
|
||||
DynamicLibrary::getPermanentLibrary(LibPath().c_str(), &Err);
|
||||
EXPECT_TRUE(DL.isValid());
|
||||
EXPECT_TRUE(Err.empty());
|
||||
|
||||
GetString GS = FuncPtr<GetString>(DL.getAddressOfSymbol("TestA"));
|
||||
EXPECT_TRUE(GS != nullptr && GS != &TestA);
|
||||
EXPECT_EQ(StdString(GS()), "LibCall");
|
||||
|
||||
GS = FuncPtr<GetString>(DynamicLibrary::SearchForAddressOfSymbol("TestA"));
|
||||
EXPECT_TRUE(GS != nullptr && GS != &TestA);
|
||||
EXPECT_EQ(StdString(GS()), "LibCall");
|
||||
|
||||
DL = DynamicLibrary::getPermanentLibrary(nullptr, &Err);
|
||||
EXPECT_TRUE(DL.isValid());
|
||||
EXPECT_TRUE(Err.empty());
|
||||
|
||||
// Test overloading local symbols does not occur by default
|
||||
GS = FuncPtr<GetString>(DynamicLibrary::SearchForAddressOfSymbol("TestA"));
|
||||
EXPECT_TRUE(GS != nullptr && GS == &TestA);
|
||||
EXPECT_EQ(StdString(GS()), "ProcessCall");
|
||||
|
||||
GS = FuncPtr<GetString>(DL.getAddressOfSymbol("TestA"));
|
||||
EXPECT_TRUE(GS != nullptr && GS == &TestA);
|
||||
EXPECT_EQ(StdString(GS()), "ProcessCall");
|
||||
|
||||
// Test overloading by forcing library priority when searching for a symbol
|
||||
DynamicLibrary::SearchOrder = DynamicLibrary::SO_LoadedFirst;
|
||||
GS = FuncPtr<GetString>(DynamicLibrary::SearchForAddressOfSymbol("TestA"));
|
||||
EXPECT_TRUE(GS != nullptr && GS != &TestA);
|
||||
EXPECT_EQ(StdString(GS()), "LibCall");
|
||||
|
||||
DynamicLibrary::AddSymbol("TestA", PtrFunc(&OverloadTestA));
|
||||
GS = FuncPtr<GetString>(DL.getAddressOfSymbol("TestA"));
|
||||
EXPECT_TRUE(GS != nullptr && GS != &OverloadTestA);
|
||||
|
||||
GS = FuncPtr<GetString>(DynamicLibrary::SearchForAddressOfSymbol("TestA"));
|
||||
EXPECT_TRUE(GS != nullptr && GS == &OverloadTestA);
|
||||
EXPECT_EQ(StdString(GS()), "OverloadCall");
|
||||
}
|
||||
EXPECT_TRUE(FuncPtr<GetString>(DynamicLibrary::SearchForAddressOfSymbol(
|
||||
"TestA")) == nullptr);
|
||||
|
||||
// Check serach ordering is reset to default after call to llvm_shutdown
|
||||
EXPECT_TRUE(DynamicLibrary::SearchOrder == DynamicLibrary::SO_Linker);
|
||||
}
|
||||
|
||||
TEST(DynamicLibrary, Shutdown) {
|
||||
std::string A("PipSqueak"), B, C("SecondLib");
|
||||
std::vector<std::string> Order;
|
||||
{
|
||||
std::string Err;
|
||||
llvm_shutdown_obj Shutdown;
|
||||
DynamicLibrary DL =
|
||||
DynamicLibrary::getPermanentLibrary(LibPath(A).c_str(), &Err);
|
||||
EXPECT_TRUE(DL.isValid());
|
||||
EXPECT_TRUE(Err.empty());
|
||||
|
||||
SetStrings SS_0 = FuncPtr<SetStrings>(
|
||||
DynamicLibrary::SearchForAddressOfSymbol("SetStrings"));
|
||||
EXPECT_TRUE(SS_0 != nullptr);
|
||||
|
||||
SS_0(A, B);
|
||||
EXPECT_EQ(B, "Local::Local(PipSqueak)");
|
||||
|
||||
TestOrder TO_0 = FuncPtr<TestOrder>(
|
||||
DynamicLibrary::SearchForAddressOfSymbol("TestOrder"));
|
||||
EXPECT_TRUE(TO_0 != nullptr);
|
||||
|
||||
DynamicLibrary DL2 =
|
||||
DynamicLibrary::getPermanentLibrary(LibPath(C).c_str(), &Err);
|
||||
EXPECT_TRUE(DL2.isValid());
|
||||
EXPECT_TRUE(Err.empty());
|
||||
|
||||
// Should find latest version of symbols in SecondLib
|
||||
SetStrings SS_1 = FuncPtr<SetStrings>(
|
||||
DynamicLibrary::SearchForAddressOfSymbol("SetStrings"));
|
||||
EXPECT_TRUE(SS_1 != nullptr);
|
||||
EXPECT_TRUE(SS_0 != SS_1);
|
||||
|
||||
TestOrder TO_1 = FuncPtr<TestOrder>(
|
||||
DynamicLibrary::SearchForAddressOfSymbol("TestOrder"));
|
||||
EXPECT_TRUE(TO_1 != nullptr);
|
||||
EXPECT_TRUE(TO_0 != TO_1);
|
||||
|
||||
B.clear();
|
||||
SS_1(C, B);
|
||||
EXPECT_EQ(B, "Local::Local(SecondLib)");
|
||||
|
||||
TO_0(Order);
|
||||
TO_1(Order);
|
||||
}
|
||||
EXPECT_EQ(A, "Global::~Global");
|
||||
EXPECT_EQ(B, "Local::~Local");
|
||||
EXPECT_TRUE(FuncPtr<SetStrings>(DynamicLibrary::SearchForAddressOfSymbol(
|
||||
"SetStrings")) == nullptr);
|
||||
|
||||
// Test unload/destruction ordering
|
||||
EXPECT_EQ(Order.size(), 2UL);
|
||||
EXPECT_EQ(Order.front(), "SecondLib");
|
||||
EXPECT_EQ(Order.back(), "PipSqueak");
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
TEST(DynamicLibrary, Unsupported) {
|
||||
std::string Err;
|
||||
DynamicLibrary DL =
|
||||
DynamicLibrary::getPermanentLibrary(LibPath().c_str(), &Err);
|
||||
EXPECT_FALSE(DL.isValid());
|
||||
EXPECT_EQ(Err, "dlopen() not supported on this platform");
|
||||
}
|
||||
|
||||
#endif
|
@ -1,16 +0,0 @@
|
||||
//===- llvm/unittest/Support/DynamicLibrary/DynamicLibraryLib.cpp ---------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "PipSqueak.h"
|
||||
|
||||
#ifndef PIPSQUEAK_TESTA_RETURN
|
||||
#define PIPSQUEAK_TESTA_RETURN "ProcessCall"
|
||||
#endif
|
||||
|
||||
extern "C" PIPSQUEAK_EXPORT const char *TestA() { return PIPSQUEAK_TESTA_RETURN; }
|
@ -1,49 +0,0 @@
|
||||
//===- llvm/unittest/Support/DynamicLibrary/PipSqueak.cxx -----------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "PipSqueak.h"
|
||||
|
||||
struct Global {
|
||||
std::string *Str;
|
||||
std::vector<std::string> *Vec;
|
||||
Global() : Str(nullptr), Vec(nullptr) {}
|
||||
~Global() {
|
||||
if (Str) {
|
||||
if (Vec)
|
||||
Vec->push_back(*Str);
|
||||
*Str = "Global::~Global";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static Global Glb;
|
||||
|
||||
struct Local {
|
||||
std::string &Str;
|
||||
Local(std::string &S) : Str(S) {
|
||||
Str = "Local::Local";
|
||||
if (Glb.Str && !Glb.Str->empty())
|
||||
Str += std::string("(") + *Glb.Str + std::string(")");
|
||||
}
|
||||
~Local() { Str = "Local::~Local"; }
|
||||
};
|
||||
|
||||
|
||||
extern "C" PIPSQUEAK_EXPORT void SetStrings(std::string &GStr,
|
||||
std::string &LStr) {
|
||||
Glb.Str = &GStr;
|
||||
static Local Lcl(LStr);
|
||||
}
|
||||
|
||||
extern "C" PIPSQUEAK_EXPORT void TestOrder(std::vector<std::string> &V) {
|
||||
Glb.Vec = &V;
|
||||
}
|
||||
|
||||
#define PIPSQUEAK_TESTA_RETURN "LibCall"
|
||||
#include "ExportedFuncs.cxx"
|
@ -1,34 +0,0 @@
|
||||
//===- llvm/unittest/Support/DynamicLibrary/PipSqueak.h -------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_PIPSQUEAK_H
|
||||
#define LLVM_PIPSQUEAK_H
|
||||
|
||||
#if defined(_WIN32) && !defined(__GNUC__)
|
||||
// Disable warnings from inclusion of xlocale & exception
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4530)
|
||||
#pragma warning(disable: 4577)
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#pragma warning(pop)
|
||||
#else
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define PIPSQUEAK_EXPORT __declspec(dllexport)
|
||||
#else
|
||||
#define PIPSQUEAK_EXPORT
|
||||
#endif
|
||||
|
||||
extern "C" PIPSQUEAK_EXPORT const char *TestA();
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user