@@ -433,7 +433,8 @@ bool Pointer::isInitialized() const {
433433 if (!isBlockPointer ())
434434 return true ;
435435
436- if (isRoot () && BS.Base == sizeof (GlobalInlineDescriptor)) {
436+ if (isRoot () && BS.Base == sizeof (GlobalInlineDescriptor) &&
437+ Offset == BS.Base ) {
437438 const GlobalInlineDescriptor &GD =
438439 *reinterpret_cast <const GlobalInlineDescriptor *>(block ()->rawData ());
439440 return GD.InitState == GlobalInitState::Initialized;
@@ -461,7 +462,8 @@ bool Pointer::isElementInitialized(unsigned Index) const {
461462 if (isStatic () && BS.Base == 0 )
462463 return true ;
463464
464- if (isRoot () && BS.Base == sizeof (GlobalInlineDescriptor)) {
465+ if (isRoot () && BS.Base == sizeof (GlobalInlineDescriptor) &&
466+ Offset == BS.Base ) {
465467 const GlobalInlineDescriptor &GD =
466468 *reinterpret_cast <const GlobalInlineDescriptor *>(block ()->rawData ());
467469 return GD.InitState == GlobalInitState::Initialized;
@@ -486,7 +488,8 @@ void Pointer::initialize() const {
486488
487489 assert (BS.Pointee && " Cannot initialize null pointer" );
488490
489- if (isRoot () && BS.Base == sizeof (GlobalInlineDescriptor)) {
491+ if (isRoot () && BS.Base == sizeof (GlobalInlineDescriptor) &&
492+ Offset == BS.Base ) {
490493 GlobalInlineDescriptor &GD = *reinterpret_cast <GlobalInlineDescriptor *>(
491494 asBlockPointer ().Pointee ->rawData ());
492495 GD.InitState = GlobalInitState::Initialized;
@@ -496,35 +499,39 @@ void Pointer::initialize() const {
496499 const Descriptor *Desc = getFieldDesc ();
497500 assert (Desc);
498501 if (Desc->isPrimitiveArray ()) {
499- // Primitive global arrays don't have an initmap.
500- if (isStatic () && BS.Base == 0 )
501- return ;
502+ if (Desc->getNumElems () != 0 )
503+ initializeElement (getIndex ());
504+ return ;
505+ }
502506
503- // Nothing to do for these.
504- if (Desc->getNumElems () == 0 )
505- return ;
507+ // Field has its bit in an inline descriptor.
508+ assert (BS.Base != 0 && " Only composite fields can be initialised" );
509+ getInlineDesc ()->IsInitialized = true ;
510+ }
506511
507- InitMapPtr &IM = getInitMap ();
508- if (!IM)
509- IM =
510- std::make_pair ( false , std::make_shared<InitMap>(Desc-> getNumElems ())) ;
512+ void Pointer::initializeElement ( unsigned Index) const {
513+ // Primitive global arrays don't have an initmap.
514+ if ( isStatic () && BS. Base == 0 )
515+ return ;
511516
512- assert (IM );
517+ assert (Index < getFieldDesc ()-> getNumElems () );
513518
514- // All initialized.
515- if (IM->first )
516- return ;
519+ InitMapPtr &IM = getInitMap ();
520+ if (!IM) {
521+ const Descriptor *Desc = getFieldDesc ();
522+ IM = std::make_pair (false , std::make_shared<InitMap>(Desc->getNumElems ()));
523+ }
517524
518- if (IM-> second -> initializeElement ( getIndex ())) {
519- IM-> first = true ;
520- IM-> second . reset ();
521- }
525+ assert (IM);
526+
527+ // All initialized.
528+ if (IM-> first )
522529 return ;
523- }
524530
525- // Field has its bit in an inline descriptor.
526- assert (BS.Base != 0 && " Only composite fields can be initialised" );
527- getInlineDesc ()->IsInitialized = true ;
531+ if (IM->second ->initializeElement (Index)) {
532+ IM->first = true ;
533+ IM->second .reset ();
534+ }
528535}
529536
530537void Pointer::initializeAllElements () const {
@@ -547,7 +554,8 @@ bool Pointer::allElementsInitialized() const {
547554 if (isStatic () && BS.Base == 0 )
548555 return true ;
549556
550- if (isRoot () && BS.Base == sizeof (GlobalInlineDescriptor)) {
557+ if (isRoot () && BS.Base == sizeof (GlobalInlineDescriptor) &&
558+ Offset == BS.Base ) {
551559 const GlobalInlineDescriptor &GD =
552560 *reinterpret_cast <const GlobalInlineDescriptor *>(block ()->rawData ());
553561 return GD.InitState == GlobalInitState::Initialized;
0 commit comments