Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: tools/pnacl-llc/ThreadedStreamingCache.h

Issue 940243003: PNaCl localmod mods in LLVM to 223109 (local files only) (Closed)
Patch Set: xx Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //==- ThreadedStreamingCache.h - Cache for StreamingMemoryObject -*- C++ -*-==// 1 //==- ThreadedStreamingCache.h - Cache for StreamingMemoryObject -*- C++ -*-==//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 9
10 #ifndef THREADEDSTREAMINGCACHE_H 10 #ifndef THREADEDSTREAMINGCACHE_H
11 #define THREADEDSTREAMINGCACHE_H 11 #define THREADEDSTREAMINGCACHE_H
12 12
13 #include "llvm/Support/ErrorHandling.h" 13 #include "llvm/Support/ErrorHandling.h"
14 #include "llvm/Support/Mutex.h" 14 #include "llvm/Support/Mutex.h"
15 #include "llvm/Support/StreamableMemoryObject.h" 15 #include "llvm/Support/StreamingMemoryObject.h"
16 16
17 namespace llvm { 17 namespace llvm {
18 18
19 // An implementation of StreamingMemoryObject for use in multithreaded 19 // An implementation of StreamingMemoryObject for use in multithreaded
20 // translation. Each thread has one of these objects, each of which has a 20 // translation. Each thread has one of these objects, each of which has a
21 // pointer to a shared StreamingMemoryObject. This object is effectively 21 // pointer to a shared StreamingMemoryObject. This object is effectively
22 // a thread-local cache for the bitcode streamer to avoid contention, since 22 // a thread-local cache for the bitcode streamer to avoid contention, since
23 // bits are only read from the bitcode stream one word at a time. 23 // bits are only read from the bitcode stream one word at a time.
24 24
25 class ThreadedStreamingCache : public llvm::StreamingMemoryObject { 25 class ThreadedStreamingCache : public llvm::StreamingMemoryObject {
26 public: 26 public:
27 explicit ThreadedStreamingCache(llvm::StreamingMemoryObject *S); 27 explicit ThreadedStreamingCache(llvm::StreamingMemoryObject *S);
28 uint64_t getBase() const override { return 0; }
29 uint64_t getExtent() const override; 28 uint64_t getExtent() const override;
30 int readByte(uint64_t address, uint8_t* ptr) const override; 29 uint64_t readBytes(uint8_t *Buf, uint64_t Size,
31 int readBytes(uint64_t address, uint64_t size, 30 uint64_t Address) const override;
32 uint8_t *buf) const override; 31 const uint8_t *getPointer(uint64_t Address,
33 const uint8_t *getPointer(uint64_t address, 32 uint64_t Size) const override {
34 uint64_t size) const override {
35 // This could be fixed by ensuring the bytes are fetched and making a copy, 33 // This could be fixed by ensuring the bytes are fetched and making a copy,
36 // requiring that the bitcode size be known, or otherwise ensuring that 34 // requiring that the bitcode size be known, or otherwise ensuring that
37 // the memory doesn't go away/get reallocated, but it's 35 // the memory doesn't go away/get reallocated, but it's
38 // not currently necessary. Users that need the pointer don't stream. 36 // not currently necessary. Users that need the pointer don't stream.
39 llvm_unreachable("getPointer in streaming memory objects not allowed"); 37 llvm_unreachable("getPointer in streaming memory objects not allowed");
40 return NULL; 38 return NULL;
41 } 39 }
42 bool isValidAddress(uint64_t address) const override; 40 bool isValidAddress(uint64_t Address) const override;
43 bool isObjectEnd(uint64_t address) const override;
44 41
45 /// Drop s bytes from the front of the stream, pushing the positions of the 42 /// Drop s bytes from the front of the stream, pushing the positions of the
46 /// remaining bytes down by s. This is used to skip past the bitcode header, 43 /// remaining bytes down by s. This is used to skip past the bitcode header,
47 /// since we don't know a priori if it's present, and we can't put bytes 44 /// since we don't know a priori if it's present, and we can't put bytes
48 /// back into the stream once we've read them. 45 /// back into the stream once we've read them.
49 bool dropLeadingBytes(size_t s) override; 46 bool dropLeadingBytes(size_t S) override;
50 47
51 /// If the data object size is known in advance, many of the operations can 48 /// If the data object size is known in advance, many of the operations can
52 /// be made more efficient, so this method should be called before reading 49 /// be made more efficient, so this method should be called before reading
53 /// starts (although it can be called anytime). 50 /// starts (although it can be called anytime).
54 void setKnownObjectSize(size_t size) override; 51 void setKnownObjectSize(size_t Size) override;
55 private: 52 private:
56 const static uint64_t kCacheSize = 4 * 4096; 53 const static uint64_t kCacheSize = 4 * 4096;
57 const static uint64_t kCacheSizeMask = ~(kCacheSize - 1); 54 const static uint64_t kCacheSizeMask = ~(kCacheSize - 1);
58 static llvm::sys::SmartMutex<false> StreamerLock; 55 static llvm::sys::SmartMutex<false> StreamerLock;
59 56
60 int fetchCacheLine(uint64_t address) const; 57 // Fetch up to kCacheSize worth of data starting from Address, into the
58 // CacheBase, and set MinObjectSize to the new known edge.
59 // If at EOF, MinObjectSize reflects the final size.
60 void fetchCacheLine(uint64_t Address) const;
61 61
62 llvm::StreamingMemoryObject *Streamer; 62 llvm::StreamingMemoryObject *Streamer;
63 // Cached data for addresses [CacheBase, CacheBase + kCacheSize) 63 // Cached data for addresses [CacheBase, CacheBase + kCacheSize)
64 mutable std::vector<unsigned char> Cache; 64 mutable std::vector<unsigned char> Cache;
65 // The MemoryObject is at least this size. Used as a cache for isObjectEnd and 65 // The MemoryObject is at least this size. Used as a cache for isValidAddress.
66 // isValidAddress
67 mutable uint64_t MinObjectSize; 66 mutable uint64_t MinObjectSize;
68 // Current base address for the cache. 67 // Current base address for the cache.
69 mutable uint64_t CacheBase; 68 mutable uint64_t CacheBase;
70 69
71 ThreadedStreamingCache( 70 ThreadedStreamingCache(
72 const ThreadedStreamingCache&) LLVM_DELETED_FUNCTION; 71 const ThreadedStreamingCache&) LLVM_DELETED_FUNCTION;
73 void operator=(const ThreadedStreamingCache&) LLVM_DELETED_FUNCTION; 72 void operator=(const ThreadedStreamingCache&) LLVM_DELETED_FUNCTION;
74 }; 73 };
75 74
76 } // namespace llvm 75 } // namespace llvm
77 76
78 #endif // THREADEDSTREAMINGCACHE_H 77 #endif // THREADEDSTREAMINGCACHE_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698