From 0041382198f20fe51d8574363bc91c317c7f3c71 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Fri, 2 Dec 2022 16:48:27 -0800 Subject: [PATCH] [llvm-objcopy] Fix --section-add when section contain empty bytes Implicit cast between char* and StringRef when writing sections. Reproduce: ``` $> llvm-objcopy --dump-section=name=name.data out.wasm $> llvm-objcopy --remove-section=name out.wasm out_no_name.wasm $> llvm-objcopy --add-section=name=name.data out_no_name.wasm out_new_name.wasm # With wasm-objdump -h we can see that the name section is not totally copied in the new wasm file (if it actually contain empty bytes) ``` Reviewed By: dschuff Differential Revision: https://reviews.llvm.org/D139210 --- llvm/lib/ObjCopy/wasm/WasmObjcopy.cpp | 6 ++++-- llvm/test/tools/llvm-objcopy/wasm/add-section.test | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/llvm/lib/ObjCopy/wasm/WasmObjcopy.cpp b/llvm/lib/ObjCopy/wasm/WasmObjcopy.cpp index 6877cd6..19f10bf 100644 --- a/llvm/lib/ObjCopy/wasm/WasmObjcopy.cpp +++ b/llvm/lib/ObjCopy/wasm/WasmObjcopy.cpp @@ -126,9 +126,11 @@ static Error handleArgs(const CommonConfig &Config, Object &Obj) { Sec.SectionType = llvm::wasm::WASM_SEC_CUSTOM; Sec.Name = NewSection.SectionName; + llvm::StringRef InputData = + llvm::StringRef(NewSection.SectionData->getBufferStart(), + NewSection.SectionData->getBufferSize()); std::unique_ptr BufferCopy = MemoryBuffer::getMemBufferCopy( - NewSection.SectionData->getBufferStart(), - NewSection.SectionData->getBufferIdentifier()); + InputData, NewSection.SectionData->getBufferIdentifier()); Sec.Contents = makeArrayRef( reinterpret_cast(BufferCopy->getBufferStart()), BufferCopy->getBufferSize()); diff --git a/llvm/test/tools/llvm-objcopy/wasm/add-section.test b/llvm/test/tools/llvm-objcopy/wasm/add-section.test index 2f32eac..46bf4e9 100644 --- a/llvm/test/tools/llvm-objcopy/wasm/add-section.test +++ b/llvm/test/tools/llvm-objcopy/wasm/add-section.test @@ -20,6 +20,17 @@ # REPLACE: Name: foo # REPLACE: Payload: 3132330A +# Check that raw data bytes can be imported and exported unchanged especially the ones containing empty bytes. +# RUN: echo -en '\x02\x01\x00\x01\x02' > %t6 +# RUN: llvm-objcopy --add-section=bar=%t6 %t %t7 +# RUN: llvm-objcopy --dump-section=bar=%t8 %t7 +# RUN: diff %t8 %t6 +# RUN: obj2yaml %t7 | FileCheck %s --check-prefix=RAW-DATA + +# Check that raw data is well formated in the file as well. +# RAW-DATA: Name: bar +# RAW-DATA-NEXT: Payload: '0201000102' + --- !WASM FileHeader: Version: 0x00000001 -- 2.7.4