http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58272

            Bug ID: 58272
           Summary: unnecessary vtables emission for pure abstract classes
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: froydnj at gcc dot gnu.org
                CC: hubicka at ucw dot cz

Consider the following testcase:

class Interface {
public:
  virtual int f() = 0;
};

class Concrete : public Interface {
public:
  virtual int f();
};

int
Concrete::f()
{
  return 2;
}

Concrete*
do_stuff()
{
  Concrete* c = new Concrete();
  return c;
}

int
call_f()
{
  Interface* i = do_stuff();
  return i->f();
}

compiling this on x86-64 with:

g++ -fno-exceptions -S -o - -O2 vtables.cpp -fno-rtti

produces output with a vtable for Interface, which is completely unused in the
compilation unit.  (Still does it when omitting -fno-rtti, so it's not a
missing check for typeinfo emission or similar.)

Mozilla has a fair number of these and even though one can eliminate them via
--gc-sections, they still take up time to assemble, write to disk, etc. etc. 
Honza and I were talking about them and we did not know whether it was an ABI
requirement that they be emitted or merely a bug in the compiler.  G++ appears
to have some smarts about emitting the vtable for Concrete, so I am somewhat
surprised that it doesn't have similar smarts for the vtable for Interface.

Reply via email to