Files
carbon-lang/toolchain/codegen/codegen.cpp
T
Jon Ross-Perkins 45ca3d28f5 Drop "diagnostic" from some filenames in the "diagnostics" folder (#6686)
Mainly because "sorting_diagnostic_consumer" is legacy, since
`SortingDiagnosticConsumer` became `SortingConsumer`. Also better
reflecting contents of these files.

Where I'm not renaming, I'm less positive about dropping "diagnostics"
from "file_diagnostics" and "null_diagnostics" (which contain both a
consumer and emitter, and "null.h" seems like poor naming), so not doing
that here. Also "diagnostic.h" contains `struct Diagnostic`, so is a
decent fit.

Assisted-by: Google Antigravity with Gemini 3 Flash
2026-02-04 17:24:55 +00:00

49 lines
1.5 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/codegen/codegen.h"
#include <memory>
#include <optional>
#include <string>
#include "common/check.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/TargetParser/Host.h"
#include "toolchain/diagnostics/consumer.h"
namespace Carbon {
auto CodeGen::EmitAssembly(llvm::raw_pwrite_stream& out) -> bool {
return EmitCode(out, llvm::CodeGenFileType::AssemblyFile);
}
auto CodeGen::EmitObject(llvm::raw_pwrite_stream& out) -> bool {
return EmitCode(out, llvm::CodeGenFileType::ObjectFile);
}
auto CodeGen::EmitCode(llvm::raw_pwrite_stream& out,
llvm::CodeGenFileType file_type) -> bool {
module_->setDataLayout(target_machine_->createDataLayout());
// Using the legacy PM to generate the assembly since the new PM
// does not work with this yet.
// TODO: Make the new PM work with the codegen pipeline.
llvm::legacy::PassManager pass;
// Note that this returns true on an error.
if (target_machine_->addPassesToEmitFile(pass, out, nullptr, file_type)) {
CARBON_DIAGNOSTIC(CodeGenUnableToEmit, Error,
"unable to emit to this file");
emitter_.Emit(module_->getName(), CodeGenUnableToEmit);
return false;
}
pass.run(*module_);
return true;
}
} // namespace Carbon