[llvm-branch-commits] [clang] 6e614b0 - [NFC][MSan] Round up OffsetPtr in PoisonMembers
Vitaly Buka via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Dec 7 20:26:55 PST 2020
Author: Vitaly Buka
Date: 2020-12-07T19:57:49-08:00
New Revision: 6e614b0c7ed3a9a66428f342bf2a4b3700525395
URL: https://github.com/llvm/llvm-project/commit/6e614b0c7ed3a9a66428f342bf2a4b3700525395
DIFF: https://github.com/llvm/llvm-project/commit/6e614b0c7ed3a9a66428f342bf2a4b3700525395.diff
LOG: [NFC][MSan] Round up OffsetPtr in PoisonMembers
getFieldOffset(layoutStartOffset) is expected to point to the first trivial
field or the one which follows non-trivial. So it must be byte aligned already.
However this is not obvious without assumptions about callers.
This patch will avoid the need in such assumptions.
Depends on D92727.
Differential Revision: https://reviews.llvm.org/D92728
Added:
Modified:
clang/lib/CodeGen/CGClass.cpp
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index b900ed70152e..1c32929414a5 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -18,6 +18,7 @@
#include "TargetInfo.h"
#include "clang/AST/Attr.h"
#include "clang/AST/CXXInheritance.h"
+#include "clang/AST/CharUnits.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/EvaluatedExprVisitor.h"
#include "clang/AST/RecordLayout.h"
@@ -1729,37 +1730,35 @@ namespace {
/// \param layoutEndOffset index of the ASTRecordLayout field to
/// end poisoning (exclusive)
void PoisonMembers(CodeGenFunction &CGF, unsigned layoutStartOffset,
- unsigned layoutEndOffset) {
+ unsigned layoutEndOffset) {
ASTContext &Context = CGF.getContext();
const ASTRecordLayout &Layout =
Context.getASTRecordLayout(Dtor->getParent());
- llvm::ConstantInt *OffsetSizePtr = llvm::ConstantInt::get(
- CGF.SizeTy,
- Context.toCharUnitsFromBits(Layout.getFieldOffset(layoutStartOffset))
- .getQuantity());
+ // It's a first trivia field so it should be at the begining of char,
+ // still round up start offset just in case.
+ CharUnits PoisonStart =
+ Context.toCharUnitsFromBits(Layout.getFieldOffset(layoutStartOffset) +
+ Context.getCharWidth() - 1);
+ llvm::ConstantInt *OffsetSizePtr =
+ llvm::ConstantInt::get(CGF.SizeTy, PoisonStart.getQuantity());
llvm::Value *OffsetPtr = CGF.Builder.CreateGEP(
CGF.Builder.CreateBitCast(CGF.LoadCXXThis(), CGF.Int8PtrTy),
OffsetSizePtr);
- CharUnits::QuantityType PoisonSize;
+ CharUnits PoisonEnd;
if (layoutEndOffset >= Layout.getFieldCount()) {
- PoisonSize = Layout.getNonVirtualSize().getQuantity() -
- Context.toCharUnitsFromBits(
- Layout.getFieldOffset(layoutStartOffset))
- .getQuantity();
+ PoisonEnd = Layout.getNonVirtualSize();
} else {
- PoisonSize = Context.toCharUnitsFromBits(
- Layout.getFieldOffset(layoutEndOffset) -
- Layout.getFieldOffset(layoutStartOffset))
- .getQuantity();
+ PoisonEnd =
+ Context.toCharUnitsFromBits(Layout.getFieldOffset(layoutEndOffset));
}
-
- if (PoisonSize == 0)
+ CharUnits PoisonSize = PoisonEnd - PoisonStart;
+ if (!PoisonSize.isPositive())
return;
- EmitSanitizerDtorCallback(CGF, OffsetPtr, PoisonSize);
+ EmitSanitizerDtorCallback(CGF, OffsetPtr, PoisonSize.getQuantity());
}
};
More information about the llvm-branch-commits
mailing list