add and deal with -fvisibility=hidden everywhere
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 453cc61..3945440 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -23,7 +23,12 @@
message(FATAL_ERROR "libdrm not found")
endif()
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Werror -Wall -Wextra -Wno-sign-compare -Wno-unused-parameter")
+if (CMAKE_COMPILER_IS_GNUCC)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Werror -Wall -Wextra -Wno-sign-compare -Wno-unused-parameter")
+ if (UNIX)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
+ endif()
+endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
include(GetGitRevisionDescription)
diff --git a/loader/loader.c b/loader/loader.c
index 860ffb9..a90d656 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -35,8 +35,7 @@
#include <dlfcn.h>
#include <pthread.h>
-#include <xgl.h>
-#include <xglDbg.h>
+#include "loader.h"
typedef XGL_RESULT (XGLAPI *InitAndEnumerateGpusT)(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_UINT maxGpus, XGL_UINT* pGpuCount, XGL_PHYSICAL_GPU* pGpus);
typedef XGL_RESULT (XGLAPI *DbgRegisterMsgCallbackT)(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData);
@@ -337,7 +336,7 @@
loader.scanned = true;
}
-XGL_RESULT XGLAPI xglInitAndEnumerateGpus(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_UINT maxGpus, XGL_UINT* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
+LOADER_EXPORT XGL_RESULT XGLAPI xglInitAndEnumerateGpus(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_UINT maxGpus, XGL_UINT* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
{
static pthread_once_t once = PTHREAD_ONCE_INIT;
const struct loader_icd *icd;
@@ -376,7 +375,7 @@
return (count > 0) ? XGL_SUCCESS : res;
}
-XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData)
+LOADER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData)
{
const struct loader_icd *icd = loader.icds;
XGL_RESULT res;
@@ -409,7 +408,7 @@
return XGL_SUCCESS;
}
-XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
+LOADER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
{
const struct loader_icd *icd = loader.icds;
XGL_RESULT res = XGL_SUCCESS;
@@ -429,7 +428,7 @@
return res;
}
-XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
+LOADER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
{
const struct loader_icd *icd = loader.icds;
XGL_RESULT res = XGL_SUCCESS;
diff --git a/loader/loader.h b/loader/loader.h
new file mode 100644
index 0000000..19aba3f
--- /dev/null
+++ b/loader/loader.h
@@ -0,0 +1,39 @@
+/*
+ * XGL
+ *
+ * Copyright (C) 2014 LunarG, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef LOADER_H
+#define LOADER_H
+
+#include <xgl.h>
+#include <xglDbg.h>
+
+#if defined(__GNUC__) && __GNUC__ >= 4
+# define LOADER_EXPORT __attribute__((visibility("default")))
+#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
+# define LOADER_EXPORT __attribute__((visibility("default")))
+#else
+# define LOADER_EXPORT
+#endif
+
+#endif /* LOADER_H */
diff --git a/xgl-generate.py b/xgl-generate.py
index 5ffa583..865f7a6 100755
--- a/xgl-generate.py
+++ b/xgl-generate.py
@@ -81,7 +81,10 @@
%s;
};""" % ";\n ".join(entries)
- def _generate_icd_dispatch_entrypoints(self):
+ def _generate_icd_dispatch_entrypoints(self, qual=""):
+ if qual:
+ qual += " "
+
funcs = []
for proto in self.protos:
if not xgl.is_dispatchable(proto):
@@ -92,12 +95,12 @@
if proto.ret != "XGL_VOID":
stmt = "return " + stmt
- funcs.append("%s\n"
+ funcs.append("%s%s\n"
"{\n"
" const struct icd_dispatch_table * const *disp =\n"
" (const struct icd_dispatch_table * const *) %s;\n"
" %s;\n"
- "}" % (decl, proto.params[0].name, stmt))
+ "}" % (qual, decl, proto.params[0].name, stmt))
return "\n\n".join(funcs)
@@ -135,13 +138,11 @@
class LoaderSubcommand(Subcommand):
def generate_header(self):
- return "\n".join([
- "#include <xgl.h>",
- "#include <xglDbg.h>"])
+ return "#include \"loader.h\""
def generate_body(self):
body = [self._generate_icd_dispatch_table(),
- self._generate_icd_dispatch_entrypoints()]
+ self._generate_icd_dispatch_entrypoints("LOADER_EXPORT")]
return "\n\n".join(body)
@@ -164,20 +165,11 @@
return self._generate_icd_dispatch_table()
class IcdDispatchEntrypointsSubcommand(Subcommand):
- def run(self):
- if len(self.argv) != 1:
- print("IcdDispatchEntrypointsSubcommand requires a header to include")
- return
- super().run()
-
def generate_header(self):
- return "\n".join([
- "#include <xgl.h>",
- "#include <xglDbg.h>",
- "#include \"%s\"" % self.argv[0]])
+ return "#include \"icd.h\""
def generate_body(self):
- return self._generate_icd_dispatch_entrypoints()
+ return self._generate_icd_dispatch_entrypoints("ICD_EXPORT")
def main():
subcommands = {