This is an automated email from the ASF dual-hosted git repository.
adar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git
The following commit(s) were added to refs/heads/master by this push:
new 6dd3fc1 KUDU-3072 Add glog patch to support stacktrace for aarch64
6dd3fc1 is described below
commit 6dd3fc104198ced9849711c1ed4c860eff75f3bd
Author: huangtianhua <[email protected]>
AuthorDate: Thu Mar 12 11:01:22 2020 +0000
KUDU-3072 Add glog patch to support stacktrace for aarch64
According to the comments in glog-0.3.5/src/utilities.h,
there are three different ways we can try to get the stack trace:
1) The libunwind library
2) Our hand-coded stack-unwinder
3) The gdb unwinder
We use first way to get stack trace by default, the function
"GetStackTrace" is defined in stacktrace_libunwind-inl.h, but
it doesn't work for aarch64, this changes to use the
implementation of aarch64 which defined in
stacktrace_aarch64-inl.h no matter libunwind exist or not.
I have proposed a PR to google/glog:
github.com/google/glog/pull/529
Change-Id: Ia8ca769b2bef5fa658d56d11b7ac9537fd9ca637
Reviewed-on: http://gerrit.cloudera.org:8080/15420
Reviewed-by: Grant Henke <[email protected]>
Tested-by: Kudu Jenkins
---
thirdparty/download-thirdparty.sh | 3 +-
.../glog-support-stacktrace-for-aarch64.patch | 151 +++++++++++++++++++++
2 files changed, 153 insertions(+), 1 deletion(-)
diff --git a/thirdparty/download-thirdparty.sh
b/thirdparty/download-thirdparty.sh
index 1a51aae..2672e03 100755
--- a/thirdparty/download-thirdparty.sh
+++ b/thirdparty/download-thirdparty.sh
@@ -170,7 +170,7 @@ fetch_and_patch() {
mkdir -p $TP_SOURCE_DIR
cd $TP_SOURCE_DIR
-GLOG_PATCHLEVEL=3
+GLOG_PATCHLEVEL=4
fetch_and_patch \
glog-${GLOG_VERSION}.tar.gz \
$GLOG_SOURCE \
@@ -178,6 +178,7 @@ fetch_and_patch \
"patch -p0 < $TP_DIR/patches/glog-issue-198-fix-unused-warnings.patch" \
"patch -p0 < $TP_DIR/patches/glog-issue-54-dont-build-tests.patch" \
"patch -p1 < $TP_DIR/patches/glog-fix-symbolization.patch" \
+ "patch -p1 < $TP_DIR/patches/glog-support-stacktrace-for-aarch64.patch" \
"autoreconf -fvi"
GMOCK_PATCHLEVEL=0
diff --git a/thirdparty/patches/glog-support-stacktrace-for-aarch64.patch
b/thirdparty/patches/glog-support-stacktrace-for-aarch64.patch
new file mode 100644
index 0000000..303d3a7
--- /dev/null
+++ b/thirdparty/patches/glog-support-stacktrace-for-aarch64.patch
@@ -0,0 +1,151 @@
+diff --git a/src/stacktrace_aarch64-inl.h b/src/stacktrace_aarch64-inl.h
+new file mode 100644
+index 0000000..1e3ce62
+--- /dev/null
++++ b/src/stacktrace_aarch64-inl.h
+@@ -0,0 +1,105 @@
++// Copyright (c) 2007, Google Inc.
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions are
++// met:
++//
++// * Redistributions of source code must retain the above copyright
++// notice, this list of conditions and the following disclaimer.
++// * Redistributions in binary form must reproduce the above
++// copyright notice, this list of conditions and the following disclaimer
++// in the documentation and/or other materials provided with the
++// distribution.
++// * Neither the name of Google Inc. nor the names of its
++// contributors may be used to endorse or promote products derived from
++// this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++//
++// Author: Craig Silverstein
++//
++// Produce stack trace. I'm guessing (hoping!) the code is much like
++// for x86. For apple machines, at least, it seems to be; see
++// http://developer.apple.com/documentation/mac/runtimehtml/RTArch-59.html
++//
http://www.linux-foundation.org/spec/ELF/ppc64/PPC-elf64abi-1.9.html#STACK
++// Linux has similar code: http://patchwork.ozlabs.org/linuxppc/patch?id=8882
++
++#include <stdio.h>
++#include <stdint.h> // for uintptr_t
++#include "stacktrace.h"
++
++_START_GOOGLE_NAMESPACE_
++
++// Given a pointer to a stack frame, locate and return the calling
++// stackframe, or return NULL if no stackframe can be found. Perform sanity
++// checks (the strictness of which is controlled by the boolean parameter
++// "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned.
++template<bool STRICT_UNWINDING>
++static void **NextStackFrame(void **old_sp) {
++ void **new_sp = (void**) old_sp[0];
++
++ // Check that the transition from frame pointer old_sp to frame
++ // pointer new_sp isn't clearly bogus
++ if (STRICT_UNWINDING) {
++ // With the stack growing downwards, older stack frame must be
++ // at a greater address that the current one.
++ if (new_sp <= old_sp) return NULL;
++ // Assume stack frames larger than 100,000 bytes are bogus.
++ if ((uintptr_t)new_sp - (uintptr_t)old_sp > 100000) return NULL;
++ } else {
++ // In the non-strict mode, allow discontiguous stack frames.
++ // (alternate-signal-stacks for example).
++ if (new_sp == old_sp) return NULL;
++ // And allow frames upto about 1MB.
++ if ((new_sp > old_sp)
++ && ((uintptr_t)new_sp - (uintptr_t)old_sp > 1000000)) return NULL;
++ }
++ if ((uintptr_t)new_sp & (sizeof(void *) - 1)) return NULL;
++ return new_sp;
++}
++
++// This ensures that GetStackTrace stes up the Link Register properly.
++#ifdef __GNUC__
++void StacktraceArm64DummyFunction() __attribute__((noinline));
++void StacktraceArm64DummyFunction() { __asm__ volatile(""); }
++#else
++# error StacktraceArm64DummyFunction() needs to be ported to this platform.
++#endif
++
++// If you change this function, also change GetStackFrames below.
++int GetStackTrace(void** result, int max_depth, int skip_count) {
++#ifdef __GNUC__
++ void **sp = reinterpret_cast<void**>(__builtin_frame_address(0));
++#else
++# error reading stack point not yet supported on this platform.
++#endif
++
++ StacktraceArm64DummyFunction();
++
++ skip_count++; // skip parent frame due to indirection in stacktrace.cc
++
++ int n = 0;
++ while (sp && n < max_depth) {
++ if (skip_count > 0) {
++ skip_count--;
++ } else {
++ result[n++] = *(sp+1);
++ }
++ // Use strict unwinding rules.
++ sp = NextStackFrame<true>(sp);
++ }
++ return n;
++}
++
++_END_GOOGLE_NAMESPACE_
+
+
+diff --git a/Makefile.am b/Makefile.am
+index 0c87c89..886594c 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -64,6 +64,7 @@ libglog_la_SOURCES = $(gloginclude_HEADERS) \
+ src/stacktrace_generic-inl.h \
+ src/stacktrace_libunwind-inl.h \
+ src/stacktrace_powerpc-inl.h \
++ src/stacktrace_aarch64-inl.h \
+ src/stacktrace_x86-inl.h \
+ src/stacktrace_x86_64-inl.h \
+ src/symbolize.cc src/symbolize.h \
+
+diff --git a/src/utilities.h b/src/utilities.h
+index 5f79968..3ca051b 100644
+--- a/src/utilities.h
++++ b/src/utilities.h
+@@ -102,7 +102,11 @@
+ // Some code may do that.
+
+ #if defined(HAVE_LIB_UNWIND)
+-# define STACKTRACE_H "stacktrace_libunwind-inl.h"
++# if defined(__aarch64__)
++# define STACKTRACE_H "stacktrace_aarch64-inl.h"
++# else
++# define STACKTRACE_H "stacktrace_libunwind-inl.h"
++# endif
+ #elif !defined(NO_FRAME_POINTER)
+ # if defined(__i386__) && __GNUC__ >= 2
+ # define STACKTRACE_H "stacktrace_x86-inl.h"
+@@ -110,6 +114,8 @@
+ # define STACKTRACE_H "stacktrace_x86_64-inl.h"
+ # elif (defined(__ppc__) || defined(__PPC__)) && __GNUC__ >= 2
+ # define STACKTRACE_H "stacktrace_powerpc-inl.h"
++# elif defined(__aarch64__)
++# define STACKTRACE_H "stacktrace_aarch64-inl.h"
+ # endif
+ #endif