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