OLD | NEW |
1 //===- subzero/src/IceGlobalContext.h - Global context defs -----*- C++ -*-===// | 1 //===- subzero/src/IceGlobalContext.h - Global context defs -----*- C++ -*-===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 /// | 9 /// |
10 /// \file | 10 /// \file |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 | 475 |
476 void setDisposeGlobalVariablesAfterLowering(bool Value) { | 476 void setDisposeGlobalVariablesAfterLowering(bool Value) { |
477 DisposeGlobalVariablesAfterLowering = Value; | 477 DisposeGlobalVariablesAfterLowering = Value; |
478 } | 478 } |
479 /// @} | 479 /// @} |
480 | 480 |
481 LockedPtr<StringPool> getStrings() const { | 481 LockedPtr<StringPool> getStrings() const { |
482 return LockedPtr<StringPool>(Strings.get(), &StringsLock); | 482 return LockedPtr<StringPool>(Strings.get(), &StringsLock); |
483 } | 483 } |
484 | 484 |
| 485 LockedPtr<VariableDeclarationList> getGlobals() { |
| 486 return LockedPtr<VariableDeclarationList>(&Globals, &InitAllocLock); |
| 487 } |
| 488 |
| 489 bool getGlobalsReceived() { return GlobalsReceived; } |
| 490 |
485 /// Number of function blocks that can be queued before waiting for | 491 /// Number of function blocks that can be queued before waiting for |
486 /// translation | 492 /// translation |
487 /// threads to consume. | 493 /// threads to consume. |
488 static constexpr size_t MaxOptQSize = 1 << 16; | 494 static constexpr size_t MaxOptQSize = 1 << 16; |
489 | 495 |
490 private: | 496 private: |
491 // Try to ensure mutexes are allocated on separate cache lines. | 497 // Try to ensure mutexes are allocated on separate cache lines. |
492 | 498 |
493 // Destructors collaborate with Allocator | 499 // Destructors collaborate with Allocator |
494 ICE_CACHELINE_BOUNDARY; | 500 ICE_CACHELINE_BOUNDARY; |
495 // Managed by getAllocator() | 501 // Managed by getAllocator() |
496 mutable GlobalLockType AllocLock; | 502 mutable GlobalLockType AllocLock; |
497 ArenaAllocator Allocator; | 503 ArenaAllocator Allocator; |
498 | 504 |
499 ICE_CACHELINE_BOUNDARY; | 505 ICE_CACHELINE_BOUNDARY; |
500 // Managed by getInitializerAllocator() | 506 // Managed by getInitializerAllocator() |
501 mutable GlobalLockType InitAllocLock; | 507 mutable GlobalLockType InitAllocLock; |
502 VariableDeclarationList Globals; | 508 VariableDeclarationList Globals; |
| 509 std::atomic<bool> GlobalsReceived; |
503 | 510 |
504 ICE_CACHELINE_BOUNDARY; | 511 ICE_CACHELINE_BOUNDARY; |
505 // Managed by getDestructors() | 512 // Managed by getDestructors() |
506 using DestructorArray = std::vector<std::function<void()>>; | 513 using DestructorArray = std::vector<std::function<void()>>; |
507 mutable GlobalLockType DestructorsLock; | 514 mutable GlobalLockType DestructorsLock; |
508 DestructorArray Destructors; | 515 DestructorArray Destructors; |
509 | 516 |
510 ICE_CACHELINE_BOUNDARY; | 517 ICE_CACHELINE_BOUNDARY; |
511 // Managed by getStrings() | 518 // Managed by getStrings() |
512 mutable GlobalLockType StringsLock; | 519 mutable GlobalLockType StringsLock; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 return LockedPtr<TimerList>(&Timers, &TimerLock); | 612 return LockedPtr<TimerList>(&Timers, &TimerLock); |
606 } | 613 } |
607 LockedPtr<DestructorArray> getDestructors() { | 614 LockedPtr<DestructorArray> getDestructors() { |
608 return LockedPtr<DestructorArray>(&Destructors, &DestructorsLock); | 615 return LockedPtr<DestructorArray>(&Destructors, &DestructorsLock); |
609 } | 616 } |
610 | 617 |
611 void accumulateGlobals(std::unique_ptr<VariableDeclarationList> Globls) { | 618 void accumulateGlobals(std::unique_ptr<VariableDeclarationList> Globls) { |
612 LockedPtr<VariableDeclarationList> _(&Globals, &InitAllocLock); | 619 LockedPtr<VariableDeclarationList> _(&Globals, &InitAllocLock); |
613 if (Globls != nullptr) { | 620 if (Globls != nullptr) { |
614 Globals.merge(Globls.get()); | 621 Globals.merge(Globls.get()); |
| 622 GlobalsReceived = true; |
615 } | 623 } |
616 } | 624 } |
617 | 625 |
618 void lowerGlobalsIfNoCodeHasBeenSeen() { | 626 void lowerGlobalsIfNoCodeHasBeenSeen() { |
619 if (HasSeenCode) | 627 if (HasSeenCode) |
620 return; | 628 return; |
621 constexpr char NoSuffix[] = ""; | 629 constexpr char NoSuffix[] = ""; |
622 lowerGlobals(NoSuffix); | 630 lowerGlobals(NoSuffix); |
623 HasSeenCode = true; | 631 HasSeenCode = true; |
624 } | 632 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 explicit OstreamLocker(GlobalContext *Ctx) : Ctx(Ctx) { Ctx->lockStr(); } | 700 explicit OstreamLocker(GlobalContext *Ctx) : Ctx(Ctx) { Ctx->lockStr(); } |
693 ~OstreamLocker() { Ctx->unlockStr(); } | 701 ~OstreamLocker() { Ctx->unlockStr(); } |
694 | 702 |
695 private: | 703 private: |
696 GlobalContext *const Ctx; | 704 GlobalContext *const Ctx; |
697 }; | 705 }; |
698 | 706 |
699 } // end of namespace Ice | 707 } // end of namespace Ice |
700 | 708 |
701 #endif // SUBZERO_SRC_ICEGLOBALCONTEXT_H | 709 #endif // SUBZERO_SRC_ICEGLOBALCONTEXT_H |
OLD | NEW |