Messages in this thread | | | From | Andy Lutomirski <> | Date | Wed, 20 May 2015 14:47:10 -0700 | Subject | Re: Avoiding unnecessary jump relocations in gas? |
| |
On Wed, May 20, 2015 at 1:59 PM, H. Peter Anvin <hpa@zytor.com> wrote: > On 05/20/2015 01:53 PM, Andy Lutomirski wrote: >> Egads. Now I understand what that code is. I don't like the balign, >> since this has nothing to do with alignment -- we're creating an array >> of functions. > > Actually it does... we align to the beginning of each slot. If .balign > could be something other than a power of 2 that would work, too.
When I see "align", I think that we want to align to a multiple of X but we don't particularly care which multiple of X. Here we want a specific address and any other address would be an error.
> > I was mostly looking to minimize the amount of gas magic we rely on. > >> Can't we make it explicit? >> >> #define EARLY_IDT_HANDLER_STRIDE 9 >> >> ... >> >> .rept NUM_EXCEPTION_VECTORS >> . = early_idt_handlers + i * EARLY_IDT_HANDLER_STRIDE >> .if (EXCEPTION_ERRCODE_MASK >> i) & 1 >> ASM_NOP2 >> .else >> pushl $0 # Dummy error code, to make stack frame uniform >> .endif >> pushl $i # 20(%esp) Vector number >> jmp early_idt_handler >> i = i + 1 >> .endr >> >> gas will error out if we try to move . backwards, so this should be safe. > > If that works too with all the versions of gas we care about, that would > be fine (and I do appreciate the explicitness.) However, .[b]align is > something that will have been well exercised in every version of gas, so > I do feel slightly safer with it.
I have no idea how to easily test my approach on really old binutils versions, but I'm reasonably confident that assigning to . is common.
--Andy
| |