gbMattN wrote:
This is the diff from the last patch
```
index f2dd22e9bed3..fe561fc66655 100644
--- a/clang/lib/CodeGen/CGExprCXX.cpp
+++ b/clang/lib/CodeGen/CGExprCXX.cpp
@@ -17,10 +17,9 @@
#include "CodeGenFunction.h"
#include "ConstantEmitter.h"
#include "TargetInfo.h"
+#include "clang/AST/CharUnits.h"
#include "clang/Basic/CodeGenOptions.h"
#include "clang/Basic/Sanitizers.h"
-#include "clang/Basic/SourceLocation.h"
-#include "clang/Basic/SourceManager.h"
#include "clang/CodeGen/CGFunctionInfo.h"
#include "llvm/IR/Intrinsics.h"
@@ -1756,12 +1755,17 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const
CXXNewExpr *E) {
// return misaligned memory from a replaced operator new without knowing
// about default alignment.
TypeCheckKind checkKind = CodeGenFunction::TCK_ConstructorCall;
+ CharUnits checkAlignment = result.getAlignment();
const TargetInfo &TI = getContext().getTargetInfo();
unsigned DefaultTargetAlignment = TI.getNewAlign() / TI.getCharWidth();
if (SanOpts.has(SanitizerKind::Alignment) &&
(DefaultTargetAlignment >
- CGM.getContext().getTypeAlignInChars(allocType).getQuantity()))
+ CGM.getContext().getTypeAlignInChars(allocType).getQuantity()) &&
+ !result.getAlignment().isOne() &&
+ result.getAlignment().getQuantity() <= DefaultTargetAlignment) {
checkKind = CodeGenFunction::TCK_ConstructorCallMinimumAlign;
+ checkAlignment = CharUnits::fromQuantity(DefaultTargetAlignment);
+ }
// Emit sanitizer checks for pointer value now, so that in the case of an
// array it was checked only once and not at each constructor call. We may
@@ -1770,9 +1774,9 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const
CXXNewExpr *E) {
// we'll null check the wrong pointer here.
SanitizerSet SkippedChecks;
SkippedChecks.set(SanitizerKind::Null, nullCheck);
- EmitTypeCheck(
- checkKind, E->getAllocatedTypeSourceInfo()->getTypeLoc().getBeginLoc(),
- result, allocType, result.getAlignment(), SkippedChecks, numElements);
+ EmitTypeCheck(checkKind,
+ E->getAllocatedTypeSourceInfo()->getTypeLoc().getBeginLoc(),
+ result, allocType, checkAlignment, SkippedChecks, numElements);
EmitNewInitializer(*this, E, allocType, elementTy, result, numElements,
allocSizeWithoutCookie);
diff --git a/clang/test/CodeGenCXX/ubsan-new-checks.cpp
b/clang/test/CodeGenCXX/ubsan-new-checks.cpp
index 60edd323648a..c8a20ecfed3b 100644
--- a/clang/test/CodeGenCXX/ubsan-new-checks.cpp
+++ b/clang/test/CodeGenCXX/ubsan-new-checks.cpp
@@ -75,7 +75,7 @@ S3 *func_07() {
// CHECK-LABEL: define {{.*}} @_Z7func_07v
// CHECK: and i64 %{{.*}}, 31, !nosanitize
// CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize
- // CHECK: and i64 %{{.*}}, 3, !nosanitize
+ // CHECK: and i64 %{{.*}}, 15, !nosanitize
// CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize
// CHECK: ret ptr
return new S3;
@@ -85,7 +85,7 @@ S3 *func_08() {
// CHECK-LABEL: define {{.*}} @_Z7func_08v
// CHECK: and i64 %{{.*}}, 31, !nosanitize
// CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize
- // CHECK: and i64 %{{.*}}, 3, !nosanitize
+ // CHECK: and i64 %{{.*}}, 15, !nosanitize
// CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize
// CHECK: ret ptr
return new S3[10];
diff --git a/compiler-rt/test/ubsan/TestCases/TypeCheck/minimum-alignment.cpp
b/compiler-rt/test/ubsan/TestCases/TypeCheck/minimum-alignment.cpp
index 4642126ab74c..fb99227ee65f 100644
--- a/compiler-rt/test/ubsan/TestCases/TypeCheck/minimum-alignment.cpp
+++ b/compiler-rt/test/ubsan/TestCases/TypeCheck/minimum-alignment.cpp
@@ -1,7 +1,7 @@
-// RUN: %clangxx %gmlt -fsanitize=alignment %s -o %t
+// RUN: %clangxx %gmlt -std=c++17 -m64 -fsanitize=alignment %s -o %t
// RUN: %run %t 2>&1 | FileCheck %s
-// UNSUPPORTED: i386
+// UNSUPPORTED: i386, i686
// UNSUPPORTED: armv7l
// These sanitizers already overload the new operator so won't compile this
test
@@ -9,6 +9,7 @@
// UNSUPPORTED: ubsan-tsan
#include <cassert>
+#include <cstddef>
#include <cstdlib>
void *operator new(std::size_t count) {
diff --git a/compiler-rt/test/ubsan/TestCases/TypeCheck/misaligned.cpp
b/compiler-rt/test/ubsan/TestCases/TypeCheck/misaligned.cpp
index 4b0b2b5923c6..74d5c9a35754 100644
--- a/compiler-rt/test/ubsan/TestCases/TypeCheck/misaligned.cpp
+++ b/compiler-rt/test/ubsan/TestCases/TypeCheck/misaligned.cpp
@@ -101,7 +101,7 @@ int main(int, char **argv) {
return s->f() && 0;
case 'n':
- // CHECK-NEW: misaligned.cpp:[[@LINE+4]]{{(:21)?}}: runtime error:
constructor call with pointer from operator new on misaligned address
[[PTR:0x[0-9a-f]*]] for type 'S', which requires ta
rget minimum assumed 4 byte alignment
+ // CHECK-NEW: misaligned.cpp:[[@LINE+4]]{{(:21)?}}: runtime error:
constructor call{{( with pointer from operator new)?}} on misaligned address
[[PTR:0x[0-9a-f]*]] for type 'S', which requ
ires {{(4|(target minimum assumed (8|(16))))}} byte alignment
// CHECK-NEW-NEXT: [[PTR]]: note: pointer points here
// CHECK-NEW-NEXT: {{^ 00 00 00 01 02 03 04 05}}
// CHECK-NEW-NEXT: {{^ \^}}
```
It looks like the windows tests are failing due to a python type error, which I
don't entirely understand. I will make sure its either fixed or confirmed to be
a different upstream problem before I merge
https://github.com/llvm/llvm-project/pull/166755
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits