[clang] Fix CodeGenAction for LLVM IR MemBuffers

Replaces use of getCurrentFile with getCurrentFileOrBufferName
in CodeGenAction. This avoids an assertion error or an incorrect
name chosen for the output file when assertions are disabled.
This error previously occurred when the FrontendInputFile was a
MemoryBuffer instead of a file.

Reviewed By: jlebar

Differential Revision: https://reviews.llvm.org/D121259
This commit is contained in:
Ryan Senanayake 2022-03-09 00:27:27 +00:00 committed by Daniele Castagna
parent af22478933
commit b3dae59b9d
2 changed files with 18 additions and 1 deletions

View File

@ -1113,7 +1113,7 @@ void CodeGenAction::ExecuteAction() {
auto &CodeGenOpts = CI.getCodeGenOpts();
auto &Diagnostics = CI.getDiagnostics();
std::unique_ptr<raw_pwrite_stream> OS =
GetOutputStream(CI, getCurrentFile(), BA);
GetOutputStream(CI, getCurrentFileOrBufferName(), BA);
if (BA != Backend_EmitNothing && !OS)
return;

View File

@ -59,4 +59,21 @@ TEST(CodeGenTest, TestNullCodeGen) {
EXPECT_TRUE(Success);
}
TEST(CodeGenTest, CodeGenFromIRMemBuffer) {
auto Invocation = std::make_shared<CompilerInvocation>();
std::unique_ptr<MemoryBuffer> MemBuffer =
MemoryBuffer::getMemBuffer("", "test.ll");
Invocation->getFrontendOpts().Inputs.push_back(
FrontendInputFile(*MemBuffer, Language::LLVM_IR));
Invocation->getFrontendOpts().ProgramAction = frontend::EmitLLVMOnly;
Invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu";
CompilerInstance Compiler;
Compiler.setInvocation(std::move(Invocation));
Compiler.createDiagnostics();
EXPECT_TRUE(Compiler.hasDiagnostics());
EmitLLVMOnlyAction Action;
bool Success = Compiler.ExecuteAction(Action);
EXPECT_TRUE(Success);
}
}