From: Yonghong Song <yonghong.song@linux.dev>
To: "Jose E. Marchesi" <jose.marchesi@oracle.com>
Cc: bpf@vger.kernel.org
Subject: Re: BPF GCC status - Nov 2023
Date: Wed, 29 Nov 2023 08:44:28 -0800 [thread overview]
Message-ID: <a1073bd0-9df2-4a9e-900c-7e8ac63ac464@linux.dev> (raw)
In-Reply-To: <87jzq1t4sk.fsf@oracle.com>
On 11/29/23 2:08 AM, Jose E. Marchesi wrote:
>> On 11/28/23 11:23 AM, Jose E. Marchesi wrote:
>>> [During LPC 2023 we talked about improving communication between the GCC
>>> BPF toolchain port and the kernel side. This is the first periodical
>>> report that we plan to publish in the GCC wiki and send to interested
>>> parties. Hopefully this will help.]
>>>
>>> GCC wiki page for the port: https://gcc.gnu.org/wiki/BPFBackEnd
>>> IRC channel: #gccbpf at irc.oftc.net.
>>> Help on using the port: gcc@gcc.gnu.org
>>> Patches and/or development discussions: gcc-patches@gnu.org
>> Thanks a lot for detailed report. Really helpful to nail down
>> issues facing one or both compilers. See comments below for
>> some mentioned issues.
>>
>>> Assembler
>>> =========
>> [...]
>>
>>> - In the Pseudo-C syntax register names are not preceded by % characters
>>> nor any other prefix. A consequence of that is that in contexts like
>>> instruction operands, where both register names and expressions
>>> involving symbols are expected, there is no way to disambiguate
>>> between them. GAS was allowing symbols like `w3' or `r5' in syntactic
>>> contexts where no registers were expected, such as in:
>>>
>>> r0 = w3 ll ; GAS interpreted w3 as symbol, clang emits error
>>>
>>> The clang assembler wasn't allowing that. During LPC we agreed that
>>> the simplest approach is to not allow any symbol to have the same name
>>> than a register, in any context. So we changed GAS so it now doesn't
>>> allow to use register names as symbols in any expression, such as:
>>>
>>> r0 = w3 + 1 ll ; This now fails for both GAS and llvm.
>>> r0 = 1 + w3 ll ; NOTE this does not fail with llvm, but it should.
>> Could you provide a reproducible case above for llvm? llvm does not
>> support syntax like 'r0 = 1 + w3 ll'. For add, it only supports
>> 'r1 += r2' or 'r1 += 100' syntax.
> It is a 128-bit load with an expression. In compiler explorer, clang:
>
> int
> foo ()
> {
> asm volatile ("r1 = 10 + w3 ll");
> return 0;
> }
>
> I get:
>
> foo: # @foo
> r1 = 10+w3 ll
> r0 = 0
> exit
>
> i.e. `10 + w3' is interpreted as an expression with two operands: the
> literal number 10 and a symbol (not a register) `w3'.
>
> If the expression is `w3+10' instead, your parser recognizes the w3 as a
> register name and errors out, as expected.
>
> I suppose llvm allows to hook on the expression parser to handle
> individual operands. That's how we handled this in GAS.
Thanks for the code. I can reproduce the result with compiler explorer.
The following is the link https://godbolt.org/z/GEGexf1Pj
where I added -grecord-gcc-switches to dump compilation flags
into .s file.
The following is the compiler explorer compilation command line:
/opt/compiler-explorer/clang-trunk-20231129/bin/clang-18 -g -o /app/output.s \
-S --target=bpf -fcolor-diagnostics -gen-reproducer=off -O2 \
-g -grecord-command-line /app/example.c
I then compile the above C code with
clang -g -S --target=bpf -fcolor-diagnostics -gen-reproducer=off -O2 -g -grecord-command-line t.c
with identical flags.
I tried locally with llvm16/17/18. They all failed compilation since
'r1 = 10+w3 ll' cannot be recognized by the llvm.
We will investigate why llvm18 in compiler explorer compiles
differently from my local build.
next prev parent reply other threads:[~2023-11-29 16:44 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-28 16:23 BPF GCC status - Nov 2023 Jose E. Marchesi
2023-11-29 5:50 ` Yonghong Song
2023-11-29 7:08 ` Jose E. Marchesi
2023-11-29 16:44 ` Yonghong Song [this message]
2023-11-29 17:01 ` Alexei Starovoitov
2023-11-29 17:44 ` Yonghong Song
2023-11-30 12:13 ` Jose E. Marchesi
2023-11-30 14:58 ` Yonghong Song
2023-11-30 15:06 ` Jose E. Marchesi
2023-11-30 17:39 ` Yonghong Song
2023-11-30 18:27 ` Andrii Nakryiko
2023-11-30 19:49 ` Jose E. Marchesi
2023-12-01 21:38 ` Andrii Nakryiko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a1073bd0-9df2-4a9e-900c-7e8ac63ac464@linux.dev \
--to=yonghong.song@linux.dev \
--cc=bpf@vger.kernel.org \
--cc=jose.marchesi@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.