[PATCH] Fix IFUNC symbols assembly mode.
Roman Divacky
rdivacky at freebsd.org
Tue Jan 7 10:36:57 PST 2014
Updated patch, per discussion.
On Mon, Jan 06, 2014 at 05:12:23PM -0500, Rafael Esp??ndola wrote:
> On 6 January 2014 13:50, Roman Divacky <rdivacky at freebsd.org> wrote:
> > Actually, the merging rules are not so simple, this is my attempt to simulate
> > what gnu as is doing:
> >
> > Index: lib/MC/ELFObjectWriter.cpp
> > ===================================================================
> > --- lib/MC/ELFObjectWriter.cpp (revision 198593)
> > +++ lib/MC/ELFObjectWriter.cpp (working copy)
> > @@ -546,6 +546,35 @@
> > // Binding and Type share the same byte as upper and lower nibbles
> > uint8_t Binding = MCELF::GetBinding(OrigData);
> > uint8_t Type = MCELF::GetType(Data);
> > +
> > + // Propagation rules:
> > + // IFUNC > FUNC > OBJECT > NOTYPE
> > + // TLS_OBJECT > OBJECT > NOTYPE
> > + //
> > + // dont let the new type degrade the old type
>
> These need tests. Can IFUNC or FUNC show up in a comparison with
> TLS_OBJECT? Please try to refactor this into a pair of functions like
>
> unsigned getTypePreference(uint8_t Type) {....}
> bool compareTypes(uint8_t TypeA, uint8_t TypeB) { return
> getTypePreference(TypeA) > getTypePreference(TypeB); }
>
>
> > + switch (MCELF::GetType(OrigData)) {
> > + default:
> > + break;
> > + case ELF::STT_GNU_IFUNC:
> > + if (Type == ELF::STT_FUNC || Type == ELF::STT_OBJECT ||
> > + Type == ELF::STT_NOTYPE || Type == ELF::STT_TLS)
> > + Type = ELF::STT_GNU_IFUNC;
> > + break;
> > + case ELF::STT_FUNC:
> > + if (Type == ELF::STT_OBJECT || Type == ELF::STT_NOTYPE ||
> > + Type == ELF::STT_TLS)
> > + Type = ELF::STT_FUNC;
> > + break;
> > + case ELF::STT_OBJECT:
> > + if (Type == ELF::STT_NOTYPE)
> > + Type = ELF::STT_OBJECT;
> > + break;
> > + case ELF::STT_TLS:
> > + if (Type == ELF::STT_OBJECT || Type == ELF::STT_NOTYPE ||
> > + Type == ELF::STT_GNU_IFUNC || Type == ELF::STT_FUNC)
> > + Type = ELF::STT_TLS;
> > + break;
> > + }
> > uint8_t Info = (Binding << ELF_STB_Shift) | (Type << ELF_STT_Shift);
> >
> > // Other and Visibility share the same byte with Visibility using the lower
> >
> >
> > On Sat, Jan 04, 2014 at 03:49:28PM +0100, Roman Divacky wrote:
> >> Hi,
> >>
> >> .globl memcpy
> >> .type memcpy, @gnu_indirect_function
> >> .set memcpy,resolve_memcpy
> >>
> >> is currently misassembled (the memcpy is of type STT_FUNC instead of
> >> STT_GNU_IFUNC).
> >>
> >> This patch fixes it:
> >>
> >> Index: lib/MC/ELFObjectWriter.cpp
> >> ===================================================================
> >> --- lib/MC/ELFObjectWriter.cpp (revision 198480)
> >> +++ lib/MC/ELFObjectWriter.cpp (working copy)
> >> @@ -546,6 +546,9 @@
> >> // Binding and Type share the same byte as upper and lower nibbles
> >> uint8_t Binding = MCELF::GetBinding(OrigData);
> >> uint8_t Type = MCELF::GetType(Data);
> >> + // Keep IFUNC type.
> >> + if (Type == ELF::STT_FUNC && MCELF::GetType(OrigData) == ELF::STT_GNU_IFUNC)
> >> + Type = ELF::STT_GNU_IFUNC;
> >> uint8_t Info = (Binding << ELF_STB_Shift) | (Type << ELF_STT_Shift);
> >>
> >> // Other and Visibility share the same byte with Visibility using the lower
> >> Index: test/MC/ELF/type.s
> >> ===================================================================
> >> --- test/MC/ELF/type.s (revision 198480)
> >> +++ test/MC/ELF/type.s (working copy)
> >> @@ -22,9 +22,9 @@
> >> .type func, at function
> >> .type func, at object
> >>
> >> -ifunc:
> >> .global ifunc
> >> .type ifunc, at gnu_indirect_function
> >> + .set ifunc,func
> >>
> >> tls:
> >> .global tls
> >>
> >> I track this in #18372. Is the patch ok to commit?
> >>
> >> Roman
> >> _______________________________________________
> >> llvm-commits mailing list
> >> llvm-commits at cs.uiuc.edu
> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-------------- next part --------------
A non-text attachment was scrubbed...
Name: llvm.ifunc.patch
Type: text/x-diff
Size: 8245 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140107/a6c7eaaa/attachment.patch>
More information about the llvm-commits
mailing list