annotate lib/ExecutionEngine/SectionMemoryManager.cpp @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===- SectionMemoryManager.cpp - Memory manager for MCJIT/RtDyld *- C++ -*-==//
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 // This file implements the section-based memory manager used by the MCJIT
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // execution engine and RuntimeDyld
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
14 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #include "llvm/Config/config.h"
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 #include "llvm/Support/MathExtras.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
17 #include "llvm/Support/Process.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 namespace llvm {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 uint8_t *SectionMemoryManager::allocateDataSection(uintptr_t Size,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 unsigned Alignment,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 unsigned SectionID,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 StringRef SectionName,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 bool IsReadOnly) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 if (IsReadOnly)
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
27 return allocateSection(SectionMemoryManager::AllocationPurpose::ROData,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
28 Size, Alignment);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
29 return allocateSection(SectionMemoryManager::AllocationPurpose::RWData, Size,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
30 Alignment);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 uint8_t *SectionMemoryManager::allocateCodeSection(uintptr_t Size,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 unsigned Alignment,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 unsigned SectionID,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 StringRef SectionName) {
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
37 return allocateSection(SectionMemoryManager::AllocationPurpose::Code, Size,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
38 Alignment);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
41 uint8_t *SectionMemoryManager::allocateSection(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
42 SectionMemoryManager::AllocationPurpose Purpose, uintptr_t Size,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
43 unsigned Alignment) {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 if (!Alignment)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 Alignment = 16;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 assert(!(Alignment & (Alignment - 1)) && "Alignment must be a power of two.");
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
49 uintptr_t RequiredSize = Alignment * ((Size + Alignment - 1) / Alignment + 1);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 uintptr_t Addr = 0;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
52 MemoryGroup &MemGroup = [&]() -> MemoryGroup & {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
53 switch (Purpose) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
54 case AllocationPurpose::Code:
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
55 return CodeMem;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
56 case AllocationPurpose::ROData:
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
57 return RODataMem;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
58 case AllocationPurpose::RWData:
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
59 return RWDataMem;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
60 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
61 llvm_unreachable("Unknown SectionMemoryManager::AllocationPurpose");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
62 }();
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
63
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 // Look in the list of free memory regions and use a block there if one
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 // is available.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
66 for (FreeMemBlock &FreeMB : MemGroup.FreeMem) {
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
67 if (FreeMB.Free.allocatedSize() >= RequiredSize) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
68 Addr = (uintptr_t)FreeMB.Free.base();
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
69 uintptr_t EndOfBlock = Addr + FreeMB.Free.allocatedSize();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 // Align the address.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 Addr = (Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
72
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
73 if (FreeMB.PendingPrefixIndex == (unsigned)-1) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
74 // The part of the block we're giving out to the user is now pending
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
75 MemGroup.PendingMem.push_back(sys::MemoryBlock((void *)Addr, Size));
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
76
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
77 // Remember this pending block, such that future allocations can just
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
78 // modify it rather than creating a new one
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
79 FreeMB.PendingPrefixIndex = MemGroup.PendingMem.size() - 1;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
80 } else {
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
81 sys::MemoryBlock &PendingMB =
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
82 MemGroup.PendingMem[FreeMB.PendingPrefixIndex];
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
83 PendingMB = sys::MemoryBlock(PendingMB.base(),
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
84 Addr + Size - (uintptr_t)PendingMB.base());
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
85 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
86
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
87 // Remember how much free space is now left in this block
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
88 FreeMB.Free =
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
89 sys::MemoryBlock((void *)(Addr + Size), EndOfBlock - Addr - Size);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
90 return (uint8_t *)Addr;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 // No pre-allocated free block was large enough. Allocate a new memory region.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 // Note that all sections get allocated as read-write. The permissions will
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 // be updated later based on memory group.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 // FIXME: It would be useful to define a default allocation size (or add
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 // it as a constructor parameter) to minimize the number of allocations.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 // FIXME: Initialize the Near member for each memory group to avoid
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 // interleaving.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 std::error_code ec;
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
104 sys::MemoryBlock MB = MMapper.allocateMappedMemory(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
105 Purpose, RequiredSize, &MemGroup.Near,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
106 sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 if (ec) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 // FIXME: Add error propagation to the interface.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 return nullptr;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 // Save this address as the basis for our next request
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 MemGroup.Near = MB;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
115 // Remember that we allocated this memory
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
116 MemGroup.AllocatedMem.push_back(MB);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 Addr = (uintptr_t)MB.base();
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
118 uintptr_t EndOfBlock = Addr + MB.allocatedSize();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 // Align the address.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 Addr = (Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
123 // The part of the block we're giving out to the user is now pending
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
124 MemGroup.PendingMem.push_back(sys::MemoryBlock((void *)Addr, Size));
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
125
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 // The allocateMappedMemory may allocate much more memory than we need. In
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 // this case, we store the unused memory as a free memory block.
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
128 unsigned FreeSize = EndOfBlock - Addr - Size;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
129 if (FreeSize > 16) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
130 FreeMemBlock FreeMB;
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
131 FreeMB.Free = sys::MemoryBlock((void *)(Addr + Size), FreeSize);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
132 FreeMB.PendingPrefixIndex = (unsigned)-1;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
133 MemGroup.FreeMem.push_back(FreeMB);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
134 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 // Return aligned address
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
137 return (uint8_t *)Addr;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
140 bool SectionMemoryManager::finalizeMemory(std::string *ErrMsg) {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 // FIXME: Should in-progress permissions be reverted if an error occurs?
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 std::error_code ec;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 // Make code memory executable.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 ec = applyMemoryGroupPermissions(CodeMem,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 sys::Memory::MF_READ | sys::Memory::MF_EXEC);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 if (ec) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 if (ErrMsg) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 *ErrMsg = ec.message();
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 return true;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 // Make read-only data memory read-only.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 ec = applyMemoryGroupPermissions(RODataMem,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 sys::Memory::MF_READ | sys::Memory::MF_EXEC);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 if (ec) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 if (ErrMsg) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 *ErrMsg = ec.message();
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 return true;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 // Read-write data memory already has the correct permissions
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 // Some platforms with separate data cache and instruction cache require
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 // explicit cache flush, otherwise JIT code manipulations (like resolved
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 // relocations) will get to the data cache but not to the instruction cache.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 invalidateInstructionCache();
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 return false;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
174 static sys::MemoryBlock trimBlockToPageSize(sys::MemoryBlock M) {
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
175 static const size_t PageSize = sys::Process::getPageSizeEstimate();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
176
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
177 size_t StartOverlap =
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
178 (PageSize - ((uintptr_t)M.base() % PageSize)) % PageSize;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
179
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
180 size_t TrimmedSize = M.allocatedSize();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
181 TrimmedSize -= StartOverlap;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
182 TrimmedSize -= TrimmedSize % PageSize;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
183
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
184 sys::MemoryBlock Trimmed((void *)((uintptr_t)M.base() + StartOverlap),
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
185 TrimmedSize);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
186
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
187 assert(((uintptr_t)Trimmed.base() % PageSize) == 0);
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
188 assert((Trimmed.allocatedSize() % PageSize) == 0);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
189 assert(M.base() <= Trimmed.base() &&
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
190 Trimmed.allocatedSize() <= M.allocatedSize());
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
191
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
192 return Trimmed;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
193 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
194
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 std::error_code
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 SectionMemoryManager::applyMemoryGroupPermissions(MemoryGroup &MemGroup,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 unsigned Permissions) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
198 for (sys::MemoryBlock &MB : MemGroup.PendingMem)
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
199 if (std::error_code EC = MMapper.protectMappedMemory(MB, Permissions))
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
200 return EC;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
202 MemGroup.PendingMem.clear();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
203
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
204 // Now go through free blocks and trim any of them that don't span the entire
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
205 // page because one of the pending blocks may have overlapped it.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
206 for (FreeMemBlock &FreeMB : MemGroup.FreeMem) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
207 FreeMB.Free = trimBlockToPageSize(FreeMB.Free);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
208 // We cleared the PendingMem list, so all these pointers are now invalid
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
209 FreeMB.PendingPrefixIndex = (unsigned)-1;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
210 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
211
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
212 // Remove all blocks which are now empty
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
213 MemGroup.FreeMem.erase(remove_if(MemGroup.FreeMem,
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
214 [](FreeMemBlock &FreeMB) {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
215 return FreeMB.Free.allocatedSize() == 0;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
216 }),
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
217 MemGroup.FreeMem.end());
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
218
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 return std::error_code();
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 void SectionMemoryManager::invalidateInstructionCache() {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
223 for (sys::MemoryBlock &Block : CodeMem.PendingMem)
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
224 sys::Memory::InvalidateInstructionCache(Block.base(),
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
225 Block.allocatedSize());
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 SectionMemoryManager::~SectionMemoryManager() {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
229 for (MemoryGroup *Group : {&CodeMem, &RWDataMem, &RODataMem}) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
230 for (sys::MemoryBlock &Block : Group->AllocatedMem)
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
231 MMapper.releaseMappedMemory(Block);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
232 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
235 SectionMemoryManager::MemoryMapper::~MemoryMapper() {}
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
236
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
237 void SectionMemoryManager::anchor() {}
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
238
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
239 namespace {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
240 // Trivial implementation of SectionMemoryManager::MemoryMapper that just calls
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
241 // into sys::Memory.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
242 class DefaultMMapper final : public SectionMemoryManager::MemoryMapper {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
243 public:
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
244 sys::MemoryBlock
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
245 allocateMappedMemory(SectionMemoryManager::AllocationPurpose Purpose,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
246 size_t NumBytes, const sys::MemoryBlock *const NearBlock,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
247 unsigned Flags, std::error_code &EC) override {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
248 return sys::Memory::allocateMappedMemory(NumBytes, NearBlock, Flags, EC);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
249 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
250
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
251 std::error_code protectMappedMemory(const sys::MemoryBlock &Block,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
252 unsigned Flags) override {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
253 return sys::Memory::protectMappedMemory(Block, Flags);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
254 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
255
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
256 std::error_code releaseMappedMemory(sys::MemoryBlock &M) override {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
257 return sys::Memory::releaseMappedMemory(M);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
258 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
259 };
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
260
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
261 DefaultMMapper DefaultMMapperInstance;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
262 } // namespace
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
263
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
264 SectionMemoryManager::SectionMemoryManager(MemoryMapper *MM)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
265 : MMapper(MM ? *MM : DefaultMMapperInstance) {}
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
266
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 } // namespace llvm