28
28
#include " clang/CodeGen/CGFunctionInfo.h"
29
29
#include " llvm/IR/Intrinsics.h"
30
30
#include " llvm/IR/Metadata.h"
31
+ #include " llvm/Support/SaveAndRestore.h"
31
32
#include " llvm/Transforms/Utils/SanitizerStats.h"
32
33
#include < optional>
33
34
@@ -1291,10 +1292,10 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD,
1291
1292
assert (BaseCtorContinueBB);
1292
1293
}
1293
1294
1294
- llvm::Value *const OldThis = CXXThisValue;
1295
1295
for (; B != E && (*B)->isBaseInitializer () && (*B)->isBaseVirtual (); B++) {
1296
1296
if (!ConstructVBases)
1297
1297
continue ;
1298
+ SaveAndRestore ThisRAII (CXXThisValue);
1298
1299
if (CGM.getCodeGenOpts ().StrictVTablePointers &&
1299
1300
CGM.getCodeGenOpts ().OptimizationLevel > 0 &&
1300
1301
isInitializerOfDynamicClass (*B))
@@ -1311,16 +1312,14 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD,
1311
1312
// Then, non-virtual base initializers.
1312
1313
for (; B != E && (*B)->isBaseInitializer (); B++) {
1313
1314
assert (!(*B)->isBaseVirtual ());
1314
-
1315
+ SaveAndRestore ThisRAII (CXXThisValue);
1315
1316
if (CGM.getCodeGenOpts ().StrictVTablePointers &&
1316
1317
CGM.getCodeGenOpts ().OptimizationLevel > 0 &&
1317
1318
isInitializerOfDynamicClass (*B))
1318
1319
CXXThisValue = Builder.CreateLaunderInvariantGroup (LoadCXXThis ());
1319
1320
EmitBaseInitializer (*this , ClassDecl, *B);
1320
1321
}
1321
1322
1322
- CXXThisValue = OldThis;
1323
-
1324
1323
InitializeVTablePointers (ClassDecl);
1325
1324
1326
1325
// And finally, initialize class members.
0 commit comments