Skip to content

Commit fb060d2

Browse files
PavelKopylakiramenai
authored andcommitted
[EraVM] MC C-API: make a copy of the input buffer.
This ensures that the new buffer is null-terminated, which is required for the current AsmParser implementation.
1 parent 1b49bbc commit fb060d2

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

llvm/lib/MC/MCC/AssemblerC.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ LLVMBool LLVMAssembleEraVM(LLVMTargetMachineRef T, LLVMMemoryBufferRef InBuffer,
7777
MemoryBuffer *InMemBuf = unwrap(InBuffer);
7878
// Create a copy of the input buffer because SourceMgr will take
7979
// ownership of the memory buffer.
80-
// The buffer we pass to AsmParser doesn't need to be null-terminated.
81-
std::unique_ptr<MemoryBuffer> BufferPtr =
82-
MemoryBuffer::getMemBuffer(InMemBuf->getMemBufferRef(),
83-
/*RequiresNullTerminator=*/false);
80+
// The buffer we pass to AsmParser needs to be null-terminated, which is
81+
// ensured by the getMemBufferCopy implementation.
82+
std::unique_ptr<MemoryBuffer> BufferPtr = MemoryBuffer::getMemBufferCopy(
83+
InMemBuf->getBuffer(), InMemBuf->getBufferIdentifier());
8484

8585
llvm::SmallString<0> ErrorMsgBuffer;
8686
llvm::raw_svector_ostream ErrorMsgOS(ErrorMsgBuffer);

llvm/unittests/MC/EraVM/AssemblerTest.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,34 @@ TEST_F(AssemblerCTest, AsmParserError) {
125125
LLVMDisposeMemoryBuffer(AsmMemBuffer);
126126
}
127127

128+
// NOLINTNEXTLINE(cppcoreguidelines-special-member-functions)
129+
TEST_F(AssemblerCTest, NoBufferNullTerminator) {
130+
StringRef Asm = " \
131+
.text \n\
132+
get_glob: \n\
133+
add r1, r1, r1 \n\
134+
ret";
135+
136+
// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays, hicpp-avoid-c-arrays)
137+
auto Buffer = std::make_unique<char[]>(Asm.size());
138+
std::memcpy(Buffer.get(), Asm.data(), Asm.size());
139+
StringRef StrBuffer(Buffer.get(), Asm.size());
140+
std::unique_ptr<MemoryBuffer> MemBuffer =
141+
MemoryBuffer::getMemBuffer(StrBuffer, "",
142+
/*RequiresNullTerminator=*/false);
143+
144+
LLVMMemoryBufferRef AsmMemBuffer = llvm::wrap(MemBuffer.get());
145+
LLVMMemoryBufferRef ObjMemBuffer = nullptr;
146+
char *ErrMsg = nullptr;
147+
// Return code 'true' denotes an error.
148+
if (LLVMAssembleEraVM(TM, AsmMemBuffer, &ObjMemBuffer, &ErrMsg)) {
149+
FAIL() << "Failed to assembly:" << ErrMsg;
150+
LLVMDisposeMessage(ErrMsg);
151+
return;
152+
}
153+
LLVMDisposeMemoryBuffer(ObjMemBuffer);
154+
}
155+
128156
// NOLINTNEXTLINE(cppcoreguidelines-special-member-functions)
129157
TEST_F(AssemblerCTest, ToManyInstructionsError) {
130158
std::string Asm = ".text";

0 commit comments

Comments
 (0)