This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC] gcc feature request: Moving blocks into sections
- From: "H. Peter Anvin" <hpa at linux dot intel dot com>
- To: Mathieu Desnoyers <mathieu dot desnoyers at efficios dot com>
- Cc: Linus Torvalds <torvalds at linux-foundation dot org>, Steven Rostedt <rostedt at goodmis dot org>, LKML <linux-kernel at vger dot kernel dot org>, gcc <gcc at gcc dot gnu dot org>, Ingo Molnar <mingo at kernel dot org>, Thomas Gleixner <tglx at linutronix dot de>, David Daney <ddaney dot cavm at gmail dot com>, Behan Webster <behanw at converseincode dot com>, Peter Zijlstra <peterz at infradead dot org>, Herbert Xu <herbert at gondor dot apana dot org dot au>
- Date: Mon, 05 Aug 2013 14:43:46 -0700
- Subject: Re: [RFC] gcc feature request: Moving blocks into sections
- References: <CA+55aFw_o=D-j_SRn=Y4LhHm-tEyuP1Je5ZHVTYxbVyLyDcLEg at mail dot gmail dot com> <1375725328 dot 22073 dot 101 dot camel at gandalf dot local dot home> <51FFEC56 dot 6040206 at linux dot intel dot com> <1375727010 dot 22073 dot 110 dot camel at gandalf dot local dot home> <51FFEEEC dot 5060902 at linux dot intel dot com> <1375728583 dot 22073 dot 118 dot camel at gandalf dot local dot home> <51FFF430 dot 1060701 at linux dot intel dot com> <CA+55aFwz6cpsaWZ-19h91_CNGB5C3d1bNOv7woxetXOTyJ_CRw at mail dot gmail dot com> <20130805195446 dot GA22359 at Krystal> <CA+55aFwrxRr4+kN8t8HCRnnVQyur5EGzQ_bRdYK3T-KW9Zp0aw at mail dot gmail dot com> <20130805212855 dot GA23044 at Krystal>
On 08/05/2013 02:28 PM, Mathieu Desnoyers wrote:
> * Linus Torvalds (torvalds@linux-foundation.org) wrote:
>> On Mon, Aug 5, 2013 at 12:54 PM, Mathieu Desnoyers
>> <mathieu.desnoyers@efficios.com> wrote:
>>>
>>> I remember that choosing between 2 and 5 bytes nop in the asm goto was
>>> tricky: it had something to do with the fact that gcc doesn't know the
>>> exact size of each instructions until further down within compilation
>>
>> Oh, you can't do it in the coompiler, no. But you don't need to. The
>> assembler will pick the right version if you just do "jmp target".
>
> Yep.
>
> Another thing that bothers me with Steven's approach is that decoding
> jumps generated by the compiler seems fragile IMHO.
>
> x86 decoding proposed by https://lkml.org/lkml/2012/3/8/464 :
>
> +static int make_nop_x86(void *map, size_t const offset)
> +{
> + unsigned char *op;
> + unsigned char *nop;
> + int size;
> +
> + /* Determine which type of jmp this is 2 byte or 5. */
> + op = map + offset;
> + switch (*op) {
> + case 0xeb: /* 2 byte */
> + size = 2;
> + nop = ideal_nop2_x86;
> + break;
> + case 0xe9: /* 5 byte */
> + size = 5;
> + nop = ideal_nop;
> + break;
> + default:
> + die(NULL, "Bad jump label section (bad op %x)\n", *op);
> + __builtin_unreachable();
> + }
>
> My though is that the code above does not cover all jump encodings that
> can be generated by past, current and future x86 assemblers.
>
For unconditional jmp that should be pretty safe barring any fundamental
changes to the instruction set, in which case we can enable it as
needed, but for extra robustness it probably should skip prefix bytes.
-hpa