[PATCH] D56941: Fix a bug that file size is sometimes silently rounded up to the page size.

Rui Ueyama via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 18 16:32:55 PST 2019


ruiu updated this revision to Diff 182638.
ruiu added a comment.

- rebase


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D56941/new/

https://reviews.llvm.org/D56941

Files:
  lld/test/ELF/stdout.s
  llvm/lib/Support/FileOutputBuffer.cpp


Index: llvm/lib/Support/FileOutputBuffer.cpp
===================================================================
--- llvm/lib/Support/FileOutputBuffer.cpp
+++ llvm/lib/Support/FileOutputBuffer.cpp
@@ -76,20 +76,20 @@
 // output file on commit(). This is used only when we cannot use OnDiskBuffer.
 class InMemoryBuffer : public FileOutputBuffer {
 public:
-  InMemoryBuffer(StringRef Path, MemoryBlock Buf, unsigned Mode)
-      : FileOutputBuffer(Path), Buffer(Buf), Mode(Mode) {}
+  InMemoryBuffer(StringRef Path, MemoryBlock Buf, unsigned Mode, size_t Size)
+      : FileOutputBuffer(Path), Buffer(Buf), Mode(Mode), Size(Size) {}
 
   uint8_t *getBufferStart() const override { return (uint8_t *)Buffer.base(); }
 
   uint8_t *getBufferEnd() const override {
-    return (uint8_t *)Buffer.base() + Buffer.size();
+    return (uint8_t *)Buffer.base() + Size;
   }
 
-  size_t getBufferSize() const override { return Buffer.size(); }
+  size_t getBufferSize() const override { return Size; }
 
   Error commit() override {
     if (FinalPath == "-") {
-      llvm::outs() << StringRef((const char *)Buffer.base(), Buffer.size());
+      llvm::outs() << StringRef((const char *)Buffer.base(), Size);
       return Error::success();
     }
 
@@ -100,13 +100,14 @@
             openFileForWrite(FinalPath, FD, CD_CreateAlways, OF_None, Mode))
       return errorCodeToError(EC);
     raw_fd_ostream OS(FD, /*shouldClose=*/true, /*unbuffered=*/true);
-    OS << StringRef((const char *)Buffer.base(), Buffer.size());
+    OS << StringRef((const char *)Buffer.base(), Size);
     return Error::success();
   }
 
 private:
   OwningMemoryBlock Buffer;
   unsigned Mode;
+  size_t Size;
 };
 } // namespace
 
@@ -117,7 +118,7 @@
       Size, nullptr, sys::Memory::MF_READ | sys::Memory::MF_WRITE, EC);
   if (EC)
     return errorCodeToError(EC);
-  return llvm::make_unique<InMemoryBuffer>(Path, MB, Mode);
+  return llvm::make_unique<InMemoryBuffer>(Path, MB, Size, Mode);
 }
 
 static Expected<std::unique_ptr<OnDiskBuffer>>
Index: lld/test/ELF/stdout.s
===================================================================
--- lld/test/ELF/stdout.s
+++ lld/test/ELF/stdout.s
@@ -1,12 +1,15 @@
 # REQUIRES: x86
 
 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
-# RUN: ld.lld %t.o -o - > %t
-# RUN: llvm-objdump -d %t | FileCheck %s
+# RUN: ld.lld %t.o -o - > %t1
+# RUN: llvm-objdump -d %t1 | FileCheck %s
 
 # CHECK: 0000000000201000 _start:
 # CHECK: 201000: 90 nop
 
+# RUN: ld.lld %t.o -o %t2
+# RUN: diff %t1 %t2
+
 .globl _start
 _start:
   nop


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56941.182638.patch
Type: text/x-patch
Size: 2569 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190119/c8ac1e37/attachment.bin>


More information about the llvm-commits mailing list