mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 10:21:04 +01:00
`InstNamer` takes O(N^2) time to resolve N colliding inst names, so it should be limited to textual dumps (where we can presumably prioritize readability over performance). Without this change, compiling 200,000 destructor calls took hours. With this change, compiling 1,000,000 destructor calls takes about 30 seconds.
55 lines
1.8 KiB
C++
55 lines
1.8 KiB
C++
// 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/lower/lower.h"
|
|
|
|
#include <memory>
|
|
#include <optional>
|
|
|
|
#include "common/vlog.h"
|
|
#include "llvm/IR/Verifier.h"
|
|
#include "toolchain/lower/context.h"
|
|
#include "toolchain/lower/file_context.h"
|
|
|
|
namespace Carbon::Lower {
|
|
|
|
auto LowerToLLVM(
|
|
llvm::LLVMContext& llvm_context,
|
|
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> fs,
|
|
const Parse::GetTreeAndSubtreesStore& tree_and_subtrees_getters,
|
|
const SemIR::File& sem_ir, int total_ir_count,
|
|
const LowerToLLVMOptions& options) -> std::unique_ptr<llvm::Module> {
|
|
Context context(
|
|
&llvm_context, std::move(fs), options.want_debug_info,
|
|
&tree_and_subtrees_getters,
|
|
sem_ir.cpp_file() ? sem_ir.cpp_file()->code_generator() : nullptr,
|
|
sem_ir.filename(), total_ir_count, options.opt_level,
|
|
options.mangle_string_fingerprint, options.vlog_stream);
|
|
|
|
std::optional<SemIR::InstNamer> inst_namer;
|
|
if (options.generate_inst_names) {
|
|
inst_namer.emplace(&sem_ir, total_ir_count);
|
|
}
|
|
context
|
|
.GetFileContext(&sem_ir, inst_namer.has_value() ? &*inst_namer : nullptr)
|
|
.LowerDefinitions();
|
|
|
|
std::unique_ptr<llvm::Module> module = std::move(context).Finalize();
|
|
|
|
if (options.vlog_stream) {
|
|
CARBON_VLOG_TO(options.vlog_stream, "*** llvm::Module ***\n");
|
|
module->print(*options.vlog_stream, /*AAW=*/nullptr,
|
|
/*ShouldPreserveUseListOrder=*/false,
|
|
/*IsForDebug=*/true);
|
|
}
|
|
|
|
if (options.llvm_verifier_stream) {
|
|
CARBON_CHECK(!llvm::verifyModule(*module, options.llvm_verifier_stream));
|
|
}
|
|
|
|
return module;
|
|
}
|
|
|
|
} // namespace Carbon::Lower
|