-
Notifications
You must be signed in to change notification settings - Fork 21
Description
Maybe we should document the set of GCC extensions that are supported at some point, but I'm more interested now in a demand-driven push to list stuff that are essential for compiling more recent versions of the Linux kernel. Maybe easiest to do that one at a time. I'm not 100% sure, but I think recent versions are not possible to analyze without asm goto. [Later update: Actually, this goto has been there for a long time and somehow our current headers manage to avoid it. Maybe this isn't essential, but I'll still post this issue in case it is needed.]
We can handle asm volatile, but this one also requires labels. Now, the grammar is a little bit hacky. Two alternatives and then "in the last form, asm-qualifiers contains goto (and in the first form, not)."
Here's the sort of code that needs to get through (from arch/x86/include/asm/jump_label.h):
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)
#define __ASM_FORM(x, ...) " " __stringify(x,##__VA_ARGS__) " "
#define __ASM_SEL(a,b) __ASM_FORM(b)
#define _ASM_PTR __ASM_SEL(.long, .quad)
#define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8)
#define JUMP_TABLE_ENTRY \
".pushsection __jump_table, \"aw\" \n\t" \
_ASM_ALIGN "\n\t" \
".long 1b - . \n\t" \
".long %l[l_yes] - . \n\t" \
_ASM_PTR "%c0 + %c1 - .\n\t" \
".popsection \n\t"
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)
#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
static int arch_static_branch(const int key, const int branch)
{
asm_volatile_goto("1:"
".byte " __stringify(BYTES_NOP5) "\n\t"
JUMP_TABLE_ENTRY
: : "i" (key), "i" (branch) : : l_yes);
return 0;
l_yes:
return 1;
}
int main () {
return 0;
}