summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/raw_ostream.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-04-20 13:04:30 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-04-20 13:04:30 +0000
commit4ba9af11417c45abc063c9906c7e593b85fccc17 (patch)
tree74c9c3c8863fad2220549977653461c7e5eddc9f /llvm/lib/Support/raw_ostream.cpp
parent5de4a6c0af0df9f5ae5f9614d2a5fd0f17c597b8 (diff)
downloadbcm5719-llvm-4ba9af11417c45abc063c9906c7e593b85fccc17.tar.gz
bcm5719-llvm-4ba9af11417c45abc063c9906c7e593b85fccc17.zip
Don't allow pwrite to resize a stream.
The current implementations could exhibit some behavior differences: raw_fd_ostream: Whatever the underlying fd does with seek+write. In a normal file, the write position would be back to the old offset. raw_svector_ostream: The write position is always the end of the stream, so after pwrite the write position would be the new end. This matches what OS_X (all BSD?) do with a pwrite in a O_APPEND fd. Given that we don't need that feature and don't use O_APPEND a lot in LLVM, just disallow it. I am open to suggestions on renaming pwrite to something else, but this fixes the issue for now. Thanks to Yaron Keren for reporting it. llvm-svn: 235303
Diffstat (limited to 'llvm/lib/Support/raw_ostream.cpp')
-rw-r--r--llvm/lib/Support/raw_ostream.cpp15
1 files changed, 6 insertions, 9 deletions
diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp
index 6f9f910cad9..4c0b6c7b563 100644
--- a/llvm/lib/Support/raw_ostream.cpp
+++ b/llvm/lib/Support/raw_ostream.cpp
@@ -630,7 +630,8 @@ uint64_t raw_fd_ostream::seek(uint64_t off) {
return pos;
}
-void raw_fd_ostream::pwrite(const char *Ptr, size_t Size, uint64_t Offset) {
+void raw_fd_ostream::pwrite_impl(const char *Ptr, size_t Size,
+ uint64_t Offset) {
uint64_t Pos = tell();
seek(Offset);
write(Ptr, Size);
@@ -781,14 +782,9 @@ raw_svector_ostream::~raw_svector_ostream() {
flush();
}
-void raw_svector_ostream::pwrite(const char *Ptr, size_t Size,
- uint64_t Offset) {
+void raw_svector_ostream::pwrite_impl(const char *Ptr, size_t Size,
+ uint64_t Offset) {
flush();
-
- uint64_t End = Offset + Size;
- if (End > OS.size())
- OS.resize(End);
-
memcpy(OS.begin() + Offset, Ptr, Size);
}
@@ -847,4 +843,5 @@ uint64_t raw_null_ostream::current_pos() const {
return 0;
}
-void raw_null_ostream::pwrite(const char *Ptr, size_t Size, uint64_t Offset) {}
+void raw_null_ostream::pwrite_impl(const char *Ptr, size_t Size,
+ uint64_t Offset) {}
OpenPOWER on IntegriCloud