[cfe-dev] typeinfo visibility for pointer to incomplete type

Douwe Gelling via cfe-dev cfe-dev at lists.llvm.org
Tue Jan 24 06:39:49 PST 2017


I see, thanks for the explanation.. maybe some warning can be issued when
this happens? It makes the typeinfo
of ptr to incomplete type basically useless in clang, whereas it works fine
with other compilers
(gcc makes it weak external for example)

I feel it's a rather weird pitfall that will cause runtime errors and it's
very easy to diagnose for compilers, though
there might be usecases I don't understand of course



On Mon, Jan 23, 2017 at 8:06 PM Vedant Kumar <vsk at apple.com> wrote:

> It looks like getTypeInfoLinkage (ItaniumCXXABI.cpp) can return
> 'linkonce_odr'
> if SomeClass has a definition, and returns 'internal' otherwise. The
> rationale
> is that type info for incomplete types must be kept separate from the type
> info
> for complete types. IIUC we do this because inkonce_odr definitions can be
> used
> by optimizations at any point, so the correct/full definition needs to be
> available up front.
>
> I'm CC'ing David since he wrote the comment, and can probably correct me
> if I
> got this wrong.
>
> best,
> vedant
>
> > On Jan 22, 2017, at 5:52 AM, Douwe Gelling <douwegelling at gmail.com>
> wrote:
> >
> > I've reproduced it both on the system clang:
> >
> > Apple LLVM version 8.0.0 (clang-800.0.42.1)
> >
> > and on a newer clang installed with homebrew:
> >
> > clang version 3.9.1 (tags/RELEASE_391/final)
> > Target: x86_64-apple-darwin16.3.0
> >
> > In llvm ir, it's marked internal constant with both compilers as well
> >
> > On Fri, Jan 20, 2017 at 6:23 PM Vedant Kumar <vsk at apple.com> wrote:
> > What version of clang are you using?
> >
> > I tried referring to the typeid of SomeClass* from two different
> compilation
> > units and ended up with just one copy of __ZTSP9SomeClass in my binary.
> The
> > symbol is marked as 'linkonce_odr constant' in LLVM IR, which checks out.
> >
> > $ nm -m t | grep ZTSP9SomeClass
> > 0000000100001f60 (__TEXT,__const) weak external __ZTSP9SomeClass
> >
> > best,
> > vedant
> >
> > > On Jan 20, 2017, at 5:15 AM, Douwe Gelling via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
> > >
> > > Hi all,
> > >
> > > When taking the typeinfo of a pointer to incomplete type, clang++
> emits type info for the pointer in the resulting binary, but makes that
> typeinfo non-external (on osx at least). Is this intended? I'd have
> expected it to be weak external so that when the type is defined in other
> compilation units, the typeinfo isn't defined multiple times.
> > >
> > > sample code:
> > >
> > > #include <typeinfo>
> > > #include <iostream>
> > > class SomeClass;
> > >
> > > int main()
> > > {
> > >   std::cout << typeid(SomeClass*).name() << std::endl;
> > > }
> > >
> > > when running nm -m on the resulting binary, it contains:
> > >
> > > 0000000000000414 (__TEXT,__const) non-external __ZTSP9SomeClass
> > >
> > > _______________________________________________
> > > cfe-dev mailing list
> > > cfe-dev at lists.llvm.org
> > > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170124/a97512ac/attachment.html>


More information about the cfe-dev mailing list