@@ -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