chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 13:29:29 +08:00
commit f52cf32e56
1718 changed files with 366293 additions and 0 deletions
@@ -0,0 +1,21 @@
# Forked from the Bazel Central Registry:
# https://github.com/bazelbuild/bazel-central-registry/blob/main/modules/libunwind/1.8.1/MODULE.bazel
# Distributed under the Apache License, Version 2.0. See the `registry/modules/
# libunwind/**` entry near the bottom of brpc's LICENSE file.
#
# brpc modification (Apache License 2.0 §4(b)):
# - `version` suffixed with `.brpc-no-unwind` to distinguish this brpc
# variant from the upstream BCR version.
module(
name = "libunwind",
version = "1.8.1.brpc-no-unwind",
bazel_compatibility = [">=7.2.1"], # need support for "overlay" directory
compatibility_level = 0,
)
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "rules_cc", version = "0.1.1")
bazel_dep(name = "xz", version = "5.4.5.bcr.5")
bazel_dep(name = "zlib", version = "1.3.1.bcr.5")
@@ -0,0 +1,781 @@
# This file is forked from the Bazel Central Registry:
# https://github.com/bazelbuild/bazel-central-registry/blob/main/modules/libunwind/1.8.1/overlay/BUILD.bazel
#
# The original file is distributed under the Apache License, Version 2.0
# (https://www.apache.org/licenses/LICENSE-2.0). See the `registry/modules/
# libunwind/**` entry near the bottom of brpc's LICENSE file for the full
# notice and the list of brpc's modifications.
#
# Modifications by brpc maintainers (Apache License 2.0 §4(b)):
# - Add the `hide_unwind_symbols` config_setting (gated by
# `--define=libunwind_hide_unwind_symbols=true`).
# - When the switch is on, drop `src/unwind/*.c` (the GCC `_Unwind_*` ABI
# compatibility layer) from `unwind_srcs` so the resulting libunwind
# does not export `_Unwind_*` symbols. See docs/cn/bthread_tracer.md
# for the rationale.
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:expand_template.bzl", "expand_template")
load("@rules_cc//cc:defs.bzl", "cc_library")
# Targets in this file are based off configure.ac, Makefile.am, and
# src/Makefile.am with the default configurations.
#
# Only supports aarch64, arm, and x86_64 on Linux for now.
### Config settings ############################################################
# Bazel does not support nested selects, so we need config settings with the
# various combinations of OS and CPU.
# Switch to drop the GCC `_Unwind_*` ABI compatibility layer (src/unwind/*.c)
# from the build. These sources implement `_Unwind_GetLanguageSpecificData`,
# `_Unwind_ForcedUnwind`, `_Unwind_Resume`, etc. - the very symbols that
# libgcc_s also provides. When Bazel builds libunwind as a dylib (its default
# behavior in fastbuild), these symbols get exported and at runtime the dynamic
# loader resolves the libstdc++ / pthread_exit unwinding paths to libunwind's
# DWARF-based implementations instead of libgcc_s's, causing crashes such as:
# _Unwind_ForcedUnwind -> __gxx_personality_v0 ->
# __libunwind_Unwind_GetLanguageSpecificData -> SEGV in
# _ULx86_64_dwarf_find_proc_info.
#
# brpc only consumes libunwind's native `unw_*` API (provided by src/mi/), so
# omitting src/unwind/*.c is safe and is the same effect autoconf gets via
# `--version-script` in the upstream Makefile (the make-built libunwind.so does
# not export `_Unwind_*` either - see CI's init-ut-make-config action).
#
# Enable with: --define=libunwind_hide_unwind_symbols=true
config_setting(
name = "hide_unwind_symbols",
values = {"define": "libunwind_hide_unwind_symbols=true"},
)
selects.config_setting_group(
name = "linux_arm64",
match_all = [
"@platforms//os:linux",
"@platforms//cpu:arm64",
],
)
selects.config_setting_group(
name = "linux_arm",
match_all = [
"@platforms//os:linux",
"@platforms//cpu:arm",
],
)
selects.config_setting_group(
name = "linux_x86_64",
match_all = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
)
### Common defines #############################################################
libunwind_defines = [
# Defaults based on configure.ac assuming we're on a modern Linux OS.
"_GNU_SOURCE",
"CONFIG_BLOCK_SIGNALS",
"CONFIG_WEAK_BACKTRACE",
"CONSERVATIVE_CHECKS",
"HAVE__BUILTIN___CLEAR_CACHE",
"HAVE__BUILTIN_UNREACHABLE",
"HAVE_ELF_H",
"HAVE_LINK_H",
"HAVE_LZMA",
"HAVE_ZLIB",
]
### Common source files ########################################################
dwarf_srcs = glob(["src/dwarf/*.c"])
dwarf_textual_hdrs = glob(["src/dwarf/G*.c"])
mi_srcs = glob(
["src/mi/*.c"],
exclude = [
# Only included if Linux.
"src/mi/_ReadSLEB.c",
"src/mi/_ReadULEB.c",
# The Makefile does not include this, it's also broken as it can include
# Gdyn-remote.c in certain situations, which uses WSIZE, which will not
# be defined in the situations Gdyn-remote.c is included.
"src/mi/Ldyn-remote.c",
# TODO: for some reason these complain about duplicate definitions if
# included.
"src/mi/Gaddress_validator.c",
"src/mi/Gget_accessors.c",
],
)
mi_textual_hdrs = glob(["src/mi/G*.c"])
# When `--define=libunwind_hide_unwind_symbols=true`, drop src/unwind/ entirely
# so libunwind does not provide its own `_Unwind_*` implementations. See the
# comment on `:hide_unwind_symbols` config_setting above.
unwind_srcs = select({
":hide_unwind_symbols": [],
"//conditions:default": glob([
"src/unwind/*.c",
"src/unwind/*.h",
]),
})
### Features source files ######################################################
coredump_srcs = glob(
[
"src/coredump/*.c",
"src/coredump/*.h",
],
exclude = [
"src/coredump/_UCD_access_reg_freebsd.c",
"src/coredump/_UCD_access_reg_linux.c",
"src/coredump/_UCD_access_reg_qnx.c",
"src/coredump/_UCD_get_mapinfo_generic.c",
"src/coredump/_UCD_get_mapinfo_linux.c",
"src/coredump/_UCD_get_mapinfo_qnx.c",
"src/coredump/_UCD_get_threadinfo_prstatus.c",
],
) + select({
"@platforms//os:linux": [
"src/coredump/_UCD_access_reg_linux.c",
"src/coredump/_UCD_get_mapinfo_linux.c",
"src/coredump/_UCD_get_threadinfo_prstatus.c",
],
"//conditions:default": [],
})
ptrace_srcs = glob([
"src/ptrace/*.c",
"src/ptrace/*.h",
])
setjmp_srcs = glob([
"src/setjmp/*.c",
"src/setjmp/*.h",
]) + select({
"@platforms//cpu:aarch64": [
"src/aarch64/longjmp.S",
"src/aarch64/siglongjmp.S",
],
"@platforms//cpu:arm": [
"src/arm/siglongjmp.S",
],
"@platforms//cpu:x86_64": [
"src/x86_64/longjmp.S",
"src/x86_64/siglongjmp.S",
],
})
### Arch specific source files #################################################
arm64_srcs = select({
"@platforms//cpu:aarch64": glob(
[
"src/aarch64/*.c",
"src/aarch64/*.h",
],
exclude = [
"src/aarch64/Los-freebsd.c",
"src/aarch64/Los-linux.c",
"src/aarch64/Los-qnx.c",
"src/aarch64/Gos-freebsd.c",
"src/aarch64/Gos-linux.c",
"src/aarch64/Gos-qnx.c",
],
) + [
# The Makefile doesn't include this and only includes it if the OS
# is FreeBSD. This is inconsistent with the other archs, not sure
# whether this is intended.
# "src/aarch64/setcontext.S",
"src/aarch64/getcontext.S",
"src/elf64.h",
],
"//conditions:default": [],
})
arm64_textual_hdrs = select({
"@platforms//cpu:aarch64": glob(
[
"src/aarch64/G*.c",
],
exclude = [
"src/aarch64/Gos-freebsd.c",
"src/aarch64/Gos-linux.c",
"src/aarch64/Gos-qnx.c",
],
) + [
"src/elf64.c",
],
"//conditions:default": [],
})
arm_srcs = select({
"@platforms//cpu:arm": glob(
[
"src/arm/*.c",
"src/arm/*.h",
],
exclude = [
"src/arm/Los-freebsd.c",
"src/arm/Los-linux.c",
"src/arm/Los-other.c",
"src/arm/Gos-freebsd.c",
"src/arm/Gos-linux.c",
"src/arm/Gos-other.c",
],
) + [
"src/arm/getcontext.S",
"src/elf32.h",
],
"//conditions:default": [],
})
arm_textual_hdrs = select({
"@platforms//cpu:arm": glob(
[
"src/arm/G*.c",
],
exclude = [
"src/arm/Gos-freebsd.c",
"src/arm/Gos-linux.c",
"src/arm/Gos-other.c",
],
) + [
"src/elf32.c",
],
"//conditions:default": [],
})
x86_64_srcs = select({
"@platforms//cpu:x86_64": glob(
[
"src/x86_64/*.c",
"src/x86_64/*.h",
],
exclude = [
"src/x86_64/Los-freebsd.c",
"src/x86_64/Los-linux.c",
"src/x86_64/Los-qnx.c",
"src/x86_64/Los-solaris.c",
"src/x86_64/Gos-freebsd.c",
"src/x86_64/Gos-linux.c",
"src/x86_64/Gos-qnx.c",
"src/x86_64/Gos-solaris.c",
],
) + [
"src/elf64.h",
"src/x86_64/getcontext.S",
"src/x86_64/setcontext.S",
],
"//conditions:default": [],
})
x86_64_textual_hdrs = select({
"@platforms//cpu:x86_64": glob(
[
"src/x86_64/G*.c",
],
exclude = [
"src/x86_64/Gos-freebsd.c",
"src/x86_64/Gos-linux.c",
"src/x86_64/Gos-qnx.c",
"src/x86_64/Gos-solaris.c",
],
) + [
"src/elf64.c",
],
"//conditions:default": [],
})
### OS specific source files ###################################################
linux_srcs = select({
"@platforms//os:linux": [
"src/dl-iterate-phdr.c",
"src/mi/_ReadSLEB.c",
"src/mi/_ReadULEB.c",
"src/os-linux.c",
"src/os-linux.h",
],
"//conditions:default": [],
}) + select({
":linux_arm64": [
"src/aarch64/Los-linux.c",
"src/aarch64/Gos-linux.c",
],
"//conditions:default": [],
}) + select({
":linux_arm": [
"src/arm/Los-linux.c",
"src/arm/Gos-linux.c",
],
"//conditions:default": [],
}) + select({
":linux_x86_64": [
"src/x86_64/Los-linux.c",
"src/x86_64/Gos-linux.c",
],
"//conditions:default": [],
})
linux_textual_hdrs = select({
":linux_arm64": ["src/aarch64/Gos-linux.c"],
"//conditions:default": [],
}) + select({
":linux_arm": ["src/arm/Gos-linux.c"],
"//conditions:default": [],
}) + select({
":linux_x86_64": ["src/x86_64/Gos-linux.c"],
"//conditions:default": [],
})
### libunwind ##################################################################
libunwind_srcs = [
"src/elfxx.h",
"src/elfxx.c",
] + dwarf_srcs + mi_srcs + unwind_srcs + arm64_srcs + arm_srcs + x86_64_srcs + linux_srcs
libunwind_textual_hdrs = [
"src/elfxx.c",
] + dwarf_textual_hdrs + mi_textual_hdrs + arm64_textual_hdrs + arm_textual_hdrs + x86_64_textual_hdrs + linux_textual_hdrs
expand_template(
name = "libunwind_common_h",
out = "include/libunwind-common.h",
substitutions = {
"@PKG_MAJOR@": "1",
"@PKG_MINOR@": "8",
"@PKG_EXTRA@": "1",
},
template = "include/libunwind-common.h.in",
)
cc_library(
name = "unwind",
srcs = libunwind_srcs,
hdrs = glob(["include/tdep/*.h"]) + [
"include/compiler.h",
"include/dwarf.h",
"include/dwarf-eh.h",
"include/dwarf_i.h",
"include/libunwind.h",
"include/libunwind-dynamic.h",
"include/libunwind_i.h",
"include/mempool.h",
"include/remote.h",
"include/unwind.h",
":libunwind_common_h",
] + select({
"@platforms//cpu:arm64": glob(["include/tdep-aarch64/*.h"]) + ["include/libunwind-aarch64.h"],
"@platforms//cpu:arm": glob(["include/tdep-arm/*.h"]) + ["include/libunwind-arm.h"],
"@platforms//cpu:x86_64": ["include/libunwind-x86_64.h"] + glob(["include/tdep-x86_64/*.h"]),
}),
includes = [
"include",
"src",
] + select({
"@platforms//cpu:arm64": [
"include/tdep-aarch64",
],
"@platforms//cpu:arm": [
"include/tdep-arm",
],
"@platforms//cpu:x86_64": [
"include/tdep-x86_64",
],
}),
local_defines = libunwind_defines + ["HAVE_DL_ITERATE_PHDR"],
textual_hdrs = libunwind_textual_hdrs,
deps = [
"@xz//:lzma",
"@zlib",
],
)
cc_library(
name = "unwind_coredump",
srcs = coredump_srcs + ["src/mi/init.c"],
hdrs = ["include/libunwind-coredump.h"],
includes = ["include"],
local_defines = libunwind_defines + [
"HAVE_STRUCT_ELF_PRSTATUS",
"HAVE_SYS_PROCFS_H",
] + select({
"@platforms//cpu:arm64": [
"CONFIG_DEBUG_FRAME",
"SIZEOF_OFF_T=8",
],
"@platforms//cpu:arm": [
"CONFIG_DEBUG_FRAME",
"SIZEOF_OFF_T=4",
],
"@platforms//cpu:x86_64": [
"SIZEOF_OFF_T=8",
],
}),
deps = [
":unwind",
"@xz//:lzma",
"@zlib",
],
)
cc_library(
name = "unwind_ptrace",
srcs = ptrace_srcs + ["src/mi/init.c"],
hdrs = ["include/libunwind-ptrace.h"],
includes = ["include"],
local_defines = libunwind_defines + ["HAVE_TTRACE"],
deps = [
":unwind",
"@xz//:lzma",
"@zlib",
],
)
cc_library(
name = "unwind_setjmp",
srcs = setjmp_srcs + ["src/mi/init.c"],
local_defines = libunwind_defines,
deps = [
":unwind",
"@xz//:lzma",
"@zlib",
],
)
alias(
name = "libunwind",
actual = ":unwind",
visibility = ["//visibility:public"],
)
alias(
name = "libunwind_coredump",
actual = ":unwind_coredump",
visibility = ["//visibility:public"],
)
alias(
name = "libunwind_ptrace",
actual = ":unwind_ptrace",
visibility = ["//visibility:public"],
)
alias(
name = "libunwind_setjmp",
actual = ":unwind_setjmp",
visibility = ["//visibility:public"],
)
### Tests #####################################################################
# TODO: the following tests currently do not work:
# crasher.c
# forker.c
# test-coredump-unwind.c
# test-init-remote.c
# test-proc-info.c
# test-ptrace-misc.c
# test-ptrace.c
# test-setjmp.c
# Some tests require these test helper files.
cc_library(
name = "unwind_test_helpers",
testonly = True,
srcs = [
"tests/flush-cache.S",
"tests/ident.c",
],
hdrs = glob(["tests/*G*.c"]) + [
"tests/Gtest-init.cxx",
"tests/flush-cache.h",
"tests/ident.h",
],
defines = ["_GNU_SOURCE"],
)
cc_test(
name = "frame_record_test",
srcs = ["tests/aarch64-test-frame-record.c"],
target_compatible_with = ["@platforms//cpu:arm64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "plt_test",
srcs = ["tests/aarch64-test-plt.c"],
target_compatible_with = ["@platforms//cpu:arm64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "arm64_sve_signal_test",
srcs = ["tests/Larm64-test-sve-signal.c"],
target_compatible_with = ["@platforms//cpu:arm64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "perf_simple_test",
srcs = ["tests/Lperf-simple.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "perf_trace_test",
srcs = ["tests/Lperf-trace.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "rs_race_test",
srcs = ["tests/Lrs-race.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "bt_test",
srcs = ["tests/Ltest-bt.c"],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "concurrent_test",
srcs = ["tests/Ltest-concurrent.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "cxx_exceptions_test",
srcs = ["tests/Ltest-cxx-exceptions.cxx"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
# TODO: fails on Debian 11 and Ubuntu 20.04.
# cc_test(
# name = "dyn1_test",
# srcs = ["tests/Ltest-dyn1.c"],
# deps = [
# ":unwind",
# ":unwind_test_helpers",
# ],
# linkopts = ["-ldl"],
# )
cc_test(
name = "exc_test",
srcs = ["tests/Ltest-exc.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "init_local_signal_test",
srcs = [
"tests/Ltest-init-local-signal.c",
"tests/Ltest-init-local-signal-lib.c",
],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "init_test",
srcs = ["tests/Ltest-init.cxx"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "mem_validate_test",
srcs = ["tests/Ltest-mem-validate.c"],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "nocalloc_test",
srcs = ["tests/Ltest-nocalloc.c"],
linkopts = ["-ldl"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "nomalloc_test",
srcs = ["tests/Ltest-nomalloc.c"],
linkopts = ["-ldl"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "resume_sig_rt_test",
srcs = ["tests/Ltest-resume-sig-rt.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "resume_sig_test",
srcs = ["tests/Ltest-resume-sig.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "trace_test",
srcs = ["tests/Ltest-trace.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "varargs_test",
srcs = ["tests/Ltest-varargs.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "dwarf_expressions_test",
srcs = [
"tests/Lx64-test-dwarf-expressions.c",
"tests/x64-test-dwarf-expressions.S",
],
target_compatible_with = ["@platforms//cpu:x86_64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "async_sig_test",
srcs = ["tests/test-async-sig.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "flush_cache_test",
srcs = ["tests/test-flush-cache.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "mem_test",
srcs = ["tests/test-mem.c"],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "reg_state_test",
srcs = ["tests/test-reg-state.c"],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "static_link_loc_test",
srcs = [
"tests/test-static-link-gen.c",
"tests/test-static-link-loc.c",
],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "strerror_test",
srcs = ["tests/test-strerror.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "unwind_badjmp_signal_frame_test",
srcs = ["tests/x64-unwind-badjmp-signal-frame.c"],
target_compatible_with = ["@platforms//cpu:x86_64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
@@ -0,0 +1,21 @@
# Forked from the Bazel Central Registry:
# https://github.com/bazelbuild/bazel-central-registry/blob/main/modules/libunwind/1.8.1/overlay/MODULE.bazel
# Distributed under the Apache License, Version 2.0. See the `registry/modules/
# libunwind/**` entry near the bottom of brpc's LICENSE file.
#
# brpc modification (Apache License 2.0 §4(b)):
# - `version` suffixed with `.brpc-no-unwind` to distinguish this brpc
# variant from the upstream BCR version.
module(
name = "libunwind",
version = "1.8.1.brpc-no-unwind",
bazel_compatibility = [">=7.2.1"], # need support for "overlay" directory
compatibility_level = 0,
)
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "rules_cc", version = "0.1.1")
bazel_dep(name = "xz", version = "5.4.5.bcr.5")
bazel_dep(name = "zlib", version = "1.3.1.bcr.5")
@@ -0,0 +1,18 @@
matrix:
platform:
- debian11
- ubuntu2004
- ubuntu2204
- ubuntu2404
bazel: [7.x, 8.x, rolling]
tasks:
verify_targets:
platform: ${{ platform }}
bazel: ${{ bazel }}
build_targets:
- "@libunwind//:libunwind"
- "@libunwind//:libunwind_coredump"
- "@libunwind//:libunwind_ptrace"
- "@libunwind//:libunwind_setjmp"
test_targets:
- "@libunwind//..."
@@ -0,0 +1,9 @@
{
"url": "https://github.com/libunwind/libunwind/releases/download/v1.8.1/libunwind-1.8.1.tar.gz",
"integrity": "sha256-3fDjLdX6/lKDGY035L+d7Pe6F3C25+AGwz5t955qYVc=",
"strip_prefix": "libunwind-1.8.1",
"overlay": {
"BUILD.bazel": "sha256-X2B6q+gpb5U0BGoD8LJPoBPCpyIvT5QFSwsjFxZ9R+0=",
"MODULE.bazel": "sha256-Yu1CCsCC+A2NXfQ3bgzpbtQcYhM+bPPb2YAPKPojdIY="
}
}
@@ -0,0 +1,21 @@
# Forked from the Bazel Central Registry:
# https://github.com/bazelbuild/bazel-central-registry/blob/main/modules/libunwind/1.8.3/MODULE.bazel
# Distributed under the Apache License, Version 2.0. See the `registry/modules/
# libunwind/**` entry near the bottom of brpc's LICENSE file.
#
# brpc modification (Apache License 2.0 §4(b)):
# - `version` suffixed with `.brpc-no-unwind` to distinguish this brpc
# variant from the upstream BCR version.
module(
name = "libunwind",
version = "1.8.3.brpc-no-unwind",
bazel_compatibility = [">=7.2.1"], # need support for "overlay" directory
compatibility_level = 0,
)
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "rules_cc", version = "0.1.1")
bazel_dep(name = "xz", version = "5.4.5.bcr.8")
bazel_dep(name = "zlib", version = "1.3.1.bcr.8")
@@ -0,0 +1,781 @@
# This file is forked from the Bazel Central Registry:
# https://github.com/bazelbuild/bazel-central-registry/blob/main/modules/libunwind/1.8.3/overlay/BUILD.bazel
#
# The original file is distributed under the Apache License, Version 2.0
# (https://www.apache.org/licenses/LICENSE-2.0). See the `registry/modules/
# libunwind/**` entry near the bottom of brpc's LICENSE file for the full
# notice and the list of brpc's modifications.
#
# Modifications by brpc maintainers (Apache License 2.0 §4(b)):
# - Add the `hide_unwind_symbols` config_setting (gated by
# `--define=libunwind_hide_unwind_symbols=true`).
# - When the switch is on, drop `src/unwind/*.c` (the GCC `_Unwind_*` ABI
# compatibility layer) from `unwind_srcs` so the resulting libunwind
# does not export `_Unwind_*` symbols. See docs/cn/bthread_tracer.md
# for the rationale.
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:expand_template.bzl", "expand_template")
load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
# Targets in this file are based off configure.ac, Makefile.am, and
# src/Makefile.am with the default configurations.
#
# Only supports aarch64, arm, and x86_64 on Linux for now.
### Config settings ############################################################
# Bazel does not support nested selects, so we need config settings with the
# various combinations of OS and CPU.
# Switch to drop the GCC `_Unwind_*` ABI compatibility layer (src/unwind/*.c)
# from the build. These sources implement `_Unwind_GetLanguageSpecificData`,
# `_Unwind_ForcedUnwind`, `_Unwind_Resume`, etc. - the very symbols that
# libgcc_s also provides. When Bazel builds libunwind as a dylib (its default
# behavior in fastbuild), these symbols get exported and at runtime the dynamic
# loader resolves the libstdc++ / pthread_exit unwinding paths to libunwind's
# DWARF-based implementations instead of libgcc_s's, causing crashes such as:
# _Unwind_ForcedUnwind -> __gxx_personality_v0 ->
# __libunwind_Unwind_GetLanguageSpecificData -> SEGV in
# _ULx86_64_dwarf_find_proc_info.
#
# brpc only consumes libunwind's native `unw_*` API (provided by src/mi/), so
# omitting src/unwind/*.c is safe and is the same effect autoconf gets via
# `--version-script` in the upstream Makefile (the make-built libunwind.so does
# not export `_Unwind_*` either - see CI's init-ut-make-config action).
#
# Enable with: --define=libunwind_hide_unwind_symbols=true
config_setting(
name = "hide_unwind_symbols",
values = {"define": "libunwind_hide_unwind_symbols=true"},
)
selects.config_setting_group(
name = "linux_arm64",
match_all = [
"@platforms//os:linux",
"@platforms//cpu:arm64",
],
)
selects.config_setting_group(
name = "linux_arm",
match_all = [
"@platforms//os:linux",
"@platforms//cpu:arm",
],
)
selects.config_setting_group(
name = "linux_x86_64",
match_all = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
)
### Common defines #############################################################
libunwind_defines = [
# Defaults based on configure.ac assuming we're on a modern Linux OS.
"_GNU_SOURCE",
"CONFIG_BLOCK_SIGNALS",
"CONFIG_WEAK_BACKTRACE",
"CONSERVATIVE_CHECKS",
"HAVE__BUILTIN___CLEAR_CACHE",
"HAVE__BUILTIN_UNREACHABLE",
"HAVE_ELF_H",
"HAVE_LINK_H",
"HAVE_LZMA",
"HAVE_ZLIB",
]
### Common source files ########################################################
dwarf_srcs = glob(["src/dwarf/*.c"])
dwarf_textual_hdrs = glob(["src/dwarf/G*.c"])
mi_srcs = glob(
["src/mi/*.c"],
exclude = [
# Only included if Linux.
"src/mi/_ReadSLEB.c",
"src/mi/_ReadULEB.c",
# The Makefile does not include this, it's also broken as it can include
# Gdyn-remote.c in certain situations, which uses WSIZE, which will not
# be defined in the situations Gdyn-remote.c is included.
"src/mi/Ldyn-remote.c",
# TODO: for some reason these complain about duplicate definitions if
# included.
"src/mi/Gaddress_validator.c",
"src/mi/Gget_accessors.c",
],
)
mi_textual_hdrs = glob(["src/mi/G*.c"])
# When `--define=libunwind_hide_unwind_symbols=true`, drop src/unwind/ entirely
# so libunwind does not provide its own `_Unwind_*` implementations. See the
# comment on `:hide_unwind_symbols` config_setting above.
unwind_srcs = select({
":hide_unwind_symbols": [],
"//conditions:default": glob([
"src/unwind/*.c",
"src/unwind/*.h",
]),
})
### Features source files ######################################################
coredump_srcs = glob(
[
"src/coredump/*.c",
"src/coredump/*.h",
],
exclude = [
"src/coredump/_UCD_access_reg_freebsd.c",
"src/coredump/_UCD_access_reg_linux.c",
"src/coredump/_UCD_access_reg_qnx.c",
"src/coredump/_UCD_get_mapinfo_generic.c",
"src/coredump/_UCD_get_mapinfo_linux.c",
"src/coredump/_UCD_get_mapinfo_qnx.c",
"src/coredump/_UCD_get_threadinfo_prstatus.c",
],
) + select({
"@platforms//os:linux": [
"src/coredump/_UCD_access_reg_linux.c",
"src/coredump/_UCD_get_mapinfo_linux.c",
"src/coredump/_UCD_get_threadinfo_prstatus.c",
],
"//conditions:default": [],
})
ptrace_srcs = glob([
"src/ptrace/*.c",
"src/ptrace/*.h",
])
setjmp_srcs = glob([
"src/setjmp/*.c",
"src/setjmp/*.h",
]) + select({
"@platforms//cpu:aarch64": [
"src/aarch64/longjmp.S",
"src/aarch64/siglongjmp.S",
],
"@platforms//cpu:arm": [
"src/arm/siglongjmp.S",
],
"@platforms//cpu:x86_64": [
"src/x86_64/longjmp.S",
"src/x86_64/siglongjmp.S",
],
})
### Arch specific source files #################################################
arm64_srcs = select({
"@platforms//cpu:aarch64": glob(
[
"src/aarch64/*.c",
"src/aarch64/*.h",
],
exclude = [
"src/aarch64/Los-freebsd.c",
"src/aarch64/Los-linux.c",
"src/aarch64/Los-qnx.c",
"src/aarch64/Gos-freebsd.c",
"src/aarch64/Gos-linux.c",
"src/aarch64/Gos-qnx.c",
],
) + [
# The Makefile doesn't include this and only includes it if the OS
# is FreeBSD. This is inconsistent with the other archs, not sure
# whether this is intended.
# "src/aarch64/setcontext.S",
"src/aarch64/getcontext.S",
"src/elf64.h",
],
"//conditions:default": [],
})
arm64_textual_hdrs = select({
"@platforms//cpu:aarch64": glob(
[
"src/aarch64/G*.c",
],
exclude = [
"src/aarch64/Gos-freebsd.c",
"src/aarch64/Gos-linux.c",
"src/aarch64/Gos-qnx.c",
],
) + [
"src/elf64.c",
],
"//conditions:default": [],
})
arm_srcs = select({
"@platforms//cpu:arm": glob(
[
"src/arm/*.c",
"src/arm/*.h",
],
exclude = [
"src/arm/Los-freebsd.c",
"src/arm/Los-linux.c",
"src/arm/Los-other.c",
"src/arm/Gos-freebsd.c",
"src/arm/Gos-linux.c",
"src/arm/Gos-other.c",
],
) + [
"src/arm/getcontext.S",
"src/elf32.h",
],
"//conditions:default": [],
})
arm_textual_hdrs = select({
"@platforms//cpu:arm": glob(
[
"src/arm/G*.c",
],
exclude = [
"src/arm/Gos-freebsd.c",
"src/arm/Gos-linux.c",
"src/arm/Gos-other.c",
],
) + [
"src/elf32.c",
],
"//conditions:default": [],
})
x86_64_srcs = select({
"@platforms//cpu:x86_64": glob(
[
"src/x86_64/*.c",
"src/x86_64/*.h",
],
exclude = [
"src/x86_64/Los-freebsd.c",
"src/x86_64/Los-linux.c",
"src/x86_64/Los-qnx.c",
"src/x86_64/Los-solaris.c",
"src/x86_64/Gos-freebsd.c",
"src/x86_64/Gos-linux.c",
"src/x86_64/Gos-qnx.c",
"src/x86_64/Gos-solaris.c",
],
) + [
"src/elf64.h",
"src/x86_64/getcontext.S",
"src/x86_64/setcontext.S",
],
"//conditions:default": [],
})
x86_64_textual_hdrs = select({
"@platforms//cpu:x86_64": glob(
[
"src/x86_64/G*.c",
],
exclude = [
"src/x86_64/Gos-freebsd.c",
"src/x86_64/Gos-linux.c",
"src/x86_64/Gos-qnx.c",
"src/x86_64/Gos-solaris.c",
],
) + [
"src/elf64.c",
],
"//conditions:default": [],
})
### OS specific source files ###################################################
linux_srcs = select({
"@platforms//os:linux": [
"src/dl-iterate-phdr.c",
"src/mi/_ReadSLEB.c",
"src/mi/_ReadULEB.c",
"src/os-linux.c",
"src/os-linux.h",
],
"//conditions:default": [],
}) + select({
":linux_arm64": [
"src/aarch64/Los-linux.c",
"src/aarch64/Gos-linux.c",
],
"//conditions:default": [],
}) + select({
":linux_arm": [
"src/arm/Los-linux.c",
"src/arm/Gos-linux.c",
],
"//conditions:default": [],
}) + select({
":linux_x86_64": [
"src/x86_64/Los-linux.c",
"src/x86_64/Gos-linux.c",
],
"//conditions:default": [],
})
linux_textual_hdrs = select({
":linux_arm64": ["src/aarch64/Gos-linux.c"],
"//conditions:default": [],
}) + select({
":linux_arm": ["src/arm/Gos-linux.c"],
"//conditions:default": [],
}) + select({
":linux_x86_64": ["src/x86_64/Gos-linux.c"],
"//conditions:default": [],
})
### libunwind ##################################################################
libunwind_srcs = [
"src/elfxx.h",
"src/elfxx.c",
] + dwarf_srcs + mi_srcs + unwind_srcs + arm64_srcs + arm_srcs + x86_64_srcs + linux_srcs
libunwind_textual_hdrs = [
"src/elfxx.c",
] + dwarf_textual_hdrs + mi_textual_hdrs + arm64_textual_hdrs + arm_textual_hdrs + x86_64_textual_hdrs + linux_textual_hdrs
expand_template(
name = "libunwind_common_h",
out = "include/libunwind-common.h",
substitutions = {
"@PKG_MAJOR@": "1",
"@PKG_MINOR@": "8",
"@PKG_EXTRA@": "1",
},
template = "include/libunwind-common.h.in",
)
cc_library(
name = "unwind",
srcs = libunwind_srcs,
hdrs = glob(["include/tdep/*.h"]) + [
"include/compiler.h",
"include/dwarf.h",
"include/dwarf-eh.h",
"include/dwarf_i.h",
"include/libunwind.h",
"include/libunwind-dynamic.h",
"include/libunwind_i.h",
"include/mempool.h",
"include/remote.h",
"include/unwind.h",
":libunwind_common_h",
] + select({
"@platforms//cpu:arm64": glob(["include/tdep-aarch64/*.h"]) + ["include/libunwind-aarch64.h"],
"@platforms//cpu:arm": glob(["include/tdep-arm/*.h"]) + ["include/libunwind-arm.h"],
"@platforms//cpu:x86_64": ["include/libunwind-x86_64.h"] + glob(["include/tdep-x86_64/*.h"]),
}),
includes = [
"include",
"src",
] + select({
"@platforms//cpu:arm64": [
"include/tdep-aarch64",
],
"@platforms//cpu:arm": [
"include/tdep-arm",
],
"@platforms//cpu:x86_64": [
"include/tdep-x86_64",
],
}),
local_defines = libunwind_defines + ["HAVE_DL_ITERATE_PHDR"],
textual_hdrs = libunwind_textual_hdrs,
deps = [
"@xz//:lzma",
"@zlib",
],
)
cc_library(
name = "unwind_coredump",
srcs = coredump_srcs + ["src/mi/init.c"],
hdrs = ["include/libunwind-coredump.h"],
includes = ["include"],
local_defines = libunwind_defines + [
"HAVE_STRUCT_ELF_PRSTATUS",
"HAVE_SYS_PROCFS_H",
] + select({
"@platforms//cpu:arm64": [
"CONFIG_DEBUG_FRAME",
"SIZEOF_OFF_T=8",
],
"@platforms//cpu:arm": [
"CONFIG_DEBUG_FRAME",
"SIZEOF_OFF_T=4",
],
"@platforms//cpu:x86_64": [
"SIZEOF_OFF_T=8",
],
}),
deps = [
":unwind",
"@xz//:lzma",
"@zlib",
],
)
cc_library(
name = "unwind_ptrace",
srcs = ptrace_srcs + ["src/mi/init.c"],
hdrs = ["include/libunwind-ptrace.h"],
includes = ["include"],
local_defines = libunwind_defines + ["HAVE_TTRACE"],
deps = [
":unwind",
"@xz//:lzma",
"@zlib",
],
)
cc_library(
name = "unwind_setjmp",
srcs = setjmp_srcs + ["src/mi/init.c"],
local_defines = libunwind_defines,
deps = [
":unwind",
"@xz//:lzma",
"@zlib",
],
)
alias(
name = "libunwind",
actual = ":unwind",
visibility = ["//visibility:public"],
)
alias(
name = "libunwind_coredump",
actual = ":unwind_coredump",
visibility = ["//visibility:public"],
)
alias(
name = "libunwind_ptrace",
actual = ":unwind_ptrace",
visibility = ["//visibility:public"],
)
alias(
name = "libunwind_setjmp",
actual = ":unwind_setjmp",
visibility = ["//visibility:public"],
)
### Tests #####################################################################
# TODO: the following tests currently do not work:
# crasher.c
# forker.c
# test-coredump-unwind.c
# test-init-remote.c
# test-proc-info.c
# test-ptrace-misc.c
# test-ptrace.c
# test-setjmp.c
# Some tests require these test helper files.
cc_library(
name = "unwind_test_helpers",
testonly = True,
srcs = [
"tests/flush-cache.S",
"tests/ident.c",
],
hdrs = glob(["tests/*G*.c"]) + [
"tests/Gtest-init.cxx",
"tests/flush-cache.h",
"tests/ident.h",
],
defines = ["_GNU_SOURCE"],
)
cc_test(
name = "frame_record_test",
srcs = ["tests/aarch64-test-frame-record.c"],
target_compatible_with = ["@platforms//cpu:arm64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "plt_test",
srcs = ["tests/aarch64-test-plt.c"],
target_compatible_with = ["@platforms//cpu:arm64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "arm64_sve_signal_test",
srcs = ["tests/Larm64-test-sve-signal.c"],
target_compatible_with = ["@platforms//cpu:arm64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "perf_simple_test",
srcs = ["tests/Lperf-simple.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "perf_trace_test",
srcs = ["tests/Lperf-trace.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "rs_race_test",
srcs = ["tests/Lrs-race.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "bt_test",
srcs = ["tests/Ltest-bt.c"],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "concurrent_test",
srcs = ["tests/Ltest-concurrent.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "cxx_exceptions_test",
srcs = ["tests/Ltest-cxx-exceptions.cxx"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
# TODO: fails on Debian 11 and Ubuntu 20.04.
# cc_test(
# name = "dyn1_test",
# srcs = ["tests/Ltest-dyn1.c"],
# deps = [
# ":unwind",
# ":unwind_test_helpers",
# ],
# linkopts = ["-ldl"],
# )
cc_test(
name = "exc_test",
srcs = ["tests/Ltest-exc.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "init_local_signal_test",
srcs = [
"tests/Ltest-init-local-signal.c",
"tests/Ltest-init-local-signal-lib.c",
],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "init_test",
srcs = ["tests/Ltest-init.cxx"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "mem_validate_test",
srcs = ["tests/Ltest-mem-validate.c"],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "nocalloc_test",
srcs = ["tests/Ltest-nocalloc.c"],
linkopts = ["-ldl"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "nomalloc_test",
srcs = ["tests/Ltest-nomalloc.c"],
linkopts = ["-ldl"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "resume_sig_rt_test",
srcs = ["tests/Ltest-resume-sig-rt.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "resume_sig_test",
srcs = ["tests/Ltest-resume-sig.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "trace_test",
srcs = ["tests/Ltest-trace.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "varargs_test",
srcs = ["tests/Ltest-varargs.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "dwarf_expressions_test",
srcs = [
"tests/Lx64-test-dwarf-expressions.c",
"tests/x64-test-dwarf-expressions.S",
],
target_compatible_with = ["@platforms//cpu:x86_64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "async_sig_test",
srcs = ["tests/test-async-sig.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "flush_cache_test",
srcs = ["tests/test-flush-cache.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "mem_test",
srcs = ["tests/test-mem.c"],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "reg_state_test",
srcs = ["tests/test-reg-state.c"],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "static_link_loc_test",
srcs = [
"tests/test-static-link-gen.c",
"tests/test-static-link-loc.c",
],
local_defines = ["UNW_LOCAL_ONLY"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "strerror_test",
srcs = ["tests/test-strerror.c"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
cc_test(
name = "unwind_badjmp_signal_frame_test",
srcs = ["tests/x64-unwind-badjmp-signal-frame.c"],
target_compatible_with = ["@platforms//cpu:x86_64"],
deps = [
":unwind",
":unwind_test_helpers",
],
)
@@ -0,0 +1,21 @@
# Forked from the Bazel Central Registry:
# https://github.com/bazelbuild/bazel-central-registry/blob/main/modules/libunwind/1.8.3/overlay/MODULE.bazel
# Distributed under the Apache License, Version 2.0. See the `registry/modules/
# libunwind/**` entry near the bottom of brpc's LICENSE file.
#
# brpc modification (Apache License 2.0 §4(b)):
# - `version` suffixed with `.brpc-no-unwind` to distinguish this brpc
# variant from the upstream BCR version.
module(
name = "libunwind",
version = "1.8.3.brpc-no-unwind",
bazel_compatibility = [">=7.2.1"], # need support for "overlay" directory
compatibility_level = 0,
)
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "rules_cc", version = "0.1.1")
bazel_dep(name = "xz", version = "5.4.5.bcr.8")
bazel_dep(name = "zlib", version = "1.3.1.bcr.8")
@@ -0,0 +1,18 @@
matrix:
platform:
- debian11
- ubuntu2004
- ubuntu2204
- ubuntu2404
bazel: [7.x, 8.x, rolling]
tasks:
verify_targets:
platform: ${{ platform }}
bazel: ${{ bazel }}
build_targets:
- "@libunwind//:libunwind"
- "@libunwind//:libunwind_coredump"
- "@libunwind//:libunwind_ptrace"
- "@libunwind//:libunwind_setjmp"
test_targets:
- "@libunwind//..."
@@ -0,0 +1,9 @@
{
"url": "https://github.com/libunwind/libunwind/releases/download/v1.8.3/libunwind-1.8.3.tar.gz",
"strip_prefix": "libunwind-1.8.3",
"overlay": {
"BUILD.bazel": "sha256-ozAABv0I3+tacve4z2m+lAh/lhJWh7t7L3unh8FSfp8=",
"MODULE.bazel": "sha256-qimDkl8soxNM/JuqndzGOOcn5ZwGvo2J6CSsNS2/IQs="
},
"integrity": "sha256-vjDZEOZ/WNgudTIx8TV/MmoaCIrPEmsh/3fmCqsZuQs="
}
+19
View File
@@ -0,0 +1,19 @@
{
"homepage": "https://www.nongnu.org/libunwind/",
"maintainers": [
{
"email": "vtsao@openai.com",
"github": "vtsao-openai",
"github_user_id": 176426301,
"name": "Vincent Tsao"
}
],
"repository": [
"github:libunwind/libunwind"
],
"versions": [
"1.8.1.brpc-no-unwind",
"1.8.3.brpc-no-unwind"
],
"yanked_versions": {}
}