Skip to content

Commit c0702ac

Browse files
emrekultursaykongy
authored andcommitted
[PATCH] [lldb-server] Skip shared regions for memory allocation
Differential Revision: https://reviews.llvm.org/D128832
1 parent 6bd53df commit c0702ac

File tree

6 files changed

+99
-48
lines changed

6 files changed

+99
-48
lines changed

lldb/include/lldb/Target/MemoryRegionInfo.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ class MemoryRegionInfo {
2626

2727
MemoryRegionInfo() = default;
2828
MemoryRegionInfo(RangeType range, OptionalBool read, OptionalBool write,
29-
OptionalBool execute, OptionalBool mapped, ConstString name,
29+
OptionalBool execute, OptionalBool shared,
30+
OptionalBool mapped, ConstString name,
3031
OptionalBool flash, lldb::offset_t blocksize,
3132
OptionalBool memory_tagged, OptionalBool stack_memory)
3233
: m_range(range), m_read(read), m_write(write), m_execute(execute),
33-
m_mapped(mapped), m_name(name), m_flash(flash), m_blocksize(blocksize),
34-
m_memory_tagged(memory_tagged), m_is_stack_memory(stack_memory) {}
34+
m_shared(shared), m_mapped(mapped), m_name(name), m_flash(flash),
35+
m_blocksize(blocksize), m_memory_tagged(memory_tagged),
36+
m_is_stack_memory(stack_memory) {}
3537

3638
RangeType &GetRange() { return m_range; }
3739

@@ -45,6 +47,8 @@ class MemoryRegionInfo {
4547

4648
OptionalBool GetExecutable() const { return m_execute; }
4749

50+
OptionalBool GetShared() const { return m_shared; }
51+
4852
OptionalBool GetMapped() const { return m_mapped; }
4953

5054
ConstString GetName() const { return m_name; }
@@ -57,6 +61,8 @@ class MemoryRegionInfo {
5761

5862
void SetExecutable(OptionalBool val) { m_execute = val; }
5963

64+
void SetShared(OptionalBool val) { m_shared = val; }
65+
6066
void SetMapped(OptionalBool val) { m_mapped = val; }
6167

6268
void SetName(const char *name) { m_name = ConstString(name); }
@@ -95,6 +101,7 @@ class MemoryRegionInfo {
95101
bool operator==(const MemoryRegionInfo &rhs) const {
96102
return m_range == rhs.m_range && m_read == rhs.m_read &&
97103
m_write == rhs.m_write && m_execute == rhs.m_execute &&
104+
m_shared == rhs.m_shared &&
98105
m_mapped == rhs.m_mapped && m_name == rhs.m_name &&
99106
m_flash == rhs.m_flash && m_blocksize == rhs.m_blocksize &&
100107
m_memory_tagged == rhs.m_memory_tagged &&
@@ -134,6 +141,7 @@ class MemoryRegionInfo {
134141
OptionalBool m_read = eDontKnow;
135142
OptionalBool m_write = eDontKnow;
136143
OptionalBool m_execute = eDontKnow;
144+
OptionalBool m_shared = eDontKnow;
137145
OptionalBool m_mapped = eDontKnow;
138146
ConstString m_name;
139147
OptionalBool m_flash = eDontKnow;

lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1227,7 +1227,8 @@ llvm::Expected<uint64_t>
12271227
NativeProcessLinux::Syscall(llvm::ArrayRef<uint64_t> args) {
12281228
PopulateMemoryRegionCache();
12291229
auto region_it = llvm::find_if(m_mem_region_cache, [](const auto &pair) {
1230-
return pair.first.GetExecutable() == MemoryRegionInfo::eYes;
1230+
return pair.first.GetExecutable() == MemoryRegionInfo::eYes &&
1231+
pair.first.GetShared() != MemoryRegionInfo::eYes;
12311232
});
12321233
if (region_it == m_mem_region_cache.end())
12331234
return llvm::createStringError(llvm::inconvertibleErrorCode(),

lldb/source/Plugins/Process/Utility/LinuxProcMaps.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,15 @@ ParseMemoryRegionInfoFromProcMapsLine(llvm::StringRef maps_line,
9494
return ProcMapError("unexpected /proc/{pid}/%s exec permission char",
9595
maps_kind);
9696

97-
line_extractor.GetChar(); // Read the private bit
97+
// Handle sharing status (private/shared).
98+
const char sharing_char = line_extractor.GetChar();
99+
if (sharing_char == 's')
100+
region.SetShared(MemoryRegionInfo::OptionalBool::eYes);
101+
else if (sharing_char == 'p')
102+
region.SetShared(MemoryRegionInfo::OptionalBool::eNo);
103+
else
104+
region.SetShared(MemoryRegionInfo::OptionalBool::eDontKnow);
105+
98106
line_extractor.SkipSpaces(); // Skip the separator
99107
line_extractor.GetHexMaxU64(false, 0); // Read the offset
100108
line_extractor.GetHexMaxU64(false, 0); // Read the major device number

lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ INSTANTIATE_TEST_SUITE_P(
8787
"0-0 rwzp 00000000 00:00 0\n"
8888
"2-3 r-xp 00000000 00:00 0 [def]\n",
8989
MemoryRegionInfos{
90-
MemoryRegionInfo(make_range(0, 1), MemoryRegionInfo::eYes,
91-
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
90+
MemoryRegionInfo(make_range(0, 1), MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
91+
MemoryRegionInfo::eNo,
9292
MemoryRegionInfo::eYes, ConstString("[abc]"),
9393
MemoryRegionInfo::eDontKnow, 0,
9494
MemoryRegionInfo::eDontKnow,
@@ -101,28 +101,39 @@ INSTANTIATE_TEST_SUITE_P(
101101
MemoryRegionInfos{
102102
MemoryRegionInfo(
103103
make_range(0x55a4512f7000, 0x55a451b68000),
104-
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes,
105-
MemoryRegionInfo::eNo, MemoryRegionInfo::eYes,
104+
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
105+
MemoryRegionInfo::eNo,
106+
MemoryRegionInfo::eYes,
106107
ConstString("[heap]"), MemoryRegionInfo::eDontKnow, 0,
107108
MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow),
108109
},
109110
""),
110111
// Multiple entries
111112
std::make_tuple(
112113
"7fc090021000-7fc094000000 ---p 00000000 00:00 0\n"
114+
"7fc094000000-7fc094a00000 ---s 00000000 00:00 0\n"
113115
"ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 "
114116
"[vsyscall]",
115117
MemoryRegionInfos{
116118
MemoryRegionInfo(
117119
make_range(0x7fc090021000, 0x7fc094000000),
118-
MemoryRegionInfo::eNo, MemoryRegionInfo::eNo,
119-
MemoryRegionInfo::eNo, MemoryRegionInfo::eYes,
120+
MemoryRegionInfo::eNo, MemoryRegionInfo::eNo, MemoryRegionInfo::eNo,
121+
MemoryRegionInfo::eNo,
122+
MemoryRegionInfo::eYes,
123+
ConstString(nullptr), MemoryRegionInfo::eDontKnow, 0,
124+
MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow),
125+
MemoryRegionInfo(
126+
make_range(0x7fc094000000, 0x7fc094a00000),
127+
MemoryRegionInfo::eNo, MemoryRegionInfo::eNo, MemoryRegionInfo::eNo,
128+
MemoryRegionInfo::eYes,
129+
MemoryRegionInfo::eYes,
120130
ConstString(nullptr), MemoryRegionInfo::eDontKnow, 0,
121131
MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow),
122132
MemoryRegionInfo(
123133
make_range(0xffffffffff600000, 0xffffffffff601000),
124-
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
125-
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes,
134+
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, MemoryRegionInfo::eYes,
135+
MemoryRegionInfo::eNo,
136+
MemoryRegionInfo::eYes,
126137
ConstString("[vsyscall]"), MemoryRegionInfo::eDontKnow, 0,
127138
MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow),
128139
},
@@ -146,8 +157,9 @@ INSTANTIATE_TEST_SUITE_P(
146157
"0/0 rw-p 00000000 00:00 0",
147158
MemoryRegionInfos{
148159
MemoryRegionInfo(
149-
make_range(0x1111, 0x2222), MemoryRegionInfo::eYes,
150-
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
160+
make_range(0x1111, 0x2222),
161+
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
162+
MemoryRegionInfo::eNo,
151163
MemoryRegionInfo::eYes, ConstString("[foo]"),
152164
MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow,
153165
MemoryRegionInfo::eDontKnow),
@@ -166,8 +178,22 @@ INSTANTIATE_TEST_SUITE_P(
166178
"1111-2222 rw-p 00000000 00:00 0 [foo]",
167179
MemoryRegionInfos{
168180
MemoryRegionInfo(
169-
make_range(0x1111, 0x2222), MemoryRegionInfo::eYes,
170-
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
181+
make_range(0x1111, 0x2222),
182+
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
183+
MemoryRegionInfo::eNo,
184+
MemoryRegionInfo::eYes, ConstString("[foo]"),
185+
MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow,
186+
MemoryRegionInfo::eDontKnow),
187+
},
188+
""),
189+
// Single shared region parses, has no flags
190+
std::make_tuple(
191+
"1111-2222 rw-s 00000000 00:00 0 [foo]",
192+
MemoryRegionInfos{
193+
MemoryRegionInfo(
194+
make_range(0x1111, 0x2222),
195+
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
196+
MemoryRegionInfo::eYes,
171197
MemoryRegionInfo::eYes, ConstString("[foo]"),
172198
MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow,
173199
MemoryRegionInfo::eDontKnow),
@@ -181,8 +207,9 @@ INSTANTIATE_TEST_SUITE_P(
181207
"VmFlags: mt",
182208
MemoryRegionInfos{
183209
MemoryRegionInfo(
184-
make_range(0x1111, 0x2222), MemoryRegionInfo::eYes,
185-
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
210+
make_range(0x1111, 0x2222),
211+
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
212+
MemoryRegionInfo::eNo,
186213
MemoryRegionInfo::eYes, ConstString("[foo]"),
187214
MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eYes,
188215
MemoryRegionInfo::eDontKnow),
@@ -193,8 +220,9 @@ INSTANTIATE_TEST_SUITE_P(
193220
"0-0 rw-p 00000000 00:00 0\n"
194221
"VmFlags: mt ",
195222
MemoryRegionInfos{
196-
MemoryRegionInfo(make_range(0, 0), MemoryRegionInfo::eYes,
197-
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
223+
MemoryRegionInfo(make_range(0, 0),
224+
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
225+
MemoryRegionInfo::eNo,
198226
MemoryRegionInfo::eYes, ConstString(nullptr),
199227
MemoryRegionInfo::eDontKnow, 0,
200228
MemoryRegionInfo::eYes,
@@ -206,8 +234,9 @@ INSTANTIATE_TEST_SUITE_P(
206234
"0-0 rw-p 00000000 00:00 0\n"
207235
"VmFlags: ",
208236
MemoryRegionInfos{
209-
MemoryRegionInfo(make_range(0, 0), MemoryRegionInfo::eYes,
210-
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
237+
MemoryRegionInfo(make_range(0, 0),
238+
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
239+
MemoryRegionInfo::eNo,
211240
MemoryRegionInfo::eYes, ConstString(nullptr),
212241
MemoryRegionInfo::eDontKnow, 0,
213242
MemoryRegionInfo::eNo,
@@ -223,14 +252,15 @@ INSTANTIATE_TEST_SUITE_P(
223252
"VmFlags: mt",
224253
MemoryRegionInfos{
225254
MemoryRegionInfo(
226-
make_range(0x1111, 0x2222), MemoryRegionInfo::eYes,
227-
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
255+
make_range(0x1111, 0x2222),
256+
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
257+
MemoryRegionInfo::eNo,
228258
MemoryRegionInfo::eYes, ConstString("[foo]"),
229259
MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow,
230260
MemoryRegionInfo::eDontKnow),
231261
MemoryRegionInfo(
232-
make_range(0x3333, 0x4444), MemoryRegionInfo::eYes,
233-
MemoryRegionInfo::eNo, MemoryRegionInfo::eYes,
262+
make_range(0x3333, 0x4444), MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, MemoryRegionInfo::eYes,
263+
MemoryRegionInfo::eNo,
234264
MemoryRegionInfo::eYes, ConstString("[bar]"),
235265
MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eYes,
236266
MemoryRegionInfo::eDontKnow),
@@ -246,14 +276,16 @@ INSTANTIATE_TEST_SUITE_P(
246276
"MMUPageSize: 4 kB\n",
247277
MemoryRegionInfos{
248278
MemoryRegionInfo(
249-
make_range(0x1111, 0x2222), MemoryRegionInfo::eYes,
250-
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
279+
make_range(0x1111, 0x2222),
280+
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eNo,
281+
MemoryRegionInfo::eNo,
251282
MemoryRegionInfo::eYes, ConstString(nullptr),
252283
MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow,
253284
MemoryRegionInfo::eDontKnow),
254285
MemoryRegionInfo(
255-
make_range(0x3333, 0x4444), MemoryRegionInfo::eYes,
256-
MemoryRegionInfo::eNo, MemoryRegionInfo::eYes,
286+
make_range(0x3333, 0x4444),
287+
MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, MemoryRegionInfo::eYes,
288+
MemoryRegionInfo::eNo,
257289
MemoryRegionInfo::eYes, ConstString(nullptr),
258290
MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow,
259291
MemoryRegionInfo::eDontKnow),

lldb/unittests/Process/Utility/MemoryTagManagerAArch64MTETest.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,10 @@ TEST(MemoryTagManagerAArch64MTETest, ExpandToGranule) {
134134
static MemoryRegionInfo MakeRegionInfo(lldb::addr_t base, lldb::addr_t size,
135135
bool tagged) {
136136
return MemoryRegionInfo(
137-
MemoryRegionInfo::RangeType(base, size), MemoryRegionInfo::eYes,
137+
MemoryRegionInfo::RangeType(base, size),
138138
MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, MemoryRegionInfo::eYes,
139+
MemoryRegionInfo::eNo,
140+
MemoryRegionInfo::eYes,
139141
ConstString(), MemoryRegionInfo::eNo, 0,
140142
/*memory_tagged=*/
141143
tagged ? MemoryRegionInfo::eYes : MemoryRegionInfo::eNo,

lldb/unittests/Process/minidump/MinidumpParserTest.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -378,15 +378,15 @@ TEST_F(MinidumpParserTest, GetMemoryRegionInfo) {
378378
parser->BuildMemoryRegions(),
379379
testing::Pair(
380380
testing::ElementsAre(
381-
MemoryRegionInfo({0x0, 0x10000}, no, no, no, no, ConstString(),
381+
MemoryRegionInfo({0x0, 0x10000}, no, no, no, unknown, no, ConstString(),
382382
unknown, 0, unknown, unknown),
383-
MemoryRegionInfo({0x10000, 0x21000}, yes, yes, no, yes,
383+
MemoryRegionInfo({0x10000, 0x21000}, yes, yes, no, unknown, yes,
384384
ConstString(), unknown, 0, unknown, unknown),
385-
MemoryRegionInfo({0x40000, 0x1000}, yes, no, no, yes,
385+
MemoryRegionInfo({0x40000, 0x1000}, yes, no, no, unknown, yes,
386386
ConstString(), unknown, 0, unknown, unknown),
387-
MemoryRegionInfo({0x7ffe0000, 0x1000}, yes, no, no, yes,
387+
MemoryRegionInfo({0x7ffe0000, 0x1000}, yes, no, no, unknown, yes,
388388
ConstString(), unknown, 0, unknown, unknown),
389-
MemoryRegionInfo({0x7ffe1000, 0xf000}, no, no, no, yes,
389+
MemoryRegionInfo({0x7ffe1000, 0xf000}, no, no, no, unknown, yes,
390390
ConstString(), unknown, 0, unknown, unknown)),
391391
true));
392392
}
@@ -412,9 +412,9 @@ TEST_F(MinidumpParserTest, GetMemoryRegionInfoFromMemoryList) {
412412
parser->BuildMemoryRegions(),
413413
testing::Pair(
414414
testing::ElementsAre(
415-
MemoryRegionInfo({0x1000, 0x10}, yes, unknown, unknown, yes,
415+
MemoryRegionInfo({0x1000, 0x10}, yes, unknown, unknown, unknown, yes,
416416
ConstString(), unknown, 0, unknown, unknown),
417-
MemoryRegionInfo({0x2000, 0x20}, yes, unknown, unknown, yes,
417+
MemoryRegionInfo({0x2000, 0x20}, yes, unknown, unknown, unknown, yes,
418418
ConstString(), unknown, 0, unknown, unknown)),
419419
false));
420420
}
@@ -428,9 +428,9 @@ TEST_F(MinidumpParserTest, GetMemoryRegionInfoFromMemory64List) {
428428
parser->BuildMemoryRegions(),
429429
testing::Pair(
430430
testing::ElementsAre(
431-
MemoryRegionInfo({0x1000, 0x10}, yes, unknown, unknown, yes,
431+
MemoryRegionInfo({0x1000, 0x10}, yes, unknown, unknown, unknown, yes,
432432
ConstString(), unknown, 0, unknown, unknown),
433-
MemoryRegionInfo({0x2000, 0x20}, yes, unknown, unknown, yes,
433+
MemoryRegionInfo({0x2000, 0x20}, yes, unknown, unknown, unknown, yes,
434434
ConstString(), unknown, 0, unknown, unknown)),
435435
false));
436436
}
@@ -460,17 +460,17 @@ TEST_F(MinidumpParserTest, GetMemoryRegionInfoLinuxMaps) {
460460
parser->BuildMemoryRegions(),
461461
testing::Pair(
462462
testing::ElementsAre(
463-
MemoryRegionInfo({0x400d9000, 0x2000}, yes, no, yes, yes,
463+
MemoryRegionInfo({0x400d9000, 0x2000}, yes, no, yes, no, yes,
464464
app_process, unknown, 0, unknown, unknown),
465-
MemoryRegionInfo({0x400db000, 0x1000}, yes, no, no, yes,
465+
MemoryRegionInfo({0x400db000, 0x1000}, yes, no, no, no, yes,
466466
app_process, unknown, 0, unknown, unknown),
467-
MemoryRegionInfo({0x400dc000, 0x1000}, yes, yes, no, yes,
467+
MemoryRegionInfo({0x400dc000, 0x1000}, yes, yes, no, no, yes,
468468
ConstString(), unknown, 0, unknown, unknown),
469-
MemoryRegionInfo({0x400ec000, 0x1000}, yes, no, no, yes,
469+
MemoryRegionInfo({0x400ec000, 0x1000}, yes, no, no, no, yes,
470470
ConstString(), unknown, 0, unknown, unknown),
471-
MemoryRegionInfo({0x400ee000, 0x1000}, yes, yes, no, yes, linker,
471+
MemoryRegionInfo({0x400ee000, 0x1000}, yes, yes, no, no, yes, linker,
472472
unknown, 0, unknown, unknown),
473-
MemoryRegionInfo({0x400fc000, 0x1000}, yes, yes, yes, yes, liblog,
473+
MemoryRegionInfo({0x400fc000, 0x1000}, yes, yes, yes, no, yes, liblog,
474474
unknown, 0, unknown, unknown)),
475475
true));
476476
}
@@ -491,7 +491,7 @@ TEST_F(MinidumpParserTest, GetMemoryRegionInfoLinuxMapsError) {
491491
EXPECT_THAT(
492492
parser->BuildMemoryRegions(),
493493
testing::Pair(testing::ElementsAre(MemoryRegionInfo(
494-
{0x400fc000, 0x1000}, yes, yes, yes, yes,
494+
{0x400fc000, 0x1000}, yes, yes, yes, no, yes,
495495
ConstString(nullptr), unknown, 0, unknown, unknown)),
496496
true));
497497
}

0 commit comments

Comments
 (0)