[clang] 06d2176 - [clang][Interp][NFC] Move global variable init case to the top
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 19 23:26:27 PDT 2024
Author: Timm Bäder
Date: 2024-07-20T08:26:06+02:00
New Revision: 06d2176d81cab1d3ed8d0c17f78c1d3ef65cbab8
URL: https://github.com/llvm/llvm-project/commit/06d2176d81cab1d3ed8d0c17f78c1d3ef65cbab8
DIFF: https://github.com/llvm/llvm-project/commit/06d2176d81cab1d3ed8d0c17f78c1d3ef65cbab8.diff
LOG: [clang][Interp][NFC] Move global variable init case to the top
of the respective functions. Previously, we did not properly mark
global zero sized arrays as initialized.
Added:
Modified:
clang/lib/AST/Interp/Pointer.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/Pointer.cpp b/clang/lib/AST/Interp/Pointer.cpp
index ff4da0fa805dc..b22b4b1918ba5 100644
--- a/clang/lib/AST/Interp/Pointer.cpp
+++ b/clang/lib/AST/Interp/Pointer.cpp
@@ -227,6 +227,12 @@ bool Pointer::isInitialized() const {
if (isIntegralPointer())
return true;
+ if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) {
+ const GlobalInlineDescriptor &GD =
+ *reinterpret_cast<const GlobalInlineDescriptor *>(block()->rawData());
+ return GD.InitState == GlobalInitState::Initialized;
+ }
+
assert(PointeeStorage.BS.Pointee &&
"Cannot check if null pointer was initialized");
const Descriptor *Desc = getFieldDesc();
@@ -249,12 +255,6 @@ bool Pointer::isInitialized() const {
if (asBlockPointer().Base == 0)
return true;
- if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) {
- const GlobalInlineDescriptor &GD =
- *reinterpret_cast<const GlobalInlineDescriptor *>(block()->rawData());
- return GD.InitState == GlobalInitState::Initialized;
- }
-
// Field has its bit in an inline descriptor.
return getInlineDesc()->IsInitialized;
}
@@ -266,6 +266,13 @@ void Pointer::initialize() const {
assert(PointeeStorage.BS.Pointee && "Cannot initialize null pointer");
const Descriptor *Desc = getFieldDesc();
+ if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) {
+ GlobalInlineDescriptor &GD = *reinterpret_cast<GlobalInlineDescriptor *>(
+ asBlockPointer().Pointee->rawData());
+ GD.InitState = GlobalInitState::Initialized;
+ return;
+ }
+
assert(Desc);
if (Desc->isPrimitiveArray()) {
// Primitive global arrays don't have an initmap.
@@ -294,13 +301,6 @@ void Pointer::initialize() const {
return;
}
- if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) {
- GlobalInlineDescriptor &GD = *reinterpret_cast<GlobalInlineDescriptor *>(
- asBlockPointer().Pointee->rawData());
- GD.InitState = GlobalInitState::Initialized;
- return;
- }
-
// Field has its bit in an inline descriptor.
assert(PointeeStorage.BS.Base != 0 &&
"Only composite fields can be initialised");
More information about the cfe-commits
mailing list