|
@@ -11,6 +11,7 @@
|
|
|
#include "llvm/ADT/StringSwitch.h"
|
|
#include "llvm/ADT/StringSwitch.h"
|
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
|
#include "llvm/Support/Format.h"
|
|
#include "llvm/Support/Format.h"
|
|
|
|
|
+#include "toolchain/codegen/codegen.h"
|
|
|
#include "toolchain/diagnostics/diagnostic_emitter.h"
|
|
#include "toolchain/diagnostics/diagnostic_emitter.h"
|
|
|
#include "toolchain/diagnostics/sorting_diagnostic_consumer.h"
|
|
#include "toolchain/diagnostics/sorting_diagnostic_consumer.h"
|
|
|
#include "toolchain/lexer/tokenized_buffer.h"
|
|
#include "toolchain/lexer/tokenized_buffer.h"
|
|
@@ -116,6 +117,7 @@ enum class DumpMode {
|
|
|
ParseTree,
|
|
ParseTree,
|
|
|
SemanticsIR,
|
|
SemanticsIR,
|
|
|
LLVMIR,
|
|
LLVMIR,
|
|
|
|
|
+ Assembly,
|
|
|
Unknown
|
|
Unknown
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -131,10 +133,11 @@ auto Driver::RunDumpSubcommand(DiagnosticConsumer& consumer,
|
|
|
.Case("parse-tree", DumpMode::ParseTree)
|
|
.Case("parse-tree", DumpMode::ParseTree)
|
|
|
.Case("semantics-ir", DumpMode::SemanticsIR)
|
|
.Case("semantics-ir", DumpMode::SemanticsIR)
|
|
|
.Case("llvm-ir", DumpMode::LLVMIR)
|
|
.Case("llvm-ir", DumpMode::LLVMIR)
|
|
|
|
|
+ .Case("assembly", DumpMode::Assembly)
|
|
|
.Default(DumpMode::Unknown);
|
|
.Default(DumpMode::Unknown);
|
|
|
if (dump_mode == DumpMode::Unknown) {
|
|
if (dump_mode == DumpMode::Unknown) {
|
|
|
error_stream_ << "ERROR: Dump mode should be one of tokens, parse-tree, "
|
|
error_stream_ << "ERROR: Dump mode should be one of tokens, parse-tree, "
|
|
|
- "semantics-ir, or llvm-ir.\n";
|
|
|
|
|
|
|
+ "semantics-ir, llvm-ir, or assembly.\n";
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
args = args.drop_front();
|
|
args = args.drop_front();
|
|
@@ -153,6 +156,13 @@ auto Driver::RunDumpSubcommand(DiagnosticConsumer& consumer,
|
|
|
semantics_ir_include_builtins = true;
|
|
semantics_ir_include_builtins = true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ llvm::StringRef target_triple;
|
|
|
|
|
+ if (dump_mode == DumpMode::Assembly && !args.empty() &&
|
|
|
|
|
+ args.front().starts_with("--target_triple=")) {
|
|
|
|
|
+ target_triple = args.front().split("=").second;
|
|
|
|
|
+ args = args.drop_front();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (args.empty()) {
|
|
if (args.empty()) {
|
|
|
error_stream_ << "ERROR: No input file specified.\n";
|
|
error_stream_ << "ERROR: No input file specified.\n";
|
|
|
return false;
|
|
return false;
|
|
@@ -236,6 +246,13 @@ auto Driver::RunDumpSubcommand(DiagnosticConsumer& consumer,
|
|
|
/*IsForDebug=*/true);
|
|
/*IsForDebug=*/true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (dump_mode == DumpMode::Assembly) {
|
|
|
|
|
+ consumer.Flush();
|
|
|
|
|
+ has_errors |= !Carbon::PrintAssemblyFromModule(
|
|
|
|
|
+ *module, target_triple, error_stream_, output_stream_);
|
|
|
|
|
+ return !has_errors;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
llvm_unreachable("should handle all dump modes");
|
|
llvm_unreachable("should handle all dump modes");
|
|
|
}
|
|
}
|
|
|
|
|
|