aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGenCXX/vtable-layout.cpp
AgeCommit message (Collapse)Author
2012-10-16Note deleted functions when dumping vtables.David Blaikie
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166056 91177308-0d34-0410-b5e6-96231b3b80d8
2012-03-21For the annals of subtle but terrible bugs: fix a longstanding bugJohn McCall
in vtable layout where virtual methods inherited from virtual bases could be assigned the same vcall adjustment slot if they shared a name and parameter signature but differed in their cv-qualification. The code was already trying to handle this case, but unfortunately used the ordinary type qualifiers (which are always empty here) instead of the method qualifiers. This seems like something that the API should discourage, but I don't know how to carry that principle out in this instance. Eliminate this function's need for an ASTContext while we're at it. This bug affects the ABI, and fixing it brings us into accord with the Itanium ABI (and GCC's implementation of it), but, obviously, technically breaks full compatibility with previous releases of Clang. Just letting you know. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153168 91177308-0d34-0410-b5e6-96231b3b80d8
2011-04-10Change CollectPrimaryBases to collect the bases in the right order. Fixes ↵Anders Carlsson
one half of PR9660. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129252 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-05'const std::type_info*' instead of 'std::type_info const*'Chris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113092 91177308-0d34-0410-b5e6-96231b3b80d8
2010-05-13Rework when and how vtables are emitted, by tracking where vtables areDouglas Gregor
"used" (e.g., we will refer to the vtable in the generated code) and when they are defined (i.e., because we've seen the key function definition). Previously, we were effectively tracking "potential definitions" rather than uses, so we were a bit too eager about emitting vtables for classes without key functions. The new scheme: - For every use of a vtable, Sema calls MarkVTableUsed() to indicate the use. For example, this occurs when calling a virtual member function of the class, defining a constructor of that class type, dynamic_cast'ing from that type to a derived class, casting to/through a virtual base class, etc. - For every definition of a vtable, Sema calls MarkVTableUsed() to indicate the definition. This happens at the end of the translation unit for classes whose key function has been defined (so we can delay computation of the key function; see PR6564), and will also occur with explicit template instantiation definitions. - For every vtable defined/used, we mark all of the virtual member functions of that vtable as defined/used, unless we know that the key function is in another translation unit. This instantiates virtual member functions when needed. - At the end of the translation unit, Sema tells CodeGen (via the ASTConsumer) which vtables must be defined (CodeGen will define them) and which may be used (for which CodeGen will define the vtables lazily). From a language perspective, both the old and the new schemes are permissible: we're allowed to instantiate virtual member functions whenever we want per the standard. However, all other C++ compilers were more lazy than we were, and our eagerness was both a performance issue (we instantiated too much) and a portability problem (we broke Boost test cases, which now pass). Notes: (1) There's a ton of churn in the tests, because the order in which vtables get emitted to IR has changed. I've tried to isolate some of the larger tests from these issues. (2) Some diagnostics related to implicitly-instantiated/implicitly-defined virtual member functions have moved to the point of first use/definition. It's better this way. (3) I could use a review of the places where we MarkVTableUsed, to see if I missed any place where the language effectively requires a vtable. Fixes PR7114 and PR6564. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103718 91177308-0d34-0410-b5e6-96231b3b80d8
2010-04-17Fix a bug where we would sometimes incorrectly mark an vtable function as ↵Anders Carlsson
unused. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101643 91177308-0d34-0410-b5e6-96231b3b80d8
2010-04-15Split adding the primary virtual base offsets out into a separate pass. This ↵Anders Carlsson
fixes a bug where we would lay out virtual bases in the wrong order. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101373 91177308-0d34-0410-b5e6-96231b3b80d8
2010-04-12Typo.Nick Lewycky
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101015 91177308-0d34-0410-b5e6-96231b3b80d8
2010-04-11Fix another bug where we wouldn't generate secondary vtables for ↵Anders Carlsson
construction vtables in some cases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100998 91177308-0d34-0410-b5e6-96231b3b80d8
2010-04-11Fix a bug where we were adding too many vcall offsets in some cases.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100985 91177308-0d34-0410-b5e6-96231b3b80d8
2010-04-10Fix another vbase layout bug.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100952 91177308-0d34-0410-b5e6-96231b3b80d8
2010-04-10Fix a bug where we would add the same function twice in a vtable.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100949 91177308-0d34-0410-b5e6-96231b3b80d8
2010-04-10Simplify the virtual base layout code and fix a bug where we wouldn't store ↵Anders Carlsson
the offset for a virtual base. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100940 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-29Another vtable layout fix, making us match gcc better.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99812 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-25Don't add address points for virtual primary bases that aren't primary bases ↵Anders Carlsson
in the complete class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99555 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-18When dumping vtables, also dump the thunks.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98799 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-11Add a test.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98246 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-10Fix calculation of whether a member function needs a thunk in construction ↵Anders Carlsson
vtables. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98191 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-10We were mistakenly marking morally virtual bases as being uninteresting. Fix ↵Anders Carlsson
this. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98180 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-10Ignore non-interesting bases when emitting construction vtables.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98177 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-10Add newline.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98140 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-10Don't accidentally mark some functions in construction vtables as unused. ↵Anders Carlsson
Also land the test for a previous checkin, now that it's correct. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98139 91177308-0d34-0410-b5e6-96231b3b80d8
2010-03-03Fix a bug with base offset merging that Devang noticed.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97641 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-28Handle unused functions in construction vtables correctly.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97406 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-28When laying out vtables for virtual bases in construction vtables, we need ↵Anders Carlsson
to check if the vtable is a primary base in the layout class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97402 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-28Add another construction vtable test.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97401 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-28More improvements to construction vtables; we know handle vbase offsets ↵Anders Carlsson
correctly (I hope). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97361 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-27Add a simple construction vtable test.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97344 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-27Use the real base offset when calculating vbase offsets.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97338 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-27Don't add this adjustments for pure virtual member functions.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97334 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-27Add another test.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97329 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-27Finish up the changes to this adjustments.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97328 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-27Fix another vtable layout bug; we weren't looking hard enough for overriden ↵Anders Carlsson
functions when determining if an overrider will ever be used. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97306 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-27Handle vcall offset sharing between destructors.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97304 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-27Fix a bug where we were generating an unnecessary vtable for a virtual base ↵Anders Carlsson
that's already a primary virtual base. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97303 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-25Fux a bug where we were trying to add overriders for non-virtual bases of ↵Anders Carlsson
virtual bases more than once. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97173 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-23More fixes. Don't try to emit a virtual base vtable if the virtual base in ↵Anders Carlsson
question is a primary virtual base of some other base. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96881 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-23Always emit vcall offset for the primary base, not only if it's virtual. ↵Anders Carlsson
Remove a debug printf, and add the test case that now passes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96880 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-16Handle layout of vtables for virtual bases.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96355 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-16Fix a bug where we would not emit secondary vtables for bases of a primary base.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96351 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-16Emit vbase offsets.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96329 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-14Don't compute final overriders or build vtables for bases that don't need a ↵Anders Carlsson
vtable. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96171 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-14Improve support for non-virtual 'this' pointer adjustments. With this, it ↵Anders Carlsson
should be possible to use the new vtable layout code for all class hierarchies that do not involve virtual bases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96137 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-13Add basic support for simple non-virtual 'this' pointer adjustments.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96136 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-13Start laying out secondary vtables.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96123 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-13Don't make return adjustments for pure virtual member functions.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96120 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-13Handle virtual bases in return adjustment types.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96119 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-13More work on covariant return types. We now handle non-virtual adjustments fine.Anders Carlsson
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96114 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-12Keep track of the address points for all primary bases, and add the ability ↵Anders Carlsson
to dump multiple address points for a single offset. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95970 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-12Fix a bug causing an assertion when a covariant return type differed fromJohn McCall
an overriden type only by reduced qualification. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95968 91177308-0d34-0410-b5e6-96231b3b80d8