summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp
diff options
context:
space:
mode:
authorTamas Berghammer <tberghammer@google.com>2015-12-11 16:24:14 +0000
committerTamas Berghammer <tberghammer@google.com>2015-12-11 16:24:14 +0000
commite43482b626b5f8e8fe85aad0c91fd8e637f67cd4 (patch)
tree45a6102b113f507e6ffea6d03932b7ed30d46054 /lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp
parent734a0b3f81e24d106e1e4b46d000a11f865a42e6 (diff)
downloadbcm5719-llvm-e43482b626b5f8e8fe85aad0c91fd8e637f67cd4.tar.gz
bcm5719-llvm-e43482b626b5f8e8fe85aad0c91fd8e637f67cd4.zip
Create test for llvm.org/pr25806
LLDB don't detect the loading of a shared object file linked against the main executable before the static initializers are executed for the given module. Because of this it is not possible to get breakpoint hits in these static initializers and to display proper debug info in case of a crash in these codes. llvm-svn: 255342
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp')
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp
new file mode 100644
index 00000000000..bff9a317606
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp
@@ -0,0 +1,80 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+#include <dlfcn.h>
+#include <limits.h>
+#include <string.h>
+#include <unistd.h>
+#include <libgen.h>
+#include <stdlib.h>
+
+int
+main (int argc, char const *argv[])
+{
+#if defined (__APPLE__)
+ const char *a_name = "@executable_path/libloadunload_a.dylib";
+ const char *c_name = "@executable_path/libloadunload_c.dylib";
+#else
+ const char *a_name = "libloadunload_a.so";
+ const char *c_name = "libloadunload_c.so";
+#endif
+ void *a_dylib_handle = NULL;
+ void *c_dylib_handle = NULL;
+ int (*a_function) (void);
+
+ a_dylib_handle = dlopen (a_name, RTLD_NOW); // Set break point at this line for test_lldb_process_load_and_unload_commands().
+ if (a_dylib_handle == NULL)
+ {
+ fprintf (stderr, "%s\n", dlerror());
+ exit (1);
+ }
+
+ a_function = (int (*) ()) dlsym (a_dylib_handle, "a_function");
+ if (a_function == NULL)
+ {
+ fprintf (stderr, "%s\n", dlerror());
+ exit (2);
+ }
+ printf ("First time around, got: %d\n", a_function ());
+ dlclose (a_dylib_handle);
+
+ c_dylib_handle = dlopen (c_name, RTLD_NOW);
+ if (c_dylib_handle == NULL)
+ {
+ fprintf (stderr, "%s\n", dlerror());
+ exit (3);
+ }
+ a_function = (int (*) ()) dlsym (c_dylib_handle, "c_function");
+ if (a_function == NULL)
+ {
+ fprintf (stderr, "%s\n", dlerror());
+ exit (4);
+ }
+
+ a_dylib_handle = dlopen (a_name, RTLD_NOW);
+ if (a_dylib_handle == NULL)
+ {
+ fprintf (stderr, "%s\n", dlerror());
+ exit (5);
+ }
+
+ a_function = (int (*) ()) dlsym (a_dylib_handle, "a_function");
+ if (a_function == NULL)
+ {
+ fprintf (stderr, "%s\n", dlerror());
+ exit (6);
+ }
+ printf ("Second time around, got: %d\n", a_function ());
+ dlclose (a_dylib_handle);
+
+ int d_function(void);
+ printf ("d_function returns: %d\n", d_function());
+
+ return 0;
+}
OpenPOWER on IntegriCloud