2828#include " clang/CodeGen/CGFunctionInfo.h"
2929#include " llvm/IR/Intrinsics.h"
3030#include " llvm/IR/Metadata.h"
31+ #include " llvm/Support/SaveAndRestore.h"
3132#include " llvm/Transforms/Utils/SanitizerStats.h"
3233#include < optional>
3334
@@ -1291,10 +1292,10 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD,
12911292 assert (BaseCtorContinueBB);
12921293 }
12931294
1294- llvm::Value *const OldThis = CXXThisValue;
12951295 for (; B != E && (*B)->isBaseInitializer () && (*B)->isBaseVirtual (); B++) {
12961296 if (!ConstructVBases)
12971297 continue ;
1298+ SaveAndRestore ThisRAII (CXXThisValue);
12981299 if (CGM.getCodeGenOpts ().StrictVTablePointers &&
12991300 CGM.getCodeGenOpts ().OptimizationLevel > 0 &&
13001301 isInitializerOfDynamicClass (*B))
@@ -1311,16 +1312,14 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD,
13111312 // Then, non-virtual base initializers.
13121313 for (; B != E && (*B)->isBaseInitializer (); B++) {
13131314 assert (!(*B)->isBaseVirtual ());
1314-
1315+ SaveAndRestore ThisRAII (CXXThisValue);
13151316 if (CGM.getCodeGenOpts ().StrictVTablePointers &&
13161317 CGM.getCodeGenOpts ().OptimizationLevel > 0 &&
13171318 isInitializerOfDynamicClass (*B))
13181319 CXXThisValue = Builder.CreateLaunderInvariantGroup (LoadCXXThis ());
13191320 EmitBaseInitializer (*this , ClassDecl, *B);
13201321 }
13211322
1322- CXXThisValue = OldThis;
1323-
13241323 InitializeVTablePointers (ClassDecl);
13251324
13261325 // And finally, initialize class members.
0 commit comments