| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- // Exceptions. See /LICENSE for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- #include "toolchain/check/global_init.h"
- #include "toolchain/check/context.h"
- namespace Carbon::Check {
- auto GlobalInit::Resume() -> void {
- context_->inst_block_stack().Push(block_id_, block_);
- }
- auto GlobalInit::Suspend() -> void {
- // TODO: Consider splicing together blocks in order to avoid sizable copies
- // here.
- auto contents = context_->inst_block_stack().PeekCurrentBlockContents();
- block_.assign(contents.begin(), contents.end());
- block_id_ = context_->inst_block_stack().PeekOrAdd();
- context_->inst_block_stack().PopAndDiscard();
- }
- auto GlobalInit::Finalize() -> void {
- // __global_init is only added if there are initialization instructions.
- if (block_.empty() && block_id_ == SemIR::InstBlockId::GlobalInit) {
- return;
- }
- Resume();
- context_->AddInst<SemIR::Return>(Parse::NodeId::None, {});
- // Pop the GlobalInit block here to finalize it.
- context_->inst_block_stack().Pop();
- auto name_id = context_->sem_ir().identifiers().Add("__global_init");
- context_->sem_ir().set_global_ctor_id(context_->sem_ir().functions().Add(
- {{.name_id = SemIR::NameId::ForIdentifier(name_id),
- .parent_scope_id = SemIR::NameScopeId::Package,
- .generic_id = SemIR::GenericId::None,
- .first_param_node_id = Parse::NodeId::None,
- .last_param_node_id = Parse::NodeId::None,
- .pattern_block_id = SemIR::InstBlockId::Empty,
- .implicit_param_patterns_id = SemIR::InstBlockId::None,
- .param_patterns_id = SemIR::InstBlockId::Empty,
- .call_params_id = SemIR::InstBlockId::Empty,
- .is_extern = false,
- .extern_library_id = SemIR::LibraryNameId::None,
- .non_owning_decl_id = SemIR::InstId::None,
- .first_owning_decl_id = SemIR::InstId::None},
- {.return_slot_pattern_id = SemIR::InstId::None,
- .body_block_ids = {SemIR::InstBlockId::GlobalInit}}}));
- }
- } // namespace Carbon::Check
|