1 | //===-- SubprocessMemory.h --------------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | /// |
9 | /// \file |
10 | /// Defines a class that automatically handles auxiliary memory and the |
11 | /// underlying shared memory backings for memory definitions |
12 | /// |
13 | //===----------------------------------------------------------------------===// |
14 | |
15 | #ifndef LLVM_TOOLS_LLVM_EXEGESIS_SUBPROCESSMEMORY_H |
16 | #define LLVM_TOOLS_LLVM_EXEGESIS_SUBPROCESSMEMORY_H |
17 | |
18 | #include "BenchmarkResult.h" |
19 | #include <string> |
20 | #include <unordered_map> |
21 | #include <vector> |
22 | |
23 | #ifdef _MSC_VER |
24 | typedef int pid_t; |
25 | #else |
26 | #include <sys/types.h> |
27 | #endif // _MSC_VER |
28 | |
29 | |
30 | namespace llvm { |
31 | namespace exegesis { |
32 | |
33 | class SubprocessMemory { |
34 | public: |
35 | static constexpr const size_t AuxiliaryMemoryOffset = 1; |
36 | static constexpr const size_t AuxiliaryMemorySize = 4096; |
37 | |
38 | // Gets the thread ID for the calling thread. |
39 | static long getCurrentTID(); |
40 | |
41 | Error initializeSubprocessMemory(pid_t ProcessID); |
42 | |
43 | // The following function sets up memory definitions. It creates shared |
44 | // memory objects for the definitions and fills them with the specified |
45 | // values. Arguments: MemoryDefinitions - A map from memory value names to |
46 | // MemoryValues, ProcessID - The ID of the current process. |
47 | Error addMemoryDefinition( |
48 | std::unordered_map<std::string, MemoryValue> MemoryDefinitions, |
49 | pid_t ProcessID); |
50 | |
51 | // The following function sets up the auxiliary memory by opening shared |
52 | // memory objects backing memory definitions and putting file descriptors |
53 | // into appropriate places. Arguments: MemoryDefinitions - A map from memory |
54 | // values names to Memoryvalues, ParentPID - The ID of the process that |
55 | // setup the memory definitions, CounterFileDescriptor - The file descriptor |
56 | // for the performance counter that will be placed in the auxiliary memory |
57 | // section. |
58 | static Expected<int> setupAuxiliaryMemoryInSubprocess( |
59 | std::unordered_map<std::string, MemoryValue> MemoryDefinitions, |
60 | pid_t ParentPID, long ParentTID, int CounterFileDescriptor); |
61 | |
62 | ~SubprocessMemory(); |
63 | |
64 | private: |
65 | std::vector<std::string> SharedMemoryNames; |
66 | }; |
67 | |
68 | } // namespace exegesis |
69 | } // namespace llvm |
70 | |
71 | #endif |
72 | |