[llvm-dev] How to force unused external routine declaration into object
David Blaikie via llvm-dev
llvm-dev at lists.llvm.org
Fri May 8 10:00:52 PDT 2020
yeah, don't think there's anything builtin to handle that - likely you'll
have to roll your own
On Fri, May 8, 2020 at 7:37 AM John Reagan <john.reagan at vmssoftware.com>
wrote:
> Yes, a external declaration with no uses. No calls to it. No address
> taken. Just the external declaration and I want it to say around and
> make it into the ELF symbol table as an undefined external reference.
>
> Our BLISS language behaves that way and we have code that relies on that
> behavior as a way to get the linker to include a particular routine into
> the final image. On our other platforms, our old backend had to invent
> a special attribute to indicate "you must put this in the ELF symbol
> table regardless".
>
> I can easily create a compiler-generated static and initialize it with
> the address. That will do what I want at the slight expense of a static
> location (memory is cheap) and a relocation for the linker to process
> (it is already doing a ton anyway, what's one more). It isn't that
> common so I'm not too worried. I was just wondering if I was missing it.
>
> Thanks
>
> On 5/7/2020 9:58 PM, David Blaikie wrote:
> >
> >
> > On Thu, May 7, 2020 at 6:47 PM John Reagan via llvm-dev
> > <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
> >
> > I had thought about "used", but not aware of the @llvm.used, et al.
> >
> > I wrote some test programs with __attribute__((used)) but that felt
> like
> > something you'd put on function definitions to force code to be
> > generated regardless.
> >
> >
> > Isn't that what you're asking for?
> >
> > Though I'm slightly confused by your original statement - /LLVM/ (the
> > middle/backend, compiler - generating object files) wouldn't discard an
> > external-linkage function with no calls, because the call might be in
> > another module. Oh, a declaration?
> >
> > You have a declaration (without a definition) of a function in an
> > llvm::Module and you want some remnant of that to appear in the object
> > file? Yeah, I don't think that's supported - how's that done on other
> > compilers/what's the prior art you're trying to emulate here?
> >
> >
> >
> > In the worst case, I'll do some metadata hack (I've ready had to do
> that
> > for BLISS' GLOBAL BIND feature).
> >
> > Thanks for the response. I'll let folks know what I find out.
> >
> > P.S. we're about to enter field test for OpenVMS after 2+ years of
> work
> > on the system and compilers. I can now boot it under VBox on my W10
> > system here at home.
> >
> > On 5/7/2020 4:16 PM, Robinson, Paul wrote:
> > >
> > >
> > >> -----Original Message-----
> > >> From: llvm-dev <llvm-dev-bounces at lists.llvm.org
> > <mailto:llvm-dev-bounces at lists.llvm.org>> On Behalf Of John Reagan
> > >> via llvm-dev
> > >> Sent: Wednesday, May 6, 2020 9:29 PM
> > >> To: via llvm-dev <llvm-dev at lists.llvm.org
> > <mailto:llvm-dev at lists.llvm.org>>
> > >> Subject: [llvm-dev] How to force unused external routine
> > declaration into
> > >> object
> > >>
> > >> I'm defining an external function in the IR that has no uses at
> > all. No
> > >> calls, no address taken, nada.
> > >>
> > >> Such an unused declaration seems to be just dropped on the floor
> > as not
> > >> needed. Seems reasonable in most cases.
> > >>
> > >> However, one of my OpenVMS compilers (BLISS) has a language rule
> that
> > >> expects such definitions to get into the ELF symbol table as a
> way to
> > >> compel the linker to include certain object modules.
> > >>
> > >> With our backend for our older targets, we had a
> "required_om_entry"
> > >> function attribute that told our backend to put it out regardless.
> > >>
> > >> I was looking at the list of function attributes and don't see
> > anything
> > >> that would accomplish this.
> > >>
> > >> I could just create a bogus variable and initialize it with the
> > >> function's value, but that seems unsavory.
> > >>
> > >> I'm still using a way old version but I'll adapt as needed.
> > >>
> > >> Any suggestions? Did I miss something?
> > >
> > > Hi John,
> > >
> > > This sounds like __attribute__((used)) which Clang turns into
> > > entries in the @llvm.used list. There's also @llvm.compiler.used
> > > and I'm not clear what the difference is, but hopefully that's
> > > enough of a pointer that you can get it to work for Bliss.
> > >
> > > --paulr
> > >
> > >>
> > >> John (safely at home with sufficient food & wine)
> > >> _______________________________________________
> > >> LLVM Developers mailing list
> > >> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> > >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200508/13c9414e/attachment.html>
More information about the llvm-dev
mailing list