kudu-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From a...@apache.org
Subject [kudu] branch master updated: KUDU-3072 Add glog patch to support stacktrace for aarch64
Date Tue, 24 Mar 2020 17:29:39 GMT
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 <huangtianhua223@gmail.com>
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 <granthenke@apache.org>
    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


Mime
View raw message