Exploring GNU extensions in the Linux kernel(maskray.me)
maskray.me
Exploring GNU extensions in the Linux kernel
https://maskray.me/blog/2024-05-12-exploring-gnu-extensions-in-linux-kernel
8 comments
Clang supports the extensions, you can build the Linux kernel with clang today:
make -s LLVM=1As sibling mentioned, you can build the kernel with clang today. `make CC=clang`, and for whatever reason I've found that it produces code that's significantly more pleasant to step through under a debugger than gcc.
If anybody has an explanation for this I'd love to hear it.
If anybody has an explanation for this I'd love to hear it.
Interesting.
Traditionally, Clang's -O1 and higher optimizations have been considered less debuggable than GCC's.
Sony developers have proposed changes to improve the debugging experience and some work has been done, e.g. https://discourse.llvm.org/t/rfc-redefine-og-o1-and-add-a-ne...
* change representation to help make -g not change codegen : https://discourse.llvm.org/t/rfc-debuginfo-proposed-changes-...
Sony developers have proposed changes to improve the debugging experience and some work has been done, e.g. https://discourse.llvm.org/t/rfc-redefine-og-o1-and-add-a-ne...
* change representation to help make -g not change codegen : https://discourse.llvm.org/t/rfc-debuginfo-proposed-changes-...
I don't kernel, but:
Empty structures are useful, but behave weirdly. Structures containing a zero-size `char` array are much more portable.
Although `__builtin_choose_expr` isn't available in C++, it's trivial to implement using templates. Actually a lot of these are a reminder that GNU C exists for people who refuse to use C++ for political reasons.
`__builtin_types_compatible_p` is mostly not needed now that C11 `_Generic` exists.
Empty structures are useful, but behave weirdly. Structures containing a zero-size `char` array are much more portable.
Although `__builtin_choose_expr` isn't available in C++, it's trivial to implement using templates. Actually a lot of these are a reminder that GNU C exists for people who refuse to use C++ for political reasons.
`__builtin_types_compatible_p` is mostly not needed now that C11 `_Generic` exists.
I wonder what it would take to have the Elvis operator to be standardized in C and C++, since GCC and Clang have supported this extension for years.
https://en.wikipedia.org/wiki/Elvis_operator
https://en.wikipedia.org/wiki/Elvis_operator
Write a language improvement paper and fight for it at WG14 meetings, so that when voting comes to be, it is voted in.
I've done a few bytecode interpreters but have mostly used the case of Operator type of driving loop. I was impressed by this
static void tbl[] = {&&do_ret, &&do_inc, &&do_dec};
#define NEXT goto tbl[*pc++]
NEXT;
for(;;) {
do_ret: return val;
do_inc: val++; NEXT;
do_dec: val--; NEXT;
}
static void tbl[] = {&&do_ret, &&do_inc, &&do_dec};
#define NEXT goto tbl[*pc++]
NEXT;
for(;;) {
do_ret: return val;
do_inc: val++; NEXT;
do_dec: val--; NEXT;
}
For example, Linux kernel use local labels, inline assembly and builtin functions heavily.
This article inspires me to persist studying in Linux kernel and Clang compiler.