Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp2196260rwl; Sat, 1 Apr 2023 03:44:52 -0700 (PDT) X-Google-Smtp-Source: AKy350YgTihVjdLC+kAv7THmTSI9MUTxbWMbK2N1BrvMABjA90Rc6NpZzyM14ueehrOYfAHGpLPG X-Received: by 2002:a17:90b:1647:b0:240:afb6:b07f with SMTP id il7-20020a17090b164700b00240afb6b07fmr14257722pjb.1.1680345892209; Sat, 01 Apr 2023 03:44:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680345892; cv=none; d=google.com; s=arc-20160816; b=IkqhqhEbKjvhlgEfc+zAmJ1gzeNT2zr7K6tqZ2KB04yqcdcv9AULJek50DkOl0Jzkt baTVzUlvbuakKOhUSTY+O3FhS0YNqagZsInww/jj8HGPvnNMHlDOX/uTwtszK2BJsP7/ GQa5+4YdSazan2DAs+uUssTzX2BRyAvnXV/wbFSzM15yf8rPfuJzdrIVToeAIdxu2TEP BTUvvYc+XOYEn8ZXi9TtZxHuL9xBaokEdwn6aU7nU6N2NjbBvJufUYum4tM0ZN3JJhzQ 6aqbiM1bziNTAdGANehU3pFNrcZhP60o7X/+0TpAED3CkJqHnNqS6vWaEGYCmV5xOsLt wo9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:dkim-signature:date; bh=aRzBdBOzMvWNG+7R8wcAkpUf/eM3omeJ6fWyAnE/LC4=; b=O3CnZnrqG6qeltOBcPNONr74NOz1X5NCGo0g3nj4xdZzcTImlx3dlOXbEA1VHGPT/a 8gm9bT90aStmxjeK/RCZTeJUoU/pPoo1mZrCErDUm3QKWcE2gc5QBxIbIWkCzsW9EK+T OX8Tx5zF1DN5ECvXbPcO6T/BEKS44fFk21zJP0AIbyaSZNVjrNlJ+OoiC6hE7kAVeJAl D0paUzSK6BAQuAhwhELpdGWUNi+4fh1f5CuEls7R4vtvn+jzxdxjI2/kVzC3rvt+1/cl rpLySsxM2pv05ugGja358jmFIPbTKRi8DXaDo36tBp2qZ+ZP5fh+5dsCRblO2hXSThlw So8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@weissschuh.net header.s=mail header.b=DUwH+rfJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z3-20020a170903018300b0019ae58cae8esi4890999plg.120.2023.04.01.03.44.40; Sat, 01 Apr 2023 03:44:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@weissschuh.net header.s=mail header.b=DUwH+rfJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229579AbjDAKdx (ORCPT + 99 others); Sat, 1 Apr 2023 06:33:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42648 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229379AbjDAKdv (ORCPT ); Sat, 1 Apr 2023 06:33:51 -0400 Received: from todd.t-8ch.de (todd.t-8ch.de [159.69.126.157]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A831F1; Sat, 1 Apr 2023 03:33:49 -0700 (PDT) Date: Sat, 1 Apr 2023 10:33:45 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=weissschuh.net; s=mail; t=1680345226; bh=2jWkM8x5jT0rdGzLU91FEQ5TPTq3PmEd2haeBe+6wSM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=DUwH+rfJGYE1LLEtW9sXWesypYVqtCbQC0Sgbz0Q3+D0p0dK18ttnh0GuSKbhzF4g w+IxmRCWHPtyD29xlBzwmDv0XHNpR/dHbgqHi7b4v7mVk9mNDEl7HpeD+QUJPz0eh9 6dzxRp5wZFQIaly5LDJMNrAFes4DrQADaghh5Y/U= From: Thomas =?utf-8?Q?Wei=C3=9Fschuh?= To: Willy Tarreau Cc: Shuah Khan , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: Re: [PATCH] tools/nolibc: validate C99 compatibility Message-ID: References: <20230328-nolibc-c99-v1-1-a8302fb19f19@weissschuh.net> <2be5dd3f-d4ca-499a-9f7e-3113b4f04412@t-8ch.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-Spam-Status: No, score=-0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Willy, sorry for the late response to your previous mail, I was traveling. On 2023-04-01 12:03:30+0200, Willy Tarreau wrote: > On Wed, Mar 29, 2023 at 08:11:58AM +0200, Willy Tarreau wrote: > > On Wed, Mar 29, 2023 at 05:35:33AM +0000, Thomas Weißschuh wrote: > > > Hi Willy, > > > > > > On 2023-03-29 07:16:11+0200, Willy Tarreau wrote: > > > > On Tue, Mar 28, 2023 at 09:07:35PM +0000, Thomas Weißschuh wrote: > > > > > Most of the code was migrated to C99-conformant __asm__ statements > > > > > before. It seems string.h was missed. > > > > > > > > > > Fix string.h and also validate during build that nolibc stays within > > > > > C99. > > > > > > > > I'm all for improving portability, however I have a concern with building > > > > the test case with -std=c99 which is that it might hide some c99-only > > > > stuff that we'd introduce by accident in the nolibc's code, and I'd > > > > rather not do that because it will mean changing build options for some > > > > external programs using it if it happens. However I totally agree with > > > > you that we need to make sure that there's no build issues with c99 > > > > compilers. Modern compilers are c99-compatible but generally come with > > > > GNU extensions and I understand why you're interested in switching to > > > > std=c99 in order to drop some of these like "asm". Should we have two > > > > build targets, the default one and a c99 one ? Maybe. The build is so > > > > small and quick that nobody will care, so we could definitely imagine > > > > building the two versions. Maybe you have a better idea ? > > > > > > I'm not sure I understand. > > > Do you want to stay compatible with c89/gnu89? > > > > At least with gnu89, yes, since it's been used by default by a wide > > range of compilers. > > > > > If so we could use that baseline standard instead of -std=c99. > > > > The only thing is that c99 is both more permissive and more restrictive > > than gnu89 since (as you noticed) gnu89 allows for example "asm" instead > > of "__asm__". > > > > > Without specifying a standard we get whatever the compiler uses as > > > default which is probably much newer than c99. > > > > Yes but do we really care ? I think we want at least some gnuXX > > (which gcc does by default) and some c99 for those who don't want to > > depend on gnuXX. Diversity in tests provides faster reports than > > forcing everyone to the same set. By keeping the default build option, > > a backwards-compatibility test is just a matter of setting CC= with the > > relevant compiler to confirm it's still OK, without being fooled by the > > fact that a standard other than the default was used. > > > > > Having two targets seems to be easy to do but I'm not sure what the > > > advantage would be over compiling once against the intended baseline > > > standard. > > > > We're providing a set of includes to be used by userland so there isn't > > a single intended baseline standard. I'm not advocating for supporting > > everything on earth at all, but at least it should work with native > > compilers currently found in distros or on the kernel.org crosstools, > > and with some older toolchains that are used once in a while to rebuild > > a few compact tools. For example I've used this codebase to build a > > recovery kernel+tools in the past, which fits everything in a 1MB > > binary, and that's the type of thing where you know that it's not always > > easy nor relevant to port the code to newer compilers, so if it used to > > work on gcc 4.7 you'll just reuse that one if you still have it. My > > position regarding older tools is: we don't make particular efforts to > > test them, but we at least do not try hard to evince them either as > > long as it's not necessary. > > I just ran some tests and there's actually better to achieve what you're > looking for. Let's just use -fno-asm, it removes the GNU-specific "asm", > "inline", and "typeof" in favor of the "__" variants. With gcc 11.3 it > gives me this, which is exactly what we were looking for: > > gcc -Os -fno-ident -fno-asynchronous-unwind-tables -fno-stack-protector -DNOLIBC_STACKPROTECTOR -mstack-protector-guard=global -fstack-protector-all -fno-asm -s -o nolibc-test \ > -nostdlib -static -Isysroot/x86/include nolibc-test.c -lgcc > In file included from sysroot/x86/include/stdlib.h:14, > from sysroot/x86/include/nolibc.h:103, > from sysroot/x86/include/errno.h:26, > from sysroot/x86/include/stdio.h:14, > from nolibc-test.c:15: > sysroot/x86/include/string.h: In function 'memset': > sysroot/x86/include/string.h:93:17: error: 'asm' undeclared (first use in this function) > 93 | asm volatile(""); > | ^~~ > sysroot/x86/include/string.h:93:17: note: each undeclared identifier is reported only once for each function it appears in > sysroot/x86/include/string.h:93:20: error: expected ';' before 'volatile' > 93 | asm volatile(""); > | ^~~~~~~~~ > | ; > sysroot/x86/include/string.h: In function 'strlen': > sysroot/x86/include/string.h:142:17: warning: implicit declaration of function 'asm' [-Wimplicit-function-declaration] > 142 | asm(""); > | ^~~ > nolibc-test.c: In function 'main': > nolibc-test.c:898:25: error: 'asm' undeclared (first use in this function) > 898 | asm volatile ("outb %%al, %%dx" :: "d"(0x501), "a"(0)); > | ^~~ > nolibc-test.c:898:28: error: expected ';' before 'volatile' > 898 | asm volatile ("outb %%al, %%dx" :: "d"(0x501), "a"(0)); > | ^~~~~~~~~ > | ; > make: *** [Makefile:128: nolibc-test] Error 1 > > With this, we don't need to force -std=c99 nor to build two variants, > a single variant will catch GCCisms even with older compilers while not > being overly annoying. The original goal was to have a fixed and explicit baseline that is supported. Using -std= ensures that no deviations are accidentally introduced. Using -fno-asm only prevents this specific gnu-ism. All other gnu-isms and features from whatever the current compilers default language level is are still allowed. Therefore I'm not convinced of this aproach. These are the aproaches I can see that reach this goal: * Declare C99 as baseline, build with -std=c99 * Declare C99 and GNU89 as baseline, build with both. * Declare C99 and GNU89 as baseline, build with -std=c99, wait for people to complain if something breaks on gnu89 (same as current status) * Declare C89 as baseline, remove all C99-isms and gnu-isms (C++ comments, "inline" and some smaller stuff), build with -std=c89. Personally I think C99 is a baseline that is easy to fulfill by nolibc and should not restrict users. Thomas