[gcc r15-140] libbacktrace: add DLLS as they are loaded
https://gcc.gnu.org/g:b69dac54ef769a33bcdca6de243c1b08e05c7881 commit r15-140-gb69dac54ef769a33bcdca6de243c1b08e05c7881 Author: Ian Lance Taylor Date: Fri May 3 15:23:23 2024 -0700 libbacktrace: add DLLS as they are loaded Patch from Björn Schäpers. * pecoff.c (struct dll_notification_data): Define. (LDR_DLL_NOTIFICATION): New typedef. (LDR_REGISTER_FUNCTION): New typedef. (struct dll_notification_context): Define. (dll_notification): New static function. (backtrace_initialize): Register DLL notification. Diff: --- libbacktrace/pecoff.c | 106 ++ 1 file changed, 106 insertions(+) diff --git a/libbacktrace/pecoff.c b/libbacktrace/pecoff.c index 4f267841178..bbb59e26d7a 100644 --- a/libbacktrace/pecoff.c +++ b/libbacktrace/pecoff.c @@ -61,6 +61,34 @@ POSSIBILITY OF SUCH DAMAGE. */ #undef Module32Next #endif #endif + +#if defined(_ARM_) +#define NTAPI +#else +#define NTAPI __stdcall +#endif + +/* This is a simplified (but binary compatible) version of what Microsoft + defines in their documentation. */ +struct dll_notification_data +{ + ULONG reserved; + /* The name as UNICODE_STRING struct. */ + PVOID full_dll_name; + PVOID base_dll_name; + PVOID dll_base; + ULONG size_of_image; +}; + +#define LDR_DLL_NOTIFICATION_REASON_LOADED 1 + +typedef LONG NTSTATUS; +typedef VOID CALLBACK (*LDR_DLL_NOTIFICATION)(ULONG, + struct dll_notification_data*, + PVOID); +typedef NTSTATUS NTAPI (*LDR_REGISTER_FUNCTION)(ULONG, + LDR_DLL_NOTIFICATION, PVOID, + PVOID*); #endif /* Coff file header. */ @@ -911,6 +939,53 @@ coff_add (struct backtrace_state *state, int descriptor, return 0; } +#ifdef HAVE_WINDOWS_H +struct dll_notification_context +{ + struct backtrace_state *state; + backtrace_error_callback error_callback; + void *data; +}; + +static VOID CALLBACK +dll_notification (ULONG reason, + struct dll_notification_data *notification_data, + PVOID context) +{ + char module_name[MAX_PATH]; + int descriptor; + struct dll_notification_context* dll_context = +(struct dll_notification_context*) context; + struct backtrace_state *state = dll_context->state; + void *data = dll_context->data; + backtrace_error_callback error_callback = dll_context->data; + fileline fileline; + int found_sym; + int found_dwarf; + HMODULE module_handle; + + if (reason != LDR_DLL_NOTIFICATION_REASON_LOADED) +return; + + if (!GetModuleHandleExW ((GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS + | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), + (wchar_t*) notification_data->dll_base, + _handle)) +return; + + if (!GetModuleFileNameA ((HMODULE) module_handle, module_name, MAX_PATH - 1)) +return; + + descriptor = backtrace_open (module_name, error_callback, data, NULL); + + if (descriptor < 0) +return; + + coff_add (state, descriptor, error_callback, data, , _sym, + _dwarf, (uintptr_t) module_handle); +} +#endif /* defined(HAVE_WINDOWS_H) */ + /* Initialize the backtrace data we need from an ELF executable. At the ELF level, all we need to do is find the debug info sections. */ @@ -933,6 +1008,8 @@ backtrace_initialize (struct backtrace_state *state, #endif #ifdef HAVE_WINDOWS_H + HMODULE nt_dll_handle; + module_handle = (uintptr_t) GetModuleHandle (NULL); #endif @@ -980,6 +1057,35 @@ backtrace_initialize (struct backtrace_state *state, } #endif +#ifdef HAVE_WINDOWS_H + nt_dll_handle = GetModuleHandleW (L"ntdll.dll"); + if (nt_dll_handle) +{ + LDR_REGISTER_FUNCTION register_func; + const char register_name[] = "LdrRegisterDllNotification"; + register_func = (void*) GetProcAddress (nt_dll_handle, + register_name); + + if (register_func) + { + PVOID cookie; + struct dll_notification_context *context + = backtrace_alloc (state, + sizeof (struct dll_notification_context), + error_callback, data); + + if (context) + { + context->state = state; + context->data = data; + context->error_callback = error_callback; + + register_func (0, _notification, context, ); + } + } +} +#endif /* defined(HAVE_WINDOWS_H) */ + if (!state->threaded) { if (found_sym)
[gcc r15-53] runtime: dump registers on Solaris
https://gcc.gnu.org/g:a05efc8bf5ed329ea7d9b1740c326bdc6b04e37a commit r15-53-ga05efc8bf5ed329ea7d9b1740c326bdc6b04e37a Author: Ian Lance Taylor Date: Sun Apr 28 13:30:39 2024 -0700 runtime: dump registers on Solaris Patch by Rainer Orth . Fixes PR go/106813 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/581724 Diff: --- gcc/go/gofrontend/MERGE | 2 +- libgo/runtime/go-signal.c | 63 --- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 8a2810d5b2d..9a4b402573a 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -1f0c8364cd35026a647aa4e66ee4d8563c8a5d27 +60f985a7852632834936b4b859aa75d9df88f038 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/runtime/go-signal.c b/libgo/runtime/go-signal.c index aa1b6305ad0..c48c8ee58e3 100644 --- a/libgo/runtime/go-signal.c +++ b/libgo/runtime/go-signal.c @@ -216,6 +216,10 @@ getSiginfoCode(siginfo_t *info) return (uintptr)(info->si_code); } +#if defined(__sparc__) && defined(__arch64__) && defined(__linux__) + #define gregs mc_gregs +#endif + struct getSiginfoRet { uintptr sigaddr; uintptr sigpc; @@ -242,9 +246,9 @@ getSiginfo(siginfo_t *info, void *context __attribute__((unused))) // Use unportable code to pull it from context, and if that fails // try a stack backtrace across the signal handler. -#if defined(__x86_64__) && defined(__linux__) +#if defined(__x86_64__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__))) ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[REG_RIP]; -#elif defined(__i386__) && defined(__linux__) +#elif defined(__i386__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__))) ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[REG_EIP]; #elif defined(__alpha__) && defined(__linux__) ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.sc_pc; @@ -263,6 +267,9 @@ getSiginfo(siginfo_t *info, void *context __attribute__((unused))) #elif defined(__NetBSD__) ret.sigpc = _UC_MACHINE_PC(((ucontext_t*)(context))); #endif +#if defined(__sparc__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__))) + ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[REG_PC]; +#endif if (ret.sigpc == 0) { // Skip getSiginfo/sighandler/sigtrampgo/sigtramp/handler. @@ -285,7 +292,7 @@ void dumpregs(siginfo_t *, void *) void dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((unused))) { -#if defined(__x86_64__) && defined(__linux__) +#if defined(__x86_64__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__))) { mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; @@ -306,12 +313,22 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u runtime_printf("r14%X\n", m->gregs[REG_R14]); runtime_printf("r15%X\n", m->gregs[REG_R15]); runtime_printf("rip%X\n", m->gregs[REG_RIP]); +#if defined(REG_EFL) runtime_printf("rflags %X\n", m->gregs[REG_EFL]); +#elif defined(REG_RFL) + runtime_printf("rflags %X\n", m->gregs[REG_RFL]); +#endif +#if defined(REG_CSGSFS) runtime_printf("cs %X\n", m->gregs[REG_CSGSFS] & 0x); runtime_printf("fs %X\n", (m->gregs[REG_CSGSFS] >> 16) & 0x); runtime_printf("gs %X\n", (m->gregs[REG_CSGSFS] >> 32) & 0x); +#elif defined(REG_CS) && defined(REG_FS) && defined(REG_GS) + runtime_printf("cs %X\n", m->gregs[REG_CS]); + runtime_printf("fs %X\n", m->gregs[REG_FS]); + runtime_printf("gs %X\n", m->gregs[REG_GS]); +#endif } -#elif defined(__i386__) && defined(__linux__) +#elif defined(__i386__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__))) { mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; @@ -423,5 +440,43 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u runtime_printf("pc %X\n", m->pc); runtime_printf("pstate %X\n", m->pstate); } +#elif defined(__sparc__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__))) + { + mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; + +#ifdef __sparcv9 + #define REG_FMT "%X" +#else + #define REG_FMT "%x" +#endif + +#ifdef REG_CCR + runtime_printf("ccr " REG_FMT "\n", m->gregs[REG_CCR]); +#else + runtime_printf("psr " REG_FMT "\n", m->gregs[REG_PSR]); +#endif + runtime_printf("pc " REG_FMT "\n", m->gregs[REG_PC]); +
[gcc r15-52] runtime: use
https://gcc.gnu.org/g:678dc5e85053f1a1ca76997eec95ba8823bb6830 commit r15-52-g678dc5e85053f1a1ca76997eec95ba8823bb6830 Author: Ian Lance Taylor Date: Sun Apr 28 09:57:35 2024 -0700 runtime: use has been available since C99. Use it rather than defining our own boolean type and values. Fixes https://gcc.gnu.org/PR114875 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/582275 Diff: --- gcc/go/gofrontend/MERGE | 2 +- libgo/runtime/runtime.h | 7 +-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 50d430d5034..8a2810d5b2d 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -98e92493db2ab7857a5934a950a830fc1f95a4e5 +1f0c8364cd35026a647aa4e66ee4d8563c8a5d27 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/runtime/runtime.h b/libgo/runtime/runtime.h index 699770d53ad..da31e11bb77 100644 --- a/libgo/runtime/runtime.h +++ b/libgo/runtime/runtime.h @@ -7,6 +7,7 @@ #include "go-assert.h" #include #include +#include #include #include #include @@ -51,7 +52,6 @@ typedef uintptr uintreg; /* Defined types. */ -typedef_Bool bool; typedefuint8 byte; typedefstruct g G; typedefstruct mutex Lock; @@ -114,11 +114,6 @@ extern M* runtime_m(void); extern G* runtime_g(void) __asm__(GOSYM_PREFIX "runtime.getg"); -enum -{ - true= 1, - false = 0, -}; enum { PtrSize = sizeof(void*),
[gcc r15-25] libbacktrace: load Windows modules
https://gcc.gnu.org/g:942a9cf2a958113d2ab46f5b015c36e569abedcf commit r15-25-g942a9cf2a958113d2ab46f5b015c36e569abedcf Author: Ian Lance Taylor Date: Sun Apr 28 11:14:17 2024 -0700 libbacktrace: load Windows modules Patch from Björn Schäpers . * configure.ac: Checked for tlhelp32.h * pecoff.c: Include if available. (backtrace_initialize): Use tlhelp32 api for a snapshot to detect loaded modules. (coff_add): New argument for the module handle of the file, to get the base address. * configure, config.h.in: Regenerate. Diff: --- libbacktrace/config.h.in | 3 ++ libbacktrace/configure| 15 ++ libbacktrace/configure.ac | 4 +++ libbacktrace/pecoff.c | 73 +-- 4 files changed, 87 insertions(+), 8 deletions(-) diff --git a/libbacktrace/config.h.in b/libbacktrace/config.h.in index ee2616335c7..9b8ab88ab63 100644 --- a/libbacktrace/config.h.in +++ b/libbacktrace/config.h.in @@ -101,6 +101,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H +/* Define to 1 if you have the header file. */ +#undef HAVE_TLHELP32_H + /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H diff --git a/libbacktrace/configure b/libbacktrace/configure index d6d6606a72c..ab94a85f45c 100755 --- a/libbacktrace/configure +++ b/libbacktrace/configure @@ -13523,6 +13523,21 @@ fi done +for ac_header in tlhelp32.h +do : + ac_fn_c_check_header_compile "$LINENO" "tlhelp32.h" "ac_cv_header_tlhelp32_h" "#ifdef HAVE_WINDOWS_H +# include +#endif +" +if test "x$ac_cv_header_tlhelp32_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TLHELP32_H 1 +_ACEOF + +fi + +done + # Check for the fcntl function. if test -n "${with_target_subdir}"; then diff --git a/libbacktrace/configure.ac b/libbacktrace/configure.ac index 3e0075a2b79..59e9c415db8 100644 --- a/libbacktrace/configure.ac +++ b/libbacktrace/configure.ac @@ -380,6 +380,10 @@ if test "$have_loadquery" = "yes"; then fi AC_CHECK_HEADERS(windows.h) +AC_CHECK_HEADERS(tlhelp32.h, [], [], +[#ifdef HAVE_WINDOWS_H +# include +#endif]) # Check for the fcntl function. if test -n "${with_target_subdir}"; then diff --git a/libbacktrace/pecoff.c b/libbacktrace/pecoff.c index 9e437d810c7..4f267841178 100644 --- a/libbacktrace/pecoff.c +++ b/libbacktrace/pecoff.c @@ -49,6 +49,18 @@ POSSIBILITY OF SUCH DAMAGE. */ #endif #include + +#ifdef HAVE_TLHELP32_H +#include + +#ifdef UNICODE +/* If UNICODE is defined, all the symbols are replaced by a macro to use the + wide variant. But we need the ansi variant, so undef the macros. */ +#undef MODULEENTRY32 +#undef Module32First +#undef Module32Next +#endif +#endif #endif /* Coff file header. */ @@ -592,7 +604,8 @@ coff_syminfo (struct backtrace_state *state, uintptr_t addr, static int coff_add (struct backtrace_state *state, int descriptor, backtrace_error_callback error_callback, void *data, - fileline *fileline_fn, int *found_sym, int *found_dwarf) + fileline *fileline_fn, int *found_sym, int *found_dwarf, + uintptr_t module_handle ATTRIBUTE_UNUSED) { struct backtrace_view fhdr_view; off_t fhdr_off; @@ -870,12 +883,7 @@ coff_add (struct backtrace_state *state, int descriptor, } #ifdef HAVE_WINDOWS_H - { -uintptr_t module_handle; - -module_handle = (uintptr_t) GetModuleHandle (NULL); -base_address = module_handle - image_base; - } + base_address = module_handle - image_base; #endif if (!backtrace_dwarf_add (state, base_address, _sections, @@ -917,12 +925,61 @@ backtrace_initialize (struct backtrace_state *state, int found_sym; int found_dwarf; fileline coff_fileline_fn; + uintptr_t module_handle = 0; +#ifdef HAVE_TLHELP32_H + fileline module_fileline_fn; + int module_found_sym; + HANDLE snapshot; +#endif + +#ifdef HAVE_WINDOWS_H + module_handle = (uintptr_t) GetModuleHandle (NULL); +#endif ret = coff_add (state, descriptor, error_callback, data, - _fileline_fn, _sym, _dwarf); + _fileline_fn, _sym, _dwarf, module_handle); if (!ret) return 0; +#ifdef HAVE_TLHELP32_H + do +{ + snapshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, 0); +} + while (snapshot == INVALID_HANDLE_VALUE +&& GetLastError () == ERROR_BAD_LENGTH); + + if (snapshot != INVALID_HANDLE_VALUE) +{ + MODULEENTRY32 entry; + BOOL ok; + entry.dwSize = sizeof (MODULEENTRY32); + + for (ok = Module32First (snapshot, ); ok; ok = Module32Next (snapshot, )) + { + if (strcmp (filename, entry.szExePath) == 0) + continue; + + module_handle = (uintptr_t) entry.hModule; + if (module_handle == 0) + continue; + + descriptor = backtrace_open (entry.szExePath, error_callback, data, + NULL); +
[gcc r14-10095] libbacktrace: test --compress-debug-sections=ARG for each ARG
https://gcc.gnu.org/g:d2f05fed44951001de3cb02c9193c687e9376170 commit r14-10095-gd2f05fed44951001de3cb02c9193c687e9376170 Author: Ian Lance Taylor Date: Tue Apr 23 10:00:03 2024 -0700 libbacktrace: test --compress-debug-sections=ARG for each ARG This should fix a testsuite problem with Solaris ld that supports zlib but not zlib-gabi. * configure.ac: Test --compress-debug-sections=zlib-gnu and --compress-debug-sections=zlib-gabi separately, setting new automake conditionals. * Makefile.am (ctestg, ctestg_alloc): Only build if HAVE_COMPRESSED_DEBUG_ZLIB_GNU. (ctesta, ctesta_alloc): Only build if HAVE_COMPRESSED_DEBUG_ZLIB_GABI. (ctestzstd_alloc): New test if HAVE_COMPRESSED_DEBUG_ZSTD. * configure, Makefile.in: Regenerate. Diff: --- libbacktrace/Makefile.am | 41 ++ libbacktrace/Makefile.in | 186 +++--- libbacktrace/configure| 80 +++- libbacktrace/configure.ac | 23 -- 4 files changed, 214 insertions(+), 116 deletions(-) diff --git a/libbacktrace/Makefile.am b/libbacktrace/Makefile.am index 5677ecd8865..bed42c29329 100644 --- a/libbacktrace/Makefile.am +++ b/libbacktrace/Makefile.am @@ -493,19 +493,37 @@ endif HAVE_OBJCOPY_DEBUGLINK $< $(OBJCOPY) --strip-all $< $@ -if HAVE_COMPRESSED_DEBUG +if HAVE_COMPRESSED_DEBUG_ZLIB_GNU ctestg_SOURCES = btest.c testlib.c ctestg_CFLAGS = $(libbacktrace_TEST_CFLAGS) ctestg_LDFLAGS = -Wl,--compress-debug-sections=zlib-gnu $(libbacktrace_testing_ldflags) ctestg_LDADD = libbacktrace.la +ctestg_alloc_SOURCES = $(ctestg_SOURCES) +ctestg_alloc_CFLAGS = $(ctestg_CFLAGS) +ctestg_alloc_LDFLAGS = $(ctestg_LDFLAGS) $(libbacktrace_testing_ldflags) +ctestg_alloc_LDADD = libbacktrace_alloc.la + +BUILDTESTS += ctestg ctestg_alloc + +endif + +if HAVE_COMPRESSED_DEBUG_ZLIB_GABI + ctesta_SOURCES = btest.c testlib.c ctesta_CFLAGS = $(libbacktrace_TEST_CFLAGS) ctesta_LDFLAGS = -Wl,--compress-debug-sections=zlib-gabi $(libbacktrace_testing_ldflags) ctesta_LDADD = libbacktrace.la -BUILDTESTS += ctestg ctesta +ctesta_alloc_SOURCES = $(ctesta_SOURCES) +ctesta_alloc_CFLAGS = $(ctesta_CFLAGS) +ctesta_alloc_LDFLAGS = $(ctesta_LDFLAGS) $(libbacktrace_testing_ldflags) +ctesta_alloc_LDADD = libbacktrace_alloc.la + +BUILDTESTS += ctesta ctesta_alloc + +endif if HAVE_COMPRESSED_DEBUG_ZSTD @@ -514,21 +532,12 @@ ctestzstd_CFLAGS = $(libbacktrace_TEST_CFLAGS) ctestzstd_LDFLAGS = -Wl,--compress-debug-sections=zstd $(libbacktrace_testing_ldflags) ctestzstd_LDADD = libbacktrace.la -BUILDTESTS += ctestzstd - -endif - -ctestg_alloc_SOURCES = $(ctestg_SOURCES) -ctestg_alloc_CFLAGS = $(ctestg_CFLAGS) -ctestg_alloc_LDFLAGS = $(ctestg_LDFLAGS) $(libbacktrace_testing_ldflags) -ctestg_alloc_LDADD = libbacktrace_alloc.la - -ctesta_alloc_SOURCES = $(ctesta_SOURCES) -ctesta_alloc_CFLAGS = $(ctesta_CFLAGS) -ctesta_alloc_LDFLAGS = $(ctesta_LDFLAGS) $(libbacktrace_testing_ldflags) -ctesta_alloc_LDADD = libbacktrace_alloc.la +ctestzstd_alloc_SOURCES = $(ctestzstd_SOURCES) +ctestzstd_alloc_CFLAGS = $(ctestzstd_CFLAGS) +ctestzstd_alloc_LDFLAGS = $(ctestzstd_LDFLAGS) $(libbacktrace_testing_ldflags) +ctestzstd_alloc_LDADD = libbacktrace_alloc.la -BUILDTESTS += ctestg_alloc ctesta_alloc +BUILDTESTS += ctestzstd ctestzstd_alloc endif diff --git a/libbacktrace/Makefile.in b/libbacktrace/Makefile.in index 49852a21d37..0260ca81798 100644 --- a/libbacktrace/Makefile.in +++ b/libbacktrace/Makefile.in @@ -153,9 +153,9 @@ TESTS = $(am__append_4) $(MAKETESTS) $(am__EXEEXT_16) @HAVE_PTHREAD_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@ttest.dSYM \ @HAVE_PTHREAD_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@ttest_alloc.dSYM @HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_22 = btest_gnudebuglink btest_gnudebuglinkfull -@HAVE_COMPRESSED_DEBUG_TRUE@@NATIVE_TRUE@am__append_23 = ctestg ctesta -@HAVE_COMPRESSED_DEBUG_TRUE@@HAVE_COMPRESSED_DEBUG_ZSTD_TRUE@@NATIVE_TRUE@am__append_24 = ctestzstd -@HAVE_COMPRESSED_DEBUG_TRUE@@NATIVE_TRUE@am__append_25 = ctestg_alloc ctesta_alloc +@HAVE_COMPRESSED_DEBUG_ZLIB_GNU_TRUE@@NATIVE_TRUE@am__append_23 = ctestg ctestg_alloc +@HAVE_COMPRESSED_DEBUG_ZLIB_GABI_TRUE@@NATIVE_TRUE@am__append_24 = ctesta ctesta_alloc +@HAVE_COMPRESSED_DEBUG_ZSTD_TRUE@@NATIVE_TRUE@am__append_25 = ctestzstd ctestzstd_alloc @HAVE_DWARF5_TRUE@@NATIVE_TRUE@am__append_26 = dwarf5 dwarf5_alloc @HAVE_DWARF5_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@am__append_27 = \ @HAVE_DWARF5_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@ dwarf5.dSYM \ @@ -239,12 +239,12 @@ libbacktrace_noformat_la_OBJECTS = \ @NATIVE_TRUE@am__EXEEXT_8 = edtest$(EXEEXT) edtest_alloc$(EXEEXT) @HAVE_PTHREAD_TRUE@@NATIVE_TRUE@am__EXEEXT_9 = ttest$(EXEEXT) \ @HAVE_PTHREAD_TRUE@@NATIVE_TRUE@ ttest_alloc$(EXEEXT) -@HAVE_COMPRESSED_DEBUG_TRUE@@NATIVE_TRUE@am__EXEEXT_10 = \
[gcc r14-9698] compiler: use correct size and comparison in index value overflow check
https://gcc.gnu.org/g:bd8a3eecc4edffad6e5091ae42c1cb1c1730b2ab commit r14-9698-gbd8a3eecc4edffad6e5091ae42c1cb1c1730b2ab Author: Ian Lance Taylor Date: Wed Mar 27 13:37:45 2024 -0700 compiler: use correct size and comparison in index value overflow check This has apparently been wrong since I introduced the code ten years ago. Fixes PR go/114500 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/574835 Diff: --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/expressions.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index de6e21fb3b5..50d430d5034 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -3f597287b6b858794dabdfe1bf83b386aad18102 +98e92493db2ab7857a5934a950a830fc1f95a4e5 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 8429e553eac..238d5a56ca2 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -18790,7 +18790,7 @@ Composite_literal_expression::lower_array(Type* type) Named_type* ntype = Type::lookup_integer_type("int"); Integer_type* inttype = ntype->integer_type(); - if (sizeof(index) <= static_cast(inttype->bits() * 8) + if (sizeof(index) >= static_cast(inttype->bits() / 8) && index >> (inttype->bits() - 1) != 0) { go_error_at(index_expr->location(), "index value overflow");
[gcc r14-9695] gcc/testsuite/go.test: update issue16016
https://gcc.gnu.org/g:9ff034fcff8ccab6eb82bf2cd36e2d24b2df9b78 commit r14-9695-g9ff034fcff8ccab6eb82bf2cd36e2d24b2df9b78 Author: Ian Lance Taylor Date: Wed Mar 27 11:44:42 2024 -0700 gcc/testsuite/go.test: update issue16016 This backports https://go.dev/cl/574536 into the GCC testsuite. Fixes PR go/114453 Diff: --- gcc/testsuite/go.test/test/fixedbugs/issue16016.go | 18 -- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue16016.go b/gcc/testsuite/go.test/test/fixedbugs/issue16016.go index e738e1dba0e..b1947f5548d 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/issue16016.go +++ b/gcc/testsuite/go.test/test/fixedbugs/issue16016.go @@ -6,7 +6,10 @@ package main -import "time" +import ( + "runtime" + "time" +) type T struct{} @@ -24,8 +27,19 @@ type Q interface { } func main() { + var count = 1 + if runtime.Compiler == "gccgo" { + // On targets without split-stack libgo allocates + // a large stack for each goroutine. On 32-bit + // systems this test can run out of memory. + const intSize = 32 << (^uint(0) >> 63) // 32 or 64 + if intSize < 64 { + count = 100 + } + } + var q Q = {{}} - for i := 0; i < 1; i++ { + for i := 0; i < count; i++ { go func() { defer q.Foo([]interface{}{"meow"}) time.Sleep(100 * time.Millisecond)
[gcc r14-9693] compiler: initialize local variable in lower_method_expression
https://gcc.gnu.org/g:f85d3362cdb4bab611508dd9a38d9015c02ff7ca commit r14-9693-gf85d3362cdb4bab611508dd9a38d9015c02ff7ca Author: Ian Lance Taylor Date: Tue Mar 26 13:00:03 2024 -0700 compiler: initialize local variable in lower_method_expression Fixes PR go/114463 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/574476 Diff: --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/expressions.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 73cb095322c..de6e21fb3b5 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -e15a14e410b8fc5d28012d5b313cb6c8476c7df9 +3f597287b6b858794dabdfe1bf83b386aad18102 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 51ff0206129..8429e553eac 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -9059,7 +9059,7 @@ Selector_expression::lower_method_expression(Gogo* gogo) Named_type* nt = type->named_type(); Struct_type* st = type->struct_type(); - bool is_ambiguous; + bool is_ambiguous = false; Method* method = NULL; if (nt != NULL) method = nt->method_function(name, _ambiguous);
[gcc r14-9402] libbacktrace: don't assume compressed section is aligned
https://gcc.gnu.org/g:5825bd0e0d0040126e78269e56c9b9f533e2a520 commit r14-9402-g5825bd0e0d0040126e78269e56c9b9f533e2a520 Author: Ian Lance Taylor Date: Fri Mar 8 13:55:34 2024 -0800 libbacktrace: don't assume compressed section is aligned Patch originally by GitHub user ubyte at https://github.com/ianlancetaylor/libbacktrace/pull/120. * elf.c (elf_uncompress_chdr): Don't assume compressed section is aligned. Diff: --- libbacktrace/elf.c | 23 +-- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/libbacktrace/elf.c b/libbacktrace/elf.c index 7841c86cd9c..3cd87020b03 100644 --- a/libbacktrace/elf.c +++ b/libbacktrace/elf.c @@ -5076,7 +5076,7 @@ elf_uncompress_chdr (struct backtrace_state *state, backtrace_error_callback error_callback, void *data, unsigned char **uncompressed, size_t *uncompressed_size) { - const b_elf_chdr *chdr; + b_elf_chdr chdr; char *alc; size_t alc_len; unsigned char *po; @@ -5088,27 +5088,30 @@ elf_uncompress_chdr (struct backtrace_state *state, if (compressed_size < sizeof (b_elf_chdr)) return 1; - chdr = (const b_elf_chdr *) compressed; + /* The lld linker can misalign a compressed section, so we can't safely read + the fields directly as we can for other ELF sections. See + https://github.com/ianlancetaylor/libbacktrace/pull/120. */ + memcpy (, compressed, sizeof (b_elf_chdr)); alc = NULL; alc_len = 0; - if (*uncompressed != NULL && *uncompressed_size >= chdr->ch_size) + if (*uncompressed != NULL && *uncompressed_size >= chdr.ch_size) po = *uncompressed; else { - alc_len = chdr->ch_size; + alc_len = chdr.ch_size; alc = backtrace_alloc (state, alc_len, error_callback, data); if (alc == NULL) return 0; po = (unsigned char *) alc; } - switch (chdr->ch_type) + switch (chdr.ch_type) { case ELFCOMPRESS_ZLIB: if (!elf_zlib_inflate_and_verify (compressed + sizeof (b_elf_chdr), compressed_size - sizeof (b_elf_chdr), - zdebug_table, po, chdr->ch_size)) + zdebug_table, po, chdr.ch_size)) goto skip; break; @@ -5116,7 +5119,7 @@ elf_uncompress_chdr (struct backtrace_state *state, if (!elf_zstd_decompress (compressed + sizeof (b_elf_chdr), compressed_size - sizeof (b_elf_chdr), (unsigned char *)zdebug_table, po, - chdr->ch_size)) + chdr.ch_size)) goto skip; break; @@ -5126,7 +5129,7 @@ elf_uncompress_chdr (struct backtrace_state *state, } *uncompressed = po; - *uncompressed_size = chdr->ch_size; + *uncompressed_size = chdr.ch_size; return 1; @@ -6876,8 +6879,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, } } - // A debuginfo file may not have a useful .opd section, but we can use the - // one from the original executable. + /* A debuginfo file may not have a useful .opd section, but we can use the + one from the original executable. */ if (opd == NULL) opd = caller_opd;