From patchwork Fri Jan 29 19:43:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nick Desaulniers X-Patchwork-Id: 12056423 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AF703C433E9 for ; Fri, 29 Jan 2021 19:44:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7CE4164E18 for ; Fri, 29 Jan 2021 19:44:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232803AbhA2ToR (ORCPT ); Fri, 29 Jan 2021 14:44:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51948 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232727AbhA2ToH (ORCPT ); Fri, 29 Jan 2021 14:44:07 -0500 Received: from mail-qk1-x749.google.com (mail-qk1-x749.google.com [IPv6:2607:f8b0:4864:20::749]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7C957C0613ED for ; Fri, 29 Jan 2021 11:43:26 -0800 (PST) Received: by mail-qk1-x749.google.com with SMTP id v130so7903966qkb.14 for ; Fri, 29 Jan 2021 11:43:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=T0BCD++IafOESsvir6N/Nl3Poh+QbVCsSZz/sfNR8xA=; b=svdb9knN6UPETzRcL79VyvAk4LAzs2FywJw+89K/C31jcuASLR/ezP7KyuzrAgOa+4 S8J5iYMOu0HH13/Nq+b36dW8xomNOiEky4nst8pj8KoRMI0HsfCVVXkIm2DjY2l1CBUb ThknPlYIq5T/+c9/TBQ7QEtRMhxyRLVmHnbz/bfONWJhXW/74+4NmRDw7lE/SeRGb+JU +Mc8QrdHUAVbiD+5VfsnkYPxKCN8A5PsF+blI0NC3R/rq2SCrtMIHSg2MlFxdAET+nx3 W1PKFBmwE89Ea7VIrC0nDdZN5msg1HCyTkDz/YngU6s36o+mwrj8Bmxu0wm+VgZ+H1oJ w1Sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=T0BCD++IafOESsvir6N/Nl3Poh+QbVCsSZz/sfNR8xA=; b=aqGF5+xopM9kodYLzdichz5yBeBYT2D18RkUGV4WaLIAVNozVViroPxWHxD8y4l/eJ FiV8Hhy0QQQ99DyLGOyYbCMxW3jwIIo/QcmqYxG5DYASq7UBPl3dq/VuwBU5MmNlUPSV hLt6xpjyFyV4/TZ7UIMfuW86LSHclYYhnklWH0LfR1Sy1S0S6fRx54SCCfRql0EvCzVF fj0n8wt+7fM2PdQ8rrmUPlPadiBSNuz/fPCtp1kfgBueSZAYRoANt/niXscFJYSO9OxV 4AbYcAGhJxV1Pk78aPCkyCTVsIYc5rYowXxoBvnUySvEXSZ4OgAzyIoZc6f+HJbHja33 DywQ== X-Gm-Message-State: AOAM533VQh4o7iizUw5cnRqknf/HVKmIi4inczqxuHvSIT1YbAbBW8U2 1h1xtEWjMR4BPH32d8gheLFQ6krz4phcH90Hg9s= X-Google-Smtp-Source: ABdhPJxj8YBkkWzNp9cuQValdk/w0zgRUcS7K4d1oFXhPIdW0LqdanFcuBJEM8UJCVS1MJr020p3wL1PXKQbUujY6pY= Sender: "ndesaulniers via sendgmr" X-Received: from ndesaulniers1.mtv.corp.google.com ([2620:15c:211:202:f693:9fff:fef4:4d25]) (user=ndesaulniers job=sendgmr) by 2002:a05:6214:3f0:: with SMTP id cf16mr5289648qvb.25.1611949405727; Fri, 29 Jan 2021 11:43:25 -0800 (PST) Date: Fri, 29 Jan 2021 11:43:17 -0800 In-Reply-To: <20210129194318.2125748-1-ndesaulniers@google.com> Message-Id: <20210129194318.2125748-2-ndesaulniers@google.com> Mime-Version: 1.0 References: <20210129194318.2125748-1-ndesaulniers@google.com> X-Mailer: git-send-email 2.30.0.365.g02bc693789-goog Subject: [PATCH v6 1/2] Kbuild: make DWARF version a choice From: Nick Desaulniers To: Masahiro Yamada Cc: Nathan Chancellor , Andrew Morton , Sedat Dilek , linux-kernel@vger.kernel.org, clang-built-linux@googlegroups.com, linux-kbuild@vger.kernel.org, linux-arch@vger.kernel.org, Jakub Jelinek , Fangrui Song , Caroline Tice , Nick Clifton , Yonghong Song , Jiri Olsa , Andrii Nakryiko , Arnaldo Carvalho de Melo , Nick Desaulniers , Arvind Sankar , Nathan Chancellor Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org Modifies CONFIG_DEBUG_INFO_DWARF4 to be a member of a choice. Adds an explicit CONFIG_DEBUG_INFO_DWARF2, which is the default. Does so in a way that's forward compatible with existing configs, and makes adding future versions more straightforward. Suggested-by: Arvind Sankar Suggested-by: Fangrui Song Suggested-by: Nathan Chancellor Suggested-by: Masahiro Yamada Signed-off-by: Nick Desaulniers --- Makefile | 6 +++--- lib/Kconfig.debug | 21 ++++++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 95ab9856f357..20141cd9319e 100644 --- a/Makefile +++ b/Makefile @@ -830,9 +830,9 @@ ifneq ($(LLVM_IAS),1) KBUILD_AFLAGS += -Wa,-gdwarf-2 endif -ifdef CONFIG_DEBUG_INFO_DWARF4 -DEBUG_CFLAGS += -gdwarf-4 -endif +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 +DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) ifdef CONFIG_DEBUG_INFO_REDUCED DEBUG_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly) \ diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index e906ea906cb7..1850728b23e6 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -256,13 +256,24 @@ config DEBUG_INFO_SPLIT to know about the .dwo files and include them. Incompatible with older versions of ccache. +choice + prompt "DWARF version" + help + Which version of DWARF debug info to emit. + +config DEBUG_INFO_DWARF2 + bool "Generate DWARF Version 2 debuginfo" + help + Generate DWARF v2 debug info. + config DEBUG_INFO_DWARF4 - bool "Generate dwarf4 debuginfo" + bool "Generate DWARF Version 4 debuginfo" help - Generate dwarf4 debug info. This requires recent versions - of gcc and gdb. It makes the debug information larger. - But it significantly improves the success of resolving - variables in gdb on optimized code. + Generate DWARF v4 debug info. This requires gcc 4.5+ and gdb 7.0+. + It makes the debug information larger, but it significantly + improves the success of resolving variables in gdb on optimized code. + +endchoice # "DWARF version" config DEBUG_INFO_BTF bool "Generate BTF typeinfo" From patchwork Fri Jan 29 19:43:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nick Desaulniers X-Patchwork-Id: 12056425 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 584D3C433DB for ; Fri, 29 Jan 2021 19:45:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 121AB64E12 for ; Fri, 29 Jan 2021 19:45:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233033AbhA2Toy (ORCPT ); Fri, 29 Jan 2021 14:44:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233011AbhA2Tos (ORCPT ); Fri, 29 Jan 2021 14:44:48 -0500 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 24054C06178A for ; Fri, 29 Jan 2021 11:43:28 -0800 (PST) Received: by mail-pf1-x449.google.com with SMTP id o77so6555390pfd.9 for ; Fri, 29 Jan 2021 11:43:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=GEKeeKHmAPTG6av/vdrBVpAGk6oSoBQtlWTtIBlm4NE=; b=O/MlbpWrVzwE85YBqbu4bab6e/sn9OUJTh2gu3olaKEE7JV8wCBOK1eBgFZw0d9CAO KdQDGlLzmMo+Ac6IiPlOYU52gHbP/5+dgxmLfbLFJ33FBfVbKP6e61i9G1Cs+tuh4DP8 /boP0iylHA9H2Omh7EZVAQlTK8Nseoj2Jze+b5bc3uFhFfvKsaMP5rjNnfNE66kZCV68 npYEy0IPSJWbZ2Xe+PflWNfVSvrtXGu/M+D+NGUDfSsjlF2rsCT3NAIfwEi2lUv7d88M nVN13rHwdT44uWV4YVIev4dZIa5etcxgyJyNcPmDAiyN4K3z6JX4/Zfy/k04GWoRyZu6 BeBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=GEKeeKHmAPTG6av/vdrBVpAGk6oSoBQtlWTtIBlm4NE=; b=cvqIio7SsIG19K0eceUKIAHzRjg9el4r4LfpDQujXRdvs1T5MyJAgvRSuzDeMr4Zzl hRTHH+n+CiL3lNlX9t0W+pK39DMVCti9XSh40kIGSEMIokXFFosUfByO+qNBWhQMpHx0 g4aO+OMuUnCu7S2xn4i9OS+S5Qvb7tFXpQSrejq1VGKPZy7bfLvi3XP90EUpWN39Nn6b 5XcVpV1nXTIkJfnnegKw7k8bpt8zG2VzG02LqrmO1XUPu1gw1bwMA0x2DToloapZzAQ/ QYRXvOayu3dpZk8V19oy/dLRLIP2TOSfUACe0QWwUv23ahzZ6vOUWhqOX7u1uuE/r8EL WnHQ== X-Gm-Message-State: AOAM530ORbGhRMHKbdMHNegGS2AXSqe/mpT1VOri6lFnMrVOTYjwav4f S7nsMo7YfAkshDJSr4hg5sW0au9ffUs5R1KuaXs= X-Google-Smtp-Source: ABdhPJzdpg/y8Jsls9v2C/jVstr7a7flmubHPF/IGx6CsDLMwIGtJq/fBysFPY+5TqTuPOpsQN4q2rJdT9BdHFCPtWY= Sender: "ndesaulniers via sendgmr" X-Received: from ndesaulniers1.mtv.corp.google.com ([2620:15c:211:202:f693:9fff:fef4:4d25]) (user=ndesaulniers job=sendgmr) by 2002:a17:902:ee14:b029:de:19f0:91b4 with SMTP id z20-20020a170902ee14b02900de19f091b4mr5652880plb.78.1611949407609; Fri, 29 Jan 2021 11:43:27 -0800 (PST) Date: Fri, 29 Jan 2021 11:43:18 -0800 In-Reply-To: <20210129194318.2125748-1-ndesaulniers@google.com> Message-Id: <20210129194318.2125748-3-ndesaulniers@google.com> Mime-Version: 1.0 References: <20210129194318.2125748-1-ndesaulniers@google.com> X-Mailer: git-send-email 2.30.0.365.g02bc693789-goog Subject: [PATCH v6 2/2] Kbuild: implement support for DWARF v5 From: Nick Desaulniers To: Masahiro Yamada Cc: Nathan Chancellor , Andrew Morton , Sedat Dilek , linux-kernel@vger.kernel.org, clang-built-linux@googlegroups.com, linux-kbuild@vger.kernel.org, linux-arch@vger.kernel.org, Jakub Jelinek , Fangrui Song , Caroline Tice , Nick Clifton , Yonghong Song , Jiri Olsa , Andrii Nakryiko , Arnaldo Carvalho de Melo , Nick Desaulniers , Arvind Sankar Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org DWARF v5 is the latest standard of the DWARF debug info format. Feature detection of DWARF5 is onerous, especially given that we've removed $(AS), so we must query $(CC) for DWARF5 assembler directive support. The DWARF version of a binary can be validated with: $ llvm-dwarfdump vmlinux | head -n 4 | grep version or $ readelf --debug-dump=info vmlinux 2>/dev/null | grep Version DWARF5 wins significantly in terms of size when mixed with compression (CONFIG_DEBUG_INFO_COMPRESSED). 363M vmlinux.clang12.dwarf5.compressed 434M vmlinux.clang12.dwarf4.compressed 439M vmlinux.clang12.dwarf2.compressed 457M vmlinux.clang12.dwarf5 536M vmlinux.clang12.dwarf4 548M vmlinux.clang12.dwarf2 515M vmlinux.gcc10.2.dwarf5.compressed 599M vmlinux.gcc10.2.dwarf4.compressed 624M vmlinux.gcc10.2.dwarf2.compressed 630M vmlinux.gcc10.2.dwarf5 765M vmlinux.gcc10.2.dwarf4 809M vmlinux.gcc10.2.dwarf2 Though the quality of debug info is harder to quantify; size is not a proxy for quality. Jakub notes: All [GCC] 5.1 - 6.x did was start accepting -gdwarf-5 as experimental option that enabled some small DWARF subset (initially only a few DW_LANG_* codes newly added to DWARF5 drafts). Only GCC 7 (released after DWARF 5 has been finalized) started emitting DWARF5 section headers and got most of the DWARF5 changes in... Version check GCC so that we don't need to worry about the difference in command line args between GNU readelf and llvm-readelf/llvm-dwarfdump to validate the DWARF Version in the assembler feature detection script. GNU `as` only recently gained support for specifying -gdwarf-5, so when compiling with Clang but without Clang's integrated assembler (LLVM_IAS=1 is not set), explicitly add -Wa,-gdwarf-5 to DEBUG_CFLAGS. Disabled for now if CONFIG_DEBUG_INFO_BTF is set; pahole doesn't yet recognize the new additions to the DWARF debug info. Thanks to Sedat for the report. Link: http://www.dwarfstd.org/doc/DWARF5.pdf Reported-by: Sedat Dilek Suggested-by: Arvind Sankar Suggested-by: Caroline Tice Suggested-by: Fangrui Song Suggested-by: Jakub Jelinek Suggested-by: Masahiro Yamada Suggested-by: Nathan Chancellor Signed-off-by: Nick Desaulniers --- Makefile | 12 ++++++++++++ include/asm-generic/vmlinux.lds.h | 6 +++++- lib/Kconfig.debug | 18 ++++++++++++++++++ scripts/test_dwarf5_support.sh | 8 ++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100755 scripts/test_dwarf5_support.sh diff --git a/Makefile b/Makefile index 20141cd9319e..bed8b3b180b8 100644 --- a/Makefile +++ b/Makefile @@ -832,8 +832,20 @@ endif dwarf-version-$(CONFIG_DEBUG_INFO_DWARF2) := 2 dwarf-version-$(CONFIG_DEBUG_INFO_DWARF4) := 4 +dwarf-version-$(CONFIG_DEBUG_INFO_DWARF5) := 5 DEBUG_CFLAGS += -gdwarf-$(dwarf-version-y) +# If using clang without the integrated assembler, we need to explicitly tell +# GAS that we will be feeding it DWARF v5 assembler directives. Kconfig should +# detect whether the version of GAS supports DWARF v5. +ifdef CONFIG_CC_IS_CLANG +ifneq ($(LLVM_IAS),1) +ifeq ($(dwarf-version-y),5) +DEBUG_CFLAGS += -Wa,-gdwarf-5 +endif +endif +endif + ifdef CONFIG_DEBUG_INFO_REDUCED DEBUG_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly) \ $(call cc-option,-fno-var-tracking) diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 34b7e0d2346c..f8d5455cd87f 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -843,7 +843,11 @@ .debug_types 0 : { *(.debug_types) } \ /* DWARF 5 */ \ .debug_macro 0 : { *(.debug_macro) } \ - .debug_addr 0 : { *(.debug_addr) } + .debug_addr 0 : { *(.debug_addr) } \ + .debug_line_str 0 : { *(.debug_line_str) } \ + .debug_loclists 0 : { *(.debug_loclists) } \ + .debug_rnglists 0 : { *(.debug_rnglists) } \ + .debug_str_offsets 0 : { *(.debug_str_offsets) } /* Stabs debugging sections. */ #define STABS_DEBUG \ diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 1850728b23e6..09146b1af20d 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -273,6 +273,24 @@ config DEBUG_INFO_DWARF4 It makes the debug information larger, but it significantly improves the success of resolving variables in gdb on optimized code. +config DEBUG_INFO_DWARF5 + bool "Generate DWARF Version 5 debuginfo" + depends on GCC_VERSION >= 50000 || CC_IS_CLANG + depends on CC_IS_GCC || $(success,$(srctree)/scripts/test_dwarf5_support.sh $(CC) $(CLANG_FLAGS)) + depends on !DEBUG_INFO_BTF + help + Generate DWARF v5 debug info. Requires binutils 2.35, gcc 5.0+ (gcc + 5.0+ accepts the -gdwarf-5 flag but only had partial support for some + draft features until 7.0), and gdb 8.0+. + + Changes to the structure of debug info in Version 5 allow for around + 15-18% savings in resulting image and debug info section sizes as + compared to DWARF Version 4. DWARF Version 5 standardizes previous + extensions such as accelerators for symbol indexing and the format + for fission (.dwo/.dwp) files. Users may not want to select this + config if they rely on tooling that has not yet been updated to + support DWARF Version 5. + endchoice # "DWARF version" config DEBUG_INFO_BTF diff --git a/scripts/test_dwarf5_support.sh b/scripts/test_dwarf5_support.sh new file mode 100755 index 000000000000..1a00484d0b2e --- /dev/null +++ b/scripts/test_dwarf5_support.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +# Test that assembler accepts -gdwarf-5 and .file 0 directives, which were bugs +# in binutils < 2.35. +# https://sourceware.org/bugzilla/show_bug.cgi?id=25612 +# https://sourceware.org/bugzilla/show_bug.cgi?id=25614 +echo '.file 0 "filename"' | $* -gdwarf-5 -Wa,-gdwarf-5 -c -x assembler -o /dev/null -