Work around downrev gccs which do not inherit visibility of the
[oota-llvm.git] / lib / Support / MemoryBuffer.cpp
index 43eb1813ad6c06575f7dd76590d627e3f665792c..f8779e122d5012de64621c8e1c1136d7c5f116a9 100644 (file)
@@ -59,9 +59,13 @@ namespace {
 class MemoryBufferMem : public MemoryBuffer {
   std::string FileID;
 public:
-  MemoryBufferMem(const char *Start, const char *End, const char *FID)
+  MemoryBufferMem(const char *Start, const char *End, const char *FID,
+                  bool Copy = false)
   : FileID(FID) {
-    init(Start, End);
+    if (!Copy)
+      init(Start, End);
+    else
+      initCopyOf(Start, End);
   }
   
   virtual const char *getBufferIdentifier() const {
@@ -78,6 +82,15 @@ MemoryBuffer *MemoryBuffer::getMemBuffer(const char *StartPtr,
   return new MemoryBufferMem(StartPtr, EndPtr, BufferName);
 }
 
+/// getMemBufferCopy - Open the specified memory range as a MemoryBuffer,
+/// copying the contents and taking ownership of it.  This has no requirements
+/// on EndPtr[0].
+MemoryBuffer *MemoryBuffer::getMemBufferCopy(const char *StartPtr, 
+                                             const char *EndPtr,
+                                             const char *BufferName) {
+  return new MemoryBufferMem(StartPtr, EndPtr, BufferName, true);
+}
+
 /// getNewUninitMemBuffer - Allocate a new MemoryBuffer of the specified size
 /// that is completely initialized to zeros.  Note that the caller should
 /// initialize the memory allocated by this method.  The memory is owned by
@@ -248,11 +261,13 @@ MemoryBuffer *MemoryBuffer::getSTDIN() {
   
   // Read in all of the data from stdin, we cannot mmap stdin.
   sys::Program::ChangeStdinToBinary();
-  while (size_t ReadBytes = fread(Buffer, 1, 4096*4, stdin))
+  while (size_t ReadBytes = fread(Buffer, sizeof(char), 4096*4, stdin))
     FileData.insert(FileData.end(), Buffer, Buffer+ReadBytes);
-  
+
   FileData.push_back(0); // &FileData[Size] is invalid. So is &*FileData.end().
   size_t Size = FileData.size();
+  if (Size <= 1)
+    return 0;
   MemoryBuffer *B = new STDINBufferFile();
   B->initCopyOf(&FileData[0], &FileData[Size-1]);
   return B;