annotate libsanitizer/sanitizer_common/sanitizer_procmaps.h @ 118:fd00160c1b76

ifdef TARGET_64BIT
author mir3636
date Tue, 27 Feb 2018 15:01:35 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 //===-- sanitizer_procmaps.h ------------------------------------*- C++ -*-===//
kono
parents:
diff changeset
2 //
kono
parents:
diff changeset
3 // This file is distributed under the University of Illinois Open Source
kono
parents:
diff changeset
4 // License. See LICENSE.TXT for details.
kono
parents:
diff changeset
5 //
kono
parents:
diff changeset
6 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
7 //
kono
parents:
diff changeset
8 // This file is shared between AddressSanitizer and ThreadSanitizer.
kono
parents:
diff changeset
9 //
kono
parents:
diff changeset
10 // Information about the process mappings.
kono
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
12 #ifndef SANITIZER_PROCMAPS_H
kono
parents:
diff changeset
13 #define SANITIZER_PROCMAPS_H
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 #include "sanitizer_platform.h"
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 #if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || SANITIZER_MAC
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 #include "sanitizer_common.h"
kono
parents:
diff changeset
20 #include "sanitizer_internal_defs.h"
kono
parents:
diff changeset
21 #include "sanitizer_linux.h"
kono
parents:
diff changeset
22 #include "sanitizer_mac.h"
kono
parents:
diff changeset
23 #include "sanitizer_mutex.h"
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 namespace __sanitizer {
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 // Memory protection masks.
kono
parents:
diff changeset
29 static const uptr kProtectionRead = 1;
kono
parents:
diff changeset
30 static const uptr kProtectionWrite = 2;
kono
parents:
diff changeset
31 static const uptr kProtectionExecute = 4;
kono
parents:
diff changeset
32 static const uptr kProtectionShared = 8;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 struct MemoryMappedSegmentData;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 class MemoryMappedSegment {
kono
parents:
diff changeset
37 public:
kono
parents:
diff changeset
38 MemoryMappedSegment(char *buff = nullptr, uptr size = 0)
kono
parents:
diff changeset
39 : filename(buff), filename_size(size), data_(nullptr) {}
kono
parents:
diff changeset
40 ~MemoryMappedSegment() {}
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 bool IsReadable() const { return protection & kProtectionRead; }
kono
parents:
diff changeset
43 bool IsWritable() const { return protection & kProtectionWrite; }
kono
parents:
diff changeset
44 bool IsExecutable() const { return protection & kProtectionExecute; }
kono
parents:
diff changeset
45 bool IsShared() const { return protection & kProtectionShared; }
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 void AddAddressRanges(LoadedModule *module);
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 uptr start;
kono
parents:
diff changeset
50 uptr end;
kono
parents:
diff changeset
51 uptr offset;
kono
parents:
diff changeset
52 char *filename; // owned by caller
kono
parents:
diff changeset
53 uptr filename_size;
kono
parents:
diff changeset
54 uptr protection;
kono
parents:
diff changeset
55 ModuleArch arch;
kono
parents:
diff changeset
56 u8 uuid[kModuleUUIDSize];
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 private:
kono
parents:
diff changeset
59 friend class MemoryMappingLayout;
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 // This field is assigned and owned by MemoryMappingLayout if needed
kono
parents:
diff changeset
62 MemoryMappedSegmentData *data_;
kono
parents:
diff changeset
63 };
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 class MemoryMappingLayout {
kono
parents:
diff changeset
66 public:
kono
parents:
diff changeset
67 explicit MemoryMappingLayout(bool cache_enabled);
kono
parents:
diff changeset
68 ~MemoryMappingLayout();
kono
parents:
diff changeset
69 bool Next(MemoryMappedSegment *segment);
kono
parents:
diff changeset
70 void Reset();
kono
parents:
diff changeset
71 // In some cases, e.g. when running under a sandbox on Linux, ASan is unable
kono
parents:
diff changeset
72 // to obtain the memory mappings. It should fall back to pre-cached data
kono
parents:
diff changeset
73 // instead of aborting.
kono
parents:
diff changeset
74 static void CacheMemoryMappings();
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 // Adds all mapped objects into a vector.
kono
parents:
diff changeset
77 void DumpListOfModules(InternalMmapVectorNoCtor<LoadedModule> *modules);
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 private:
kono
parents:
diff changeset
80 void LoadFromCache();
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 MemoryMappingLayoutData data_;
kono
parents:
diff changeset
83 };
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 // Returns code range for the specified module.
kono
parents:
diff changeset
86 bool GetCodeRangeForFile(const char *module, uptr *start, uptr *end);
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 bool IsDecimal(char c);
kono
parents:
diff changeset
89 uptr ParseDecimal(const char **p);
kono
parents:
diff changeset
90 bool IsHex(char c);
kono
parents:
diff changeset
91 uptr ParseHex(const char **p);
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 } // namespace __sanitizer
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 #endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD ||
kono
parents:
diff changeset
96 // SANITIZER_MAC
kono
parents:
diff changeset
97 #endif // SANITIZER_PROCMAPS_H