diff options
author | John McCall <rjmccall@apple.com> | 2012-03-30 04:25:03 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2012-03-30 04:25:03 +0000 |
commit | 8831303e4fb337d8468ec201011e6247d5d6dfc8 (patch) | |
tree | 41d5be781949cfbea3c9aaa26362bb55fa79030a | |
parent | 5a125b4040212c7955dc7f93080eae3bf1c7c4aa (diff) | |
download | bcm5719-llvm-8831303e4fb337d8468ec201011e6247d5d6dfc8.tar.gz bcm5719-llvm-8831303e4fb337d8468ec201011e6247d5d6dfc8.zip |
Add a note about a missing optimization in the case of virtual
inheritance.
llvm-svn: 153722
-rw-r--r-- | clang/NOTES.txt | 11 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGClass.cpp | 3 |
2 files changed, 14 insertions, 0 deletions
diff --git a/clang/NOTES.txt b/clang/NOTES.txt index 9f7ed4b9591..ca46d1cae47 100644 --- a/clang/NOTES.txt +++ b/clang/NOTES.txt @@ -101,3 +101,14 @@ only if the non-reachability is not due to macro or template metaprogramming. //===---------------------------------------------------------------------===// + +We can still apply a modified version of the constructor/destructor +delegation optimization in cases of virtual inheritance where: + - there is no function-try-block, + - the constructor signature is not variadic, and + - the parameter variables can safely be copied and repassed + to the base constructor because either + - they have not had their addresses taken by the vbase initializers or + - they were passed indirectly. + +//===---------------------------------------------------------------------===// diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index b452c1b7ab4..6303e2069d5 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -731,6 +731,9 @@ void CodeGenFunction::EmitConstructorBody(FunctionArgList &Args) { EHScopeStack::stable_iterator CleanupDepth = EHStack.stable_begin(); + // TODO: in restricted cases, we can emit the vbase initializers of + // a complete ctor and then delegate to the base ctor. + // Emit the constructor prologue, i.e. the base and member // initializers. EmitCtorPrologue(Ctor, CtorType, Args); |