From patchwork Sun Feb 11 12:41:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 199444 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:50ea:b0:106:860b:bbdd with SMTP id r10csp1905373dyd; Sun, 11 Feb 2024 04:42:34 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCV1Fk1bIPka7vj3Vx5hp0OhsT+WdH+ZhM5FDyl3LvAWc5G5SgD4f9b1FVybJv4WI6eQHjqsuK4xVH9yGJkHNdwWyDzlPg== X-Google-Smtp-Source: AGHT+IGOs/BcIzv/h3Q/3vEKGKSCjin7dfRgb7oYOHgpIxqK8xPcVIP0AYcYYDevm54L6JWtr3zo X-Received: by 2002:a17:906:6851:b0:a3c:4e36:979f with SMTP id a17-20020a170906685100b00a3c4e36979fmr1649260ejs.66.1707655354763; Sun, 11 Feb 2024 04:42:34 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707655354; cv=pass; d=google.com; s=arc-20160816; b=O53/64InMPUPsX9bSMap2YubAXU8LQYMvpDzeJkyD0Zx3ZPpkwTMRwBl7CS90yBMqg 8DNMelH46sOtQWPNHnGwb+ncTt96tp7F0SkKlWechgWJGzcjt91UD1XryWABhjWkDUZ3 cnrUXs3EcnmuI4FANK5cul6ypLZpTaYS3ROn85f0PxZ3ZE26/COWJA0eDbg+02cPXWEM jW8p5E0iVE8OYvSw0amHMyw9OyHFz3ZE05tXwsbmG0x+UVt6g6o/3b0ogVDq8X7Rw5KI q5v11tiI2s7vOD/LHKJWF8dgpeA+DMJvBVCuWKLbFwHkElZjRPbZ8sZtXxcfg9zwoVzM le8g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=gna999FQH3kIInzW4Jc7Hwink/UbNIaRtb+5zaUC4vU=; fh=vcNDSmp0U49zqgOHdTn8OOQhz7zGE85FZ6jEohL3MjQ=; b=QvWr3pwCJ+MVJD0oQzL1V/k+mwAfAVInl3K1oWMDopedrvC9xMCOv/tDNTAuiBD/sx cZ5PmZmS6IVoji5I0eACQ+PpZedjvSZVX28Jt2DZwj57VePHwMOsVngJrsOjuX3MAWXH U3Iv0DBsGKAbijo68Mk/nTP01yM07J5/kCQHi92FlSAuEwC8edId5Ny1fDlheAIpHheI N7ZkELG+8hwi50MU/g2CLS1jDw2gCYH0WDxyREhRjgfWEfRH3KZjvPa9MXAHvVPAWOAb IpZzTZ+4FOHOF1zma8A5J2QxqfxNHVDG86n/AaHACuGmrV9JtrAL9nkKIf+VmPBTfMAr ddhg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=mw52ZIKc; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-60771-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-60771-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org X-Forwarded-Encrypted: i=2; AJvYcCVWCnBR8EhOvWWrjBBhZTtjYWVTmR+W6dngGdm+yr132LG4mHYvv8nXM0qtZ9q7IdR+Egj27aERQmzfxNpL4nDAweOb9A== Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id cb22-20020a170906a45600b00a3c10037ee1si2069524ejb.669.2024.02.11.04.42.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Feb 2024 04:42:34 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-60771-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=mw52ZIKc; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-60771-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-60771-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 6166F1F21209 for ; Sun, 11 Feb 2024 12:42:34 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0074E5B5B2; Sun, 11 Feb 2024 12:41:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mw52ZIKc" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3796659149; Sun, 11 Feb 2024 12:41:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707655272; cv=none; b=KXR/sPfe2jrPBWkal05FJFIOuvybwGf1H8nV2gOdJrCF/eixDUWKHOK+4uJCGVtbCJT8PcUV0fSWBDJNef9idlU3IF4uELXnOoFd2YoxK7oy9rACPS9aY/urjKWXgYdcX58bOENzq0rNWVOm5Lym92D8Hk7SWwaFSxVWLs/OHQY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707655272; c=relaxed/simple; bh=IgiCGgj/rOMnOunox9MFGVkrzA1V8Ly9pLePgk7MAZo=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=i3fWbMTJpcQZHGkAlqaCVyC07WKjXbCG6sWnhSrRJUwNsm1cN5DNlvnBynZXrdPac4TLexK/gGC00uFUS7qT4vyt2+zf0VOPOCsZjF16bQcAkT/C6xfN7mq2pj+TRAE2KOn9aJXTj9TOFMuQOqdWf185M1evttdd4z4ebWOtK90= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mw52ZIKc; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id BEB13C433C7; Sun, 11 Feb 2024 12:41:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707655271; bh=IgiCGgj/rOMnOunox9MFGVkrzA1V8Ly9pLePgk7MAZo=; h=From:To:Cc:Subject:Date:From; b=mw52ZIKcgUE4a4x2s3lmZWiam+3TqQ+DGdGllCMmEfdfZDKgBXO/M75yuBWKzT0eP K3g+fxR52ZiD4WlwyseGwSBKA9yRR4xL9Zk2w/WHRScxEJ8cYvnirIhdYRWsoVincl FYF9Hi15jS/NRsAmHG5Xd9jr/ObjPVjrRLDhcxDaNCnJ7VXH+dtt8QMdZu4I7sTAuS 0Kjr0hDOarYrlfrzX7aUdaIZw7ALdoRcALFKXBlVhKnLzbCwxgseSBuPXb8YJClQZ0 1tzl6ffCy/2kPI7+jMdwPKfKcUHRspz0JKGzPr8HqNB5fwov90cEVgOEnINf53k63h VLkyhq+mToCKQ== From: Masahiro Yamada To: linux-kbuild@vger.kernel.org Cc: Masahiro Yamada , linux-kernel@vger.kernel.org Subject: [PATCH 1/2] kconfig: print recursive dependency errors in the parsed order Date: Sun, 11 Feb 2024 21:41:04 +0900 Message-Id: <20240211124105.29363-1-masahiroy@kernel.org> X-Mailer: git-send-email 2.40.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1790606421319661958 X-GMAIL-MSGID: 1790606421319661958 for_all_symbols() iterates in the symbol hash table. The order of iteration depends on the hash table implementation. If you use it for printing errors, they are shown in random order. For example, the order of following test input and the corresponding error do not match: - scripts/kconfig/tests/err_recursive_dep/Kconfig - scripts/kconfig/tests/err_recursive_dep/expected_stderr Signed-off-by: Masahiro Yamada --- scripts/kconfig/parser.y | 20 ++++++++++++---- .../tests/err_recursive_dep/expected_stderr | 24 +++++++++---------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/scripts/kconfig/parser.y b/scripts/kconfig/parser.y index e58c24d2e5ab..efd0e234e0d2 100644 --- a/scripts/kconfig/parser.y +++ b/scripts/kconfig/parser.y @@ -473,8 +473,7 @@ assign_val: void conf_parse(const char *name) { - struct symbol *sym; - int i; + struct menu *menu; autoconf_cmd = str_new(); @@ -517,10 +516,23 @@ void conf_parse(const char *name) } menu_finalize(&rootmenu); - for_all_symbols(i, sym) { - if (sym_check_deps(sym)) + + menu = &rootmenu; + while (menu) { + if (menu->sym && sym_check_deps(menu->sym)) yynerrs++; + + if (menu->list) { + menu = menu->list; + continue; + } + + while (!menu->next && menu->parent) + menu = menu->parent; + + menu = menu->next; } + if (yynerrs) exit(1); conf_set_changed(true); diff --git a/scripts/kconfig/tests/err_recursive_dep/expected_stderr b/scripts/kconfig/tests/err_recursive_dep/expected_stderr index c9f4abf9a791..05d4ced70320 100644 --- a/scripts/kconfig/tests/err_recursive_dep/expected_stderr +++ b/scripts/kconfig/tests/err_recursive_dep/expected_stderr @@ -1,10 +1,10 @@ -Kconfig:11:error: recursive dependency detected! -Kconfig:11: symbol B is selected by B +Kconfig:5:error: recursive dependency detected! +Kconfig:5: symbol A depends on A For a resolution refer to Documentation/kbuild/kconfig-language.rst subsection "Kconfig recursive dependency limitations" -Kconfig:5:error: recursive dependency detected! -Kconfig:5: symbol A depends on A +Kconfig:11:error: recursive dependency detected! +Kconfig:11: symbol B is selected by B For a resolution refer to Documentation/kbuild/kconfig-language.rst subsection "Kconfig recursive dependency limitations" @@ -14,9 +14,9 @@ Kconfig:21: symbol C2 depends on C1 For a resolution refer to Documentation/kbuild/kconfig-language.rst subsection "Kconfig recursive dependency limitations" -Kconfig:32:error: recursive dependency detected! -Kconfig:32: symbol D2 is selected by D1 +Kconfig:27:error: recursive dependency detected! Kconfig:27: symbol D1 depends on D2 +Kconfig:32: symbol D2 is selected by D1 For a resolution refer to Documentation/kbuild/kconfig-language.rst subsection "Kconfig recursive dependency limitations" @@ -26,13 +26,13 @@ Kconfig:42: symbol E2 is implied by E1 For a resolution refer to Documentation/kbuild/kconfig-language.rst subsection "Kconfig recursive dependency limitations" +Kconfig:49:error: recursive dependency detected! +Kconfig:49: symbol F1 default value contains F2 +Kconfig:51: symbol F2 depends on F1 +For a resolution refer to Documentation/kbuild/kconfig-language.rst +subsection "Kconfig recursive dependency limitations" + Kconfig:60:error: recursive dependency detected! Kconfig:60: symbol G depends on G For a resolution refer to Documentation/kbuild/kconfig-language.rst subsection "Kconfig recursive dependency limitations" - -Kconfig:51:error: recursive dependency detected! -Kconfig:51: symbol F2 depends on F1 -Kconfig:49: symbol F1 default value contains F2 -For a resolution refer to Documentation/kbuild/kconfig-language.rst -subsection "Kconfig recursive dependency limitations" From patchwork Sun Feb 11 12:41:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 199445 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:50ea:b0:106:860b:bbdd with SMTP id r10csp1905403dyd; Sun, 11 Feb 2024 04:42:43 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCUi+vikIuJeBt/l8mlMAqlF/HQ0yu66X8/XOPl4wojfDMUJlN7O/wRi/n7vGCKSeDKFzfw7cHpoUk/Y5y/9J4PL5TuC2w== X-Google-Smtp-Source: AGHT+IG24FkyuM0lfs4zrkHVqdRnYk11xWE6O9BKS6z6GGf0qy2IQkgLunF3TIEHW5xAjGEjqwE1 X-Received: by 2002:ac8:7f05:0:b0:42c:38c0:1e7a with SMTP id f5-20020ac87f05000000b0042c38c01e7amr4984123qtk.1.1707655363374; Sun, 11 Feb 2024 04:42:43 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707655363; cv=pass; d=google.com; s=arc-20160816; b=K+DZNp03UdZ6DWonpc4PrLqLm/JzmRKeaZRTWYhiJwNjfamQ3KLW+BmtZlieDBJTbn J/oCye2A5uLiu9SuiF5WKQTd8aNipqVwRzIa3qJg/hn3sjvdDFxb6DldvE18jRgmmVtB T7WdFvOQ/TYJiTzFe2omYleDMvKwsbg7319uWIceWRWX3LgGZmtR7+kvtpfDng5m5Qw7 vz9mjRHky2xQiG5F6D9lUKb+kudxNyKALx0i4u+cju9mN2f+jxbzQnqwX0RA9AjLYdtm uyijHs09EHmTcLmAY0Rv+H34O5g0gxahvbj5oz4494Ht1qU1XJ0SYLjyxoDUWjeEW1dd YkLA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=3d2AxNNDHOPf0Jd/0hBRmBi1hraW7vNEC41YWcqRRAk=; fh=2s5X9m5e4YsifswGB8O78jTuwExxkL204XQnKhtvLtc=; b=Q728LbBsNQnfMZYKNdl4A4uKasdeYWXtNlmBebXyK14pSb1c7hBHaK0FcnQUFqYE/Z tXD/UlyJ+yNDppU7jaGt2VtSi7uF5r/IpeUbJoUGwECNhqwU3c29lXNOOQd7Ah6sClyi gIOH315fBMxCYqby9GvzQTGEfRbFm1+0J5nrBFi+moWKjt3rCECvJ3fzOs2/7B1b+fQM CAOe/tvp4AzFewaftie6CxV9ax4sUZX6vSDZBlV+lWUuLnRitUtWpUEO90QOSmq5Cb/K iBoDdG9AZ80pUyCKIztBmlWzi0yU6kAfNXUMAOE9fKjsioy/9juheNlWnnhsEGt4luwv /oIw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=HDpFEovS; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-60772-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-60772-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org X-Forwarded-Encrypted: i=2; AJvYcCVdbz+A3KZfHH+ASConcsTDt8CUTZeudQc9AN1vC1l0zeiLkKSjGQ5y9JZ4QSRsJkMZY5bE7u2ljaQ9Df+ObNoaN3trNg== Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id d22-20020ac847d6000000b0042c7629b993si526589qtr.636.2024.02.11.04.42.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Feb 2024 04:42:43 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-60772-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=HDpFEovS; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-60772-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-60772-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 228341C20912 for ; Sun, 11 Feb 2024 12:42:43 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 800B95B669; Sun, 11 Feb 2024 12:41:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HDpFEovS" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3BFFC5B053; Sun, 11 Feb 2024 12:41:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707655273; cv=none; b=CQyvPEhvaDNVJp2gjGyA3RLBX2NiZVozRLLXX5UE3rUcv4AXHgjnaIQJOJmWIo9lLUNG8qkaRv2lztKKDW9JDiS9KUKPULTPNPjxAwUbjARx8NNaEJPiJCEs15NIET7awgdT5o/gnyNhA4nKyYAn4FVP8bIW0/fTFrysoBcYxCY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707655273; c=relaxed/simple; bh=DHTaw0A/DHD3RfxzoqZvFzVkcc+o/cvMO+JI8Q6ldCM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KC89okY7ev4xWb3HkYaIYF3O2QpZqnbr9H5QxyROx2sT7k3/r+R2bqooTb9+PX/oDeYlTSFrctrQ/WjBjiuLJRzp9yVZHMpDdu4abg9HTOlXRNosGmz3oUwQI54ei+lh/zEFFsJZrRdUPK1tHPRBvPZYB7z6f3A6zv3pYjGmqAk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HDpFEovS; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 23DD9C433F1; Sun, 11 Feb 2024 12:41:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707655273; bh=DHTaw0A/DHD3RfxzoqZvFzVkcc+o/cvMO+JI8Q6ldCM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HDpFEovSdYevpA3QzRG0WpGp5bFehtaLfRwtRTAvoqDNO3q8Q+QySR5/s74Ajq+Ty YYnhmNr28wB7W2i2+ajNwevudM5yPDUVTCXkez0h/psSdNkB/y1heN/a2G6ixUUeJ5 y2ECvXke1oj6rv2QbCqiTF4vJq5vbnT7ZcSOjJ7o0IJtG0vqMMoqrALaDTJlEz3qpb Nw6cE0q7J2KwLi8w4OcRiiuJO1Xt9/MoYBr+kPo9peJxfVzGsVnL7zOYqhD0EyYpXR n8VfTXboxyCSYJNojdEIpD5dNJuZ53+M6dzGtEmdzT9biuH80teGLWcFCoyNiSf6lT dNilGDm4DUCLg== From: Masahiro Yamada To: linux-kbuild@vger.kernel.org Cc: Masahiro Yamada , linux-kernel@vger.kernel.org Subject: [PATCH 2/2] kconfig: use generic macros to implement symbol hashtable Date: Sun, 11 Feb 2024 21:41:05 +0900 Message-Id: <20240211124105.29363-2-masahiroy@kernel.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240211124105.29363-1-masahiroy@kernel.org> References: <20240211124105.29363-1-masahiroy@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1790606430292465266 X-GMAIL-MSGID: 1790606430292465266 Use helper macros in hashtable.h for generic hashtable implementation. We can git rid of the hash head index of for_all_symbols(). Signed-off-by: Masahiro Yamada --- scripts/kconfig/conf.c | 12 ++++++------ scripts/kconfig/confdata.c | 25 ++++++++++++------------- scripts/kconfig/expr.h | 9 ++++----- scripts/kconfig/internal.h | 9 +++++++++ scripts/kconfig/lkc_proto.h | 2 -- scripts/kconfig/parser.y | 2 -- scripts/kconfig/symbol.c | 22 +++++++++++----------- 7 files changed, 42 insertions(+), 39 deletions(-) diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 662a5e7c37c2..b5730061872b 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -14,6 +14,7 @@ #include #include +#include "internal.h" #include "lkc.h" static void conf(struct menu *menu); @@ -171,7 +172,7 @@ enum conf_def_mode { static bool conf_set_all_new_symbols(enum conf_def_mode mode) { struct symbol *sym, *csym; - int i, cnt; + int cnt; /* * can't go as the default in switch-case below, otherwise gcc whines * about -Wmaybe-uninitialized @@ -226,7 +227,7 @@ static bool conf_set_all_new_symbols(enum conf_def_mode mode) } } - for_all_symbols(i, sym) { + for_all_symbols(sym) { if (sym_has_value(sym) || sym->flags & SYMBOL_VALID) continue; switch (sym_get_type(sym)) { @@ -278,14 +279,14 @@ static bool conf_set_all_new_symbols(enum conf_def_mode mode) * and the rest to no. */ if (mode != def_random) { - for_all_symbols(i, csym) { + for_all_symbols(csym) { if ((sym_is_choice(csym) && !sym_has_value(csym)) || sym_is_choice_value(csym)) csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES; } } - for_all_symbols(i, csym) { + for_all_symbols(csym) { if (sym_has_value(csym) || !sym_is_choice(csym)) continue; @@ -304,9 +305,8 @@ static bool conf_set_all_new_symbols(enum conf_def_mode mode) static void conf_rewrite_tristates(tristate old_val, tristate new_val) { struct symbol *sym; - int i; - for_all_symbols(i, sym) { + for_all_symbols(sym) { if (sym_get_type(sym) == S_TRISTATE && sym->def[S_DEF_USER].tri == old_val) sym->def[S_DEF_USER].tri = new_val; diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index dafc572e7b7e..c5b6487d68ac 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -18,6 +18,7 @@ #include #include +#include "internal.h" #include "lkc.h" struct gstr autoconf_cmd; @@ -322,7 +323,7 @@ int conf_read_simple(const char *name, int def) size_t line_asize = 0; char *p, *val; struct symbol *sym; - int i, def_flags; + int def_flags; const char *warn_unknown, *sym_name; warn_unknown = getenv("KCONFIG_WARN_UNKNOWN_SYMBOLS"); @@ -380,7 +381,7 @@ int conf_read_simple(const char *name, int def) conf_warnings = 0; def_flags = SYMBOL_DEF << def; - for_all_symbols(i, sym) { + for_all_symbols(sym) { sym->flags |= SYMBOL_CHANGED; sym->flags &= ~(def_flags|SYMBOL_VALID); if (sym_is_choice(sym)) @@ -489,7 +490,6 @@ int conf_read(const char *name) { struct symbol *sym; int conf_unsaved = 0; - int i; conf_set_changed(false); @@ -500,7 +500,7 @@ int conf_read(const char *name) sym_calc_value(modules_sym); - for_all_symbols(i, sym) { + for_all_symbols(sym) { sym_calc_value(sym); if (sym_is_choice(sym) || (sym->flags & SYMBOL_NO_WRITE)) continue; @@ -524,7 +524,7 @@ int conf_read(const char *name) /* maybe print value in verbose mode... */ } - for_all_symbols(i, sym) { + for_all_symbols(sym) { if (sym_has_value(sym) && !sym_is_choice_value(sym)) { /* Reset values of generates values, so they'll appear * as new, if they should become visible, but that @@ -862,7 +862,6 @@ int conf_write(const char *name) const char *str; char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1]; char *env; - int i; bool need_newline = false; if (!name) @@ -946,7 +945,7 @@ int conf_write(const char *name) } fclose(out); - for_all_symbols(i, sym) + for_all_symbols(sym) sym->flags &= ~SYMBOL_WRITTEN; if (*tmpname) { @@ -1016,7 +1015,7 @@ static int conf_touch_deps(void) { const char *name, *tmp; struct symbol *sym; - int res, i; + int res; name = conf_get_autoconfig_name(); tmp = strrchr(name, '/'); @@ -1030,7 +1029,7 @@ static int conf_touch_deps(void) conf_read_simple(name, S_DEF_AUTO); sym_calc_value(modules_sym); - for_all_symbols(i, sym) { + for_all_symbols(sym) { sym_calc_value(sym); if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name) continue; @@ -1096,7 +1095,7 @@ static int __conf_write_autoconf(const char *filename, char tmp[PATH_MAX]; FILE *file; struct symbol *sym; - int ret, i; + int ret; if (make_parent_dir(filename)) return -1; @@ -1113,7 +1112,7 @@ static int __conf_write_autoconf(const char *filename, conf_write_heading(file, comment_style); - for_all_symbols(i, sym) + for_all_symbols(sym) if ((sym->flags & SYMBOL_WRITE) && sym->name) print_symbol(file, sym); @@ -1136,7 +1135,7 @@ int conf_write_autoconf(int overwrite) { struct symbol *sym; const char *autoconf_name = conf_get_autoconfig_name(); - int ret, i; + int ret; if (!overwrite && is_present(autoconf_name)) return 0; @@ -1148,7 +1147,7 @@ int conf_write_autoconf(int overwrite) if (conf_touch_deps()) return 1; - for_all_symbols(i, sym) + for_all_symbols(sym) sym_calc_value(sym); ret = __conf_write_autoconf(conf_get_autoheader_name(), diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index dd3350aed302..3bc375f1a1cd 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h @@ -17,6 +17,8 @@ extern "C" { #include #endif +#include "list_types.h" + typedef enum tristate { no, mod, yes } tristate; @@ -74,8 +76,8 @@ enum { * SYMBOL_CHOICE bit set in 'flags'. */ struct symbol { - /* The next symbol in the same bucket in the symbol hash table */ - struct symbol *next; + /* link node for the hash table */ + struct hlist_node node; /* The name of the symbol, e.g. "FOO" for 'config FOO' */ char *name; @@ -124,8 +126,6 @@ struct symbol { struct expr_value implied; }; -#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) - #define SYMBOL_CONST 0x0001 /* symbol is const */ #define SYMBOL_CHECK 0x0008 /* used during dependency checking */ #define SYMBOL_CHOICE 0x0010 /* start of a choice block (null name) */ @@ -150,7 +150,6 @@ struct symbol { #define SYMBOL_NEED_SET_CHOICE_VALUES 0x100000 #define SYMBOL_MAXLENGTH 256 -#define SYMBOL_HASHSIZE 9973 /* A property represent the config options that can be associated * with a config "symbol". diff --git a/scripts/kconfig/internal.h b/scripts/kconfig/internal.h index 788401cd5d6f..6c721c4cfd72 100644 --- a/scripts/kconfig/internal.h +++ b/scripts/kconfig/internal.h @@ -2,6 +2,15 @@ #ifndef INTERNAL_H #define INTERNAL_H +#include "hashtable.h" + +#define SYMBOL_HASHSIZE (1U << 14) + +extern HASHTABLE_DECLARE(sym_hashtable, SYMBOL_HASHSIZE); + +#define for_all_symbols(sym) \ + hash_for_each(sym_hashtable, sym, node) + struct menu; extern struct menu *current_menu, *current_entry; diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index 94299e42402f..2807fa584c2b 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h @@ -18,8 +18,6 @@ void conf_set_message_callback(void (*fn)(const char *s)); bool conf_errors(void); /* symbol.c */ -extern struct symbol * symbol_hash[SYMBOL_HASHSIZE]; - struct symbol * sym_lookup(const char *name, int flags); struct symbol * sym_find(const char *name); void print_symbol_for_listconfig(struct symbol *sym); diff --git a/scripts/kconfig/parser.y b/scripts/kconfig/parser.y index efd0e234e0d2..b505e43e0d02 100644 --- a/scripts/kconfig/parser.y +++ b/scripts/kconfig/parser.y @@ -28,8 +28,6 @@ static void zconf_error(const char *err, ...); static bool zconf_endtoken(const char *tokenname, const char *expected_tokenname); -struct symbol *symbol_hash[SYMBOL_HASHSIZE]; - struct menu *current_menu, *current_entry; %} diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index 518977c525de..1290c6d2f8c2 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -9,6 +9,7 @@ #include #include +#include "internal.h" #include "lkc.h" #include "util.h" @@ -161,9 +162,8 @@ static void sym_set_changed(struct symbol *sym) static void sym_set_all_changed(void) { struct symbol *sym; - int i; - for_all_symbols(i, sym) + for_all_symbols(sym) sym_set_changed(sym); } @@ -476,9 +476,8 @@ void sym_calc_value(struct symbol *sym) void sym_clear_all_valid(void) { struct symbol *sym; - int i; - for_all_symbols(i, sym) + for_all_symbols(sym) sym->flags &= ~SYMBOL_VALID; conf_set_changed(true); sym_calc_value(modules_sym); @@ -804,6 +803,8 @@ bool sym_is_changeable(struct symbol *sym) return sym->visible > sym->rev_dep.tri; } +HASHTABLE_DEFINE(sym_hashtable, SYMBOL_HASHSIZE); + struct symbol *sym_lookup(const char *name, int flags) { struct symbol *symbol; @@ -818,9 +819,9 @@ struct symbol *sym_lookup(const char *name, int flags) case 'n': return &symbol_no; } } - hash = strhash(name) % SYMBOL_HASHSIZE; + hash = strhash(name); - for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + hash_for_each_possible(sym_hashtable, symbol, node, hash) { if (symbol->name && !strcmp(symbol->name, name) && (flags ? symbol->flags & flags @@ -839,8 +840,7 @@ struct symbol *sym_lookup(const char *name, int flags) symbol->type = S_UNKNOWN; symbol->flags = flags; - symbol->next = symbol_hash[hash]; - symbol_hash[hash] = symbol; + hash_add(sym_hashtable, &symbol->node, hash); return symbol; } @@ -860,9 +860,9 @@ struct symbol *sym_find(const char *name) case 'n': return &symbol_no; } } - hash = strhash(name) % SYMBOL_HASHSIZE; + hash = strhash(name); - for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + hash_for_each_possible(sym_hashtable, symbol, node, hash) { if (symbol->name && !strcmp(symbol->name, name) && !(symbol->flags & SYMBOL_CONST)) @@ -922,7 +922,7 @@ struct symbol **sym_re_search(const char *pattern) if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE)) return NULL; - for_all_symbols(i, sym) { + for_all_symbols(sym) { if (sym->flags & SYMBOL_CONST || !sym->name) continue; if (regexec(&re, sym->name, 1, match, 0))