<rdar://problem/5917641> use getMemBufferCopy if supplied buffer is not already zero...
authorNick Kledzik <kledzik@apple.com>
Fri, 9 May 2008 01:09:59 +0000 (01:09 +0000)
committerNick Kledzik <kledzik@apple.com>
Fri, 9 May 2008 01:09:59 +0000 (01:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50880 91177308-0d34-0410-b5e6-96231b3b80d8

tools/lto2/LTOModule.cpp
tools/lto2/LTOModule.h

index 87126e71dc2114a8b9e14812f6392a6327aad89b..943bef75c8725b289b215f0fc84183e2fd0fe014 100644 (file)
@@ -23,6 +23,7 @@
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/MathExtras.h"
 #include "llvm/System/Path.h"
+#include "llvm/System/Process.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetMachineRegistry.h"
 #include "llvm/Target/TargetAsmInfo.h"
@@ -46,8 +47,7 @@ bool LTOModule::isBitcodeFile(const char* path)
 bool LTOModule::isBitcodeFileForTarget(const void* mem, size_t length,
                                        const char* triplePrefix) 
 {
-    MemoryBuffer* buffer = MemoryBuffer::getMemBuffer((char*)mem, 
-                                                      (char*)mem+length);
+    MemoryBuffer* buffer = makeBuffer(mem, length);
     if ( buffer == NULL )
         return false;
     return isTargetMatch(buffer, triplePrefix);
@@ -91,11 +91,26 @@ LTOModule* LTOModule::makeLTOModule(const char* path, std::string& errMsg)
     return makeLTOModule(buffer.get(), errMsg);
 }
 
+
+MemoryBuffer* LTOModule::makeBuffer(const void* mem, size_t length)
+{
+       // MemoryBuffer requires the byte past end of the buffer to be a zero.
+       // We might get lucky and already be that way, otherwise make a copy.
+       // Also if next byte is on a different page, don't assume it is readable.
+       const char* startPtr = (char*)mem;
+       const char* endPtr = startPtr+length;
+       if ( (((uintptr_t)endPtr & (sys::Process::GetPageSize()-1)) == 0) 
+           || (*endPtr != 0) ) 
+               return MemoryBuffer::getMemBufferCopy(startPtr, endPtr);
+       else
+               return MemoryBuffer::getMemBuffer(startPtr, endPtr);
+}
+
+
 LTOModule* LTOModule::makeLTOModule(const void* mem, size_t length, 
                                                         std::string& errMsg)
 {
-    OwningPtr<MemoryBuffer> buffer(MemoryBuffer::getMemBuffer((char*)mem, 
-                                                            (char*)mem+length));
+    OwningPtr<MemoryBuffer> buffer(makeBuffer(mem, length));
     if ( !buffer )
         return NULL;
     return makeLTOModule(buffer.get(), errMsg);
index 7735e2f2a5775f2e70b70447e5d1c89be2ca25e2..fa15850c629298bcea1e8cd8d2a4c9efe0ec6961 100644 (file)
@@ -81,6 +81,7 @@ private:
     
     static LTOModule*       makeLTOModule(llvm::MemoryBuffer* buffer, 
                                                         std::string& errMsg);
+       static llvm::MemoryBuffer* makeBuffer(const void* mem, size_t length);
                                                         
     typedef llvm::StringMap<uint8_t> StringSet;