[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Libunwind-devel] [PATCH 02/19] Check __builtin___clear_cache() at confi
From: |
Tommi Rantala |
Subject: |
[Libunwind-devel] [PATCH 02/19] Check __builtin___clear_cache() at configuration time |
Date: |
Wed, 5 Sep 2012 14:50:10 +0300 |
Fixup commit 39b83981 ("Flush icache with __builtin___clear_cache() in
tests when compiling with GCC") to fix compilation with older GCC
versions that do not provide __builtin___clear_cache().
---
configure.in | 11 +++++++++++
tests/Gtest-dyn1.c | 10 ++--------
tests/Makefile.am | 7 ++++---
tests/flush-cache.S | 6 +++++-
tests/flush-cache.h | 38 ++++++++++++++++++++++++++++++++++++++
tests/ia64-test-dyn1.c | 10 ++--------
6 files changed, 62 insertions(+), 20 deletions(-)
create mode 100644 tests/flush-cache.h
diff --git a/configure.in b/configure.in
index 081ccee..f577bc7 100644
--- a/configure.in
+++ b/configure.in
@@ -277,6 +277,17 @@ if test x$intel_compiler = xyes; then
AC_MSG_RESULT([$have_static_libcxa])
fi
+AC_MSG_CHECKING([for __builtin___clear_cache])
+AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[__builtin___clear_cache(0, 0)]])],
+ [have__builtin___clear_cache=yes],
+ [have__builtin___clear_cache=no])
+if test x$have__builtin___clear_cache = xyes; then
+ AC_DEFINE([HAVE__BUILTIN___CLEAR_CACHE], [1],
+ [Defined if __builtin___clear_cache() is available])
+fi
+AC_MSG_RESULT([$have__builtin___clear_cache])
+
CCASFLAGS="${CCASFLAGS} ${CPPFLAGS}"
arch="$target_arch"
diff --git a/tests/Gtest-dyn1.c b/tests/Gtest-dyn1.c
index df2ab4a..96eb706 100644
--- a/tests/Gtest-dyn1.c
+++ b/tests/Gtest-dyn1.c
@@ -25,6 +25,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. */
/* This file tests dynamic code-generation via function-cloning. */
+#include "flush-cache.h"
+
#include <libunwind.h>
#include <stdio.h>
#include <stdlib.h>
@@ -86,10 +88,6 @@ struct fdesc
# define get_gp(fdesc) (0)
#endif
-#ifndef __GNUC__
-extern void flush_cache (void *addr, size_t len);
-#endif
-
void
template (int i, template_t self,
int (*printer)(const char *, ...), const char *fmt, const char **arr)
@@ -187,11 +185,7 @@ main (int argc, char *argv[] __attribute__((unused)))
mprotect ((void *) ((long) mem & ~(getpagesize () - 1)),
2*getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC);
-#ifdef __GNUC__
- __builtin___clear_cache(mem, mem + MAX_FUNC_SIZE);
-#else
flush_cache (mem, MAX_FUNC_SIZE);
-#endif
signal (SIGSEGV, sighandler);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f4f6f3e..987f22b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -101,15 +101,16 @@ Lia64_test_rbs_SOURCES = Lia64-test-rbs.c
ia64-test-rbs-asm.S ia64-test-rbs.h
Gia64_test_rbs_SOURCES = Gia64-test-rbs.c ia64-test-rbs-asm.S ia64-test-rbs.h
Lia64_test_nat_SOURCES = Lia64-test-nat.c ia64-test-nat-asm.S
Gia64_test_nat_SOURCES = Gia64-test-nat.c ia64-test-nat-asm.S
-ia64_test_dyn1_SOURCES = ia64-test-dyn1.c ia64-dyn-asm.S flush-cache.S
+ia64_test_dyn1_SOURCES = ia64-test-dyn1.c ia64-dyn-asm.S flush-cache.S \
+ flush-cache.h
ppc64_test_altivec_SOURCES = ppc64-test-altivec.c ppc64-test-altivec-utils.c
ppc64_test_wchar_SOURCES = ppc64-test-wchar.c
Gtest_init_SOURCES = Gtest-init.cxx
Ltest_init_SOURCES = Ltest-init.cxx
Ltest_cxx_exceptions_SOURCES = Ltest-cxx-exceptions.cxx
-Gtest_dyn1_SOURCES = Gtest-dyn1.c flush-cache.S
-Ltest_dyn1_SOURCES = Ltest-dyn1.c flush-cache.S
+Gtest_dyn1_SOURCES = Gtest-dyn1.c flush-cache.S flush-cache.h
+Ltest_dyn1_SOURCES = Ltest-dyn1.c flush-cache.S flush-cache.h
test_static_link_SOURCES = test-static-link-loc.c test-static-link-gen.c
test_static_link_LDFLAGS = -static
forker_LDFLAGS = -static
diff --git a/tests/flush-cache.S b/tests/flush-cache.S
index f441a74..6d51449 100644
--- a/tests/flush-cache.S
+++ b/tests/flush-cache.S
@@ -1,4 +1,8 @@
-#ifndef __GNUC__
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef HAVE__BUILTIN___CLEAR_CACHE
#if defined(__ia64__)
diff --git a/tests/flush-cache.h b/tests/flush-cache.h
new file mode 100644
index 0000000..8227d85
--- /dev/null
+++ b/tests/flush-cache.h
@@ -0,0 +1,38 @@
+/* libunwind - a platform-independent unwind library
+ Copyright (C) 2012 Tommi Rantala <address@hidden>
+
+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 FLUSH_CACHE_H
+#define FLUSH_CACHE_H
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE__BUILTIN___CLEAR_CACHE
+#define flush_cache(ADDR, LEN) \
+ __builtin___clear_cache((ADDR), (ADDR) + (LEN))
+#else
+#include <stddef.h>
+extern void flush_cache (void *addr, size_t len);
+#endif
+
+#endif /* FLUSH_CACHE_H */
diff --git a/tests/ia64-test-dyn1.c b/tests/ia64-test-dyn1.c
index 8331913..90127dd 100644
--- a/tests/ia64-test-dyn1.c
+++ b/tests/ia64-test-dyn1.c
@@ -1,3 +1,5 @@
+#include "flush-cache.h"
+
#include <assert.h>
#include <libunwind.h>
#include <unistd.h>
@@ -20,10 +22,6 @@ int verbose;
# define EXTRA 0
#endif
-#ifndef __GNUC__
-extern void flush_cache (void *addr, size_t len);
-#endif
-
int
make_executable (void *addr, size_t len)
{
@@ -33,11 +31,7 @@ make_executable (void *addr, size_t len)
perror ("mprotect");
return -1;
}
-#ifdef __GNUC__
- __builtin___clear_cache(addr, addr + len);
-#else
flush_cache (addr, len);
-#endif
return 0;
}
--
1.7.9.5
- [Libunwind-devel] [PATCH 00/19] misc fixes, Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 04/19] PPC: add missing debug level in Debug() calls in Gstep.c, Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 02/19] Check __builtin___clear_cache() at configuration time,
Tommi Rantala <=
- [Libunwind-devel] [PATCH 03/19] HPPA: fix common_init() bitrot, Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 01/19] Annotate unused argument in mark_as_used() to avoid -Wextra compiler noise, Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 05/19] PPC: return failure from the unw_get_proc_info() stub, Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 06/19] Remove free() NULL pointer checks in load_debug_frame() error path, Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 08/19] Rename `backtrace' to `do_backtrace' in tests/Gtest-init.cxx, Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 07/19] Eliminate one heap allocation in dwarf_find_debug_frame(), Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 09/19] Check correct variable for offset in tests/Gtest-init.cxx, Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 11/19] Do not print garbage proc info in tests/Gtest-bt.c, Tommi Rantala, 2012/09/05
- [Libunwind-devel] [PATCH 14/19] Provide manual page for `unw_backtrace()', Tommi Rantala, 2012/09/05