Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp288599pxb; Fri, 15 Jan 2021 13:09:38 -0800 (PST) X-Google-Smtp-Source: ABdhPJxcu6wQrEoEaCCfbFOnu7R2dnvBUEuHfe6cB5un9sOgTYq/MpOjUIFpEBonu3KBr0CQz3HP X-Received: by 2002:a17:906:a2d0:: with SMTP id by16mr9931783ejb.207.1610744978391; Fri, 15 Jan 2021 13:09:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610744978; cv=none; d=google.com; s=arc-20160816; b=OFMs0NgSJJLxyFWwLk0c+TKIzB6oj/nnk5Wt/LIF3TUS1tCyk7zCqluGT4noiS7Xen cwgCLdfgDmFGyScO7fWuVSbP0+32X9LtTtHzXrCzZMvjpV2+lWb9/l2PYOG43SLwRX0m sQtuIAE9PeFbI5yTdC9JwOdJuPey5fRltSgld7+pn9J2Z4dTZEKhQvsbyX2nq96dXSwz YQjP7gXMq+yj6TSbRbJBUs77WgNoEO1yiyDw90A/0a/osQmjtT+xUG03Rgay9UMfZjVa YMw97BjXmFM2zGywrNQ+kHwomaktIgkEufojmXMTOnUnheNemwK6EhjthQaRKayb+kiY jIwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:sender:dkim-signature; bh=hLpMcuoMrHdKRuRQ10ZvVy2SGH1r/TsEXPc2P6puki0=; b=alH1idR4sK1bMcI0VsbNPdIyAAZpC8GeQsZpNE5/y2evX90EFmEj2zD2sLCPqH4Xp5 pq0lXId7l8YQmiFkEGWwAZ0dOPSDDiONSh5sBZawTRScj1ayCgs6fW+1j9bnxjY2kW+0 W+hqgb5Ou+661VTe2ii5TGtk+FxLwFlcWMXdXMB2E90VcOIh3T/OA22n/Y+h8QX+HTmn SikZN+eQhGc6sEt5N0vlOeyznCes4REWqpVp93aChyeJ5WoRVxKDXiYtOQn5dE7FXmFB BcDuM+aoJ4amDyMVo/ziJSV+/lP12qIi4T0fdHcUgk2yMRsOVAXjyDaP0+NGj0pQY15D S3gQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=dhblPhm4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cd17si1536428ejb.68.2021.01.15.13.09.14; Fri, 15 Jan 2021 13:09:38 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=dhblPhm4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387976AbhAOVHs (ORCPT + 99 others); Fri, 15 Jan 2021 16:07:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37430 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730479AbhAOVHn (ORCPT ); Fri, 15 Jan 2021 16:07:43 -0500 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 490F9C06179C for ; Fri, 15 Jan 2021 13:06:26 -0800 (PST) Received: by mail-pl1-x64a.google.com with SMTP id y5so6327395plr.19 for ; Fri, 15 Jan 2021 13:06: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=hLpMcuoMrHdKRuRQ10ZvVy2SGH1r/TsEXPc2P6puki0=; b=dhblPhm4OIYmnwojsilrkFNxLqnupCh8eqOh5LRrpET0mTWlLnA6wQQksaxWijQR+1 mRa83zB0XYQrBHpmkiNRu57SzRLWrnCK1qCWLrXt9Au1AHOHqSze7KcEEZnCld8zX1Cf q+zIKt3b/wFQRYFxLUtFFH9ApV9pPaRTQ95eAODEWRdEdaGckeUR6R7quwpjA48d81CO T2YGnyGubzHG51nQ98xBiO7HPw4SEuiBa+yGX9Xpi2dOhHm5ua7QHpW6uSvuECAB0gO4 9qWvu/UeqKxH+547BHZ1AEhTTFcKhld+T7qL5GC0bfl+Jrk13Ms6Q1fZxRRu4eFlU1uG AUfg== 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=hLpMcuoMrHdKRuRQ10ZvVy2SGH1r/TsEXPc2P6puki0=; b=gmVXOqTtMk0p2K+9fKR0i+7wQPfS3LD/ChpxCbm4x22G91MJnEMa/Z1ryIa2d/lDIX yfsGvZpKqhVP0IQxdrdTTxx78SQszWS44jKLbreUlW1+bm3xa3FOG8t4PrkCEUtMSy/H JQBzVYj6AlAIdr78rPwpxuw8RF+E8LBNsu4A/dkd4oDAPEDRrAfB26pAvsqyTdErsE27 0gfINrVhVofvjl+PMw1ns2v11RahMLt4iuLfMi05Jqn4JI9ICdI65YeAIuNV2tiRjSsm QO1G1SacfUhe3gQ2MwDKlCSK6J196Fe9GTHegDF+eMocEQOs15idxgr6vxhZcfNuM1sd JxAg== X-Gm-Message-State: AOAM533KgLAaUHyENY3dgNf8IFTO20phhs+dOEE5+M+lP6/If2OTGGTS rz5uOHCJ4xp/NWHlr1LzXDmvFSfgacGIvSLZQdw= 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:a62:ac09:0:b029:1a9:dd65:2f46 with SMTP id v9-20020a62ac090000b02901a9dd652f46mr14422249pfe.15.1610744785693; Fri, 15 Jan 2021 13:06:25 -0800 (PST) Date: Fri, 15 Jan 2021 13:06:16 -0800 In-Reply-To: <20210115210616.404156-1-ndesaulniers@google.com> Message-Id: <20210115210616.404156-4-ndesaulniers@google.com> Mime-Version: 1.0 References: <20210115210616.404156-1-ndesaulniers@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v5 3/3] 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 Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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 | 6 ++++++ include/asm-generic/vmlinux.lds.h | 6 +++++- lib/Kconfig.debug | 18 ++++++++++++++++++ scripts/test_dwarf5_support.sh | 8 ++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100755 scripts/test_dwarf5_support.sh diff --git a/Makefile b/Makefile index 4eb3bf7ee974..1dcea03861ef 100644 --- a/Makefile +++ b/Makefile @@ -828,10 +828,16 @@ 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) # Binutils 2.35+ required for -gdwarf-4+ support. dwarf-aflag := $(call as-option,-Wa$(comma)-gdwarf-$(dwarf-version-y)) KBUILD_AFLAGS += $(dwarf-aflag) +ifdef CONFIG_CC_IS_CLANG +ifneq ($(LLVM_IAS),1) +DEBUG_CFLAGS += $(dwarf-aflag) +endif +endif ifdef CONFIG_DEBUG_INFO_REDUCED DEBUG_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly) \ diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 49944f00d2b3..37dc4110875e 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 e80770fac4f0..658f32ec0c05 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 - -- 2.30.0.284.gd98b1dd5eaa7-goog