• Home
  • Raw
  • Download

Lines Matching +full:cache +full:- +full:base

2 // Use of this source code is governed by a BSD-style license that can be
11 #include "base/containers/adapters.h"
12 #include "base/functional/callback.h"
13 #include "base/functional/callback_helpers.h"
14 #include "base/profiler/module_cache.h"
15 #include "base/ranges/algorithm.h"
16 #include "base/strings/string_piece.h"
17 #include "base/test/bind.h"
22 #include "base/debug/proc_maps_linux.h"
25 // Note: The special-case IS_CHROMEOS code inside GetDebugBasenameForModule to
30 namespace base { namespace
37 // Provides a module that is guaranteed to be isolated from (and non-contiguous
63 // Provides a fake module with configurable base address and size.
91 // Utility function to add a single non-native module during test setup. Returns
94 ModuleCache* cache, in AddNonNativeModule() argument
99 cache->UpdateNonNativeModules({}, std::move(modules)); in AddNonNativeModule()
111 ModuleCache cache; in MAYBE_TEST() local
113 cache.GetModuleForAddress(reinterpret_cast<uintptr_t>(&AFunctionForTest)); in MAYBE_TEST()
119 module->GetDebugBasename() in MAYBE_TEST()
124 EXPECT_EQ("base_unittests", module->GetDebugBasename().value()); in MAYBE_TEST()
126 EXPECT_EQ(L"base_unittests.exe.pdb", module->GetDebugBasename().value()); in MAYBE_TEST()
135 ModuleCache cache; in MAYBE_TEST() local
136 const ModuleCache::Module* module1 = cache.GetModuleForAddress(ptr1); in MAYBE_TEST()
137 const ModuleCache::Module* module2 = cache.GetModuleForAddress(ptr2); in MAYBE_TEST()
140 EXPECT_GT(module1->GetSize(), 0u); in MAYBE_TEST()
141 EXPECT_LE(module1->GetBaseAddress(), ptr1); in MAYBE_TEST()
142 EXPECT_GT(module1->GetBaseAddress() + module1->GetSize(), ptr2); in MAYBE_TEST()
146 ModuleCache cache; in MAYBE_TEST() local
149 cache.AddCustomNativeModule(std::move(to_inject)); in MAYBE_TEST()
151 EXPECT_EQ(nullptr, cache.GetModuleForAddress(module->GetBaseAddress() - 1)); in MAYBE_TEST()
152 EXPECT_EQ(module, cache.GetModuleForAddress(module->GetBaseAddress())); in MAYBE_TEST()
153 EXPECT_EQ(module, cache.GetModuleForAddress(module->GetBaseAddress() + in MAYBE_TEST()
154 module->GetSize() - 1)); in MAYBE_TEST()
155 EXPECT_EQ(nullptr, cache.GetModuleForAddress(module->GetBaseAddress() + in MAYBE_TEST()
156 module->GetSize())); in MAYBE_TEST()
160 ModuleCache cache; in MAYBE_TEST() local
162 AddNonNativeModule(&cache, std::make_unique<IsolatedModule>(false)); in MAYBE_TEST()
164 EXPECT_EQ(nullptr, cache.GetModuleForAddress(module->GetBaseAddress() - 1)); in MAYBE_TEST()
165 EXPECT_EQ(module, cache.GetModuleForAddress(module->GetBaseAddress())); in MAYBE_TEST()
166 EXPECT_EQ(module, cache.GetModuleForAddress(module->GetBaseAddress() + in MAYBE_TEST()
167 module->GetSize() - 1)); in MAYBE_TEST()
168 EXPECT_EQ(nullptr, cache.GetModuleForAddress(module->GetBaseAddress() + in MAYBE_TEST()
169 module->GetSize())); in MAYBE_TEST()
173 ModuleCache cache; in MAYBE_TEST() local
177 cache.AddCustomNativeModule(std::move(native_module_to_inject)); in MAYBE_TEST()
179 // Overlay the native module with the non-native module, starting 8 bytes into in MAYBE_TEST()
182 &cache, in MAYBE_TEST()
183 std::make_unique<FakeModule>(native_module->GetBaseAddress() + 8, in MAYBE_TEST()
184 native_module->GetSize() - 16, false)); in MAYBE_TEST()
187 cache.GetModuleForAddress(non_native_module->GetBaseAddress() - 1)); in MAYBE_TEST()
189 cache.GetModuleForAddress(non_native_module->GetBaseAddress())); in MAYBE_TEST()
191 cache.GetModuleForAddress(non_native_module->GetBaseAddress() + in MAYBE_TEST()
192 non_native_module->GetSize() - 1)); in MAYBE_TEST()
194 cache.GetModuleForAddress(non_native_module->GetBaseAddress() + in MAYBE_TEST()
195 non_native_module->GetSize())); in MAYBE_TEST()
199 ModuleCache cache; in MAYBE_TEST() local
203 cache.UpdateNonNativeModules({}, std::move(modules)); in MAYBE_TEST()
205 EXPECT_EQ(module, cache.GetModuleForAddress(1)); in MAYBE_TEST()
209 ModuleCache cache; in MAYBE_TEST() local
213 cache.UpdateNonNativeModules({}, std::move(modules)); in MAYBE_TEST()
214 cache.UpdateNonNativeModules({module}, {}); in MAYBE_TEST()
216 EXPECT_EQ(nullptr, cache.GetModuleForAddress(1)); in MAYBE_TEST()
222 ModuleCache cache; in MAYBE_TEST() local
228 cache.UpdateNonNativeModules({}, std::move(modules)); in MAYBE_TEST()
229 cache.UpdateNonNativeModules({module}, {}); in MAYBE_TEST()
243 ModuleCache cache; in MAYBE_TEST() local
250 cache.UpdateNonNativeModules({}, std::move(modules)); in MAYBE_TEST()
251 cache.UpdateNonNativeModules({module1}, {}); in MAYBE_TEST()
259 ModuleCache cache; in MAYBE_TEST() local
260 // Replace a module with another larger module at the same base address. in MAYBE_TEST()
268 cache.UpdateNonNativeModules({}, std::move(modules1)); in MAYBE_TEST()
269 cache.UpdateNonNativeModules({module1}, std::move(modules2)); in MAYBE_TEST()
271 EXPECT_EQ(module2, cache.GetModuleForAddress(2)); in MAYBE_TEST()
278 ModuleCache cache; in MAYBE_TEST() local
280 // Checks that non-native modules can be repeatedly added and removed at the in MAYBE_TEST()
281 // same addresses, and that all are retained in the cache. in MAYBE_TEST()
292 cache.UpdateNonNativeModules({}, std::move(modules1)); in MAYBE_TEST()
293 cache.UpdateNonNativeModules({module1}, std::move(modules2)); in MAYBE_TEST()
294 cache.UpdateNonNativeModules({module2}, {}); in MAYBE_TEST()
300 ModuleCache cache; in MAYBE_TEST() local
312 cache.UpdateNonNativeModules({}, std::move(to_add)); in MAYBE_TEST()
313 cache.UpdateNonNativeModules({to_remove}, {}); in MAYBE_TEST()
315 DCHECK_NE(nullptr, cache.GetModuleForAddress(1)); in MAYBE_TEST()
316 DCHECK_EQ(nullptr, cache.GetModuleForAddress(2)); in MAYBE_TEST()
317 DCHECK_NE(nullptr, cache.GetModuleForAddress(3)); in MAYBE_TEST()
318 DCHECK_EQ(nullptr, cache.GetModuleForAddress(4)); in MAYBE_TEST()
319 DCHECK_NE(nullptr, cache.GetModuleForAddress(5)); in MAYBE_TEST()
323 ModuleCache cache; in MAYBE_TEST() local
325 const ModuleCache::Module* native_module = cache.GetModuleForAddress(ptr); in MAYBE_TEST()
327 AddNonNativeModule(&cache, std::make_unique<FakeModule>(1, 2, false)); in MAYBE_TEST()
330 std::vector<const ModuleCache::Module*> modules = cache.GetModules(); in MAYBE_TEST()
337 ModuleCache cache; in MAYBE_TEST() local
338 EXPECT_EQ(nullptr, cache.GetModuleForAddress(1)); in MAYBE_TEST()
361 const auto rloc = base::ranges::find_if( in TEST()
362 base::Reversed(regions), [](const debug::MappedMemoryRegion* region) { in TEST()
363 return static_cast<bool>(region->permissions & in TEST()
388 path_regions_pair.second.front()->start; in TEST()
390 ModuleCache cache; in TEST() local
392 cache.GetModuleForAddress(region->start); in TEST()
401 EXPECT_EQ(expected_base_address, module->GetBaseAddress()); in TEST()
405 EXPECT_LE(module->GetSize(), in TEST()
406 last_executable_region->end - expected_base_address) in TEST()
407 << "base address: " << std::hex << module->GetBaseAddress() in TEST()
409 << "region start: " << std::hex << region->start << std::endl in TEST()
410 << "region end: " << std::hex << region->end << std::endl; in TEST()
414 // Linux should have at least this module and ld-linux.so. Android should have in TEST()
438 ModuleCache cache; in TEST() local
439 EXPECT_EQ(nullptr, cache.GetModuleForAddress(1)); in TEST()
442 cache.RegisterAuxiliaryModuleProvider(&auxiliary_provider); in TEST()
443 auto* module = cache.GetModuleForAddress(1); in TEST()
445 EXPECT_EQ(1U, module->GetBaseAddress()); in TEST()
446 cache.UnregisterAuxiliaryModuleProvider(&auxiliary_provider); in TEST()
448 // Even when unregistered, the module remains in the cache. in TEST()
449 EXPECT_EQ(module, cache.GetModuleForAddress(1)); in TEST()
455 ModuleCache cache; in MAYBE_TEST() local
458 cache.RegisterAuxiliaryModuleProvider(&auxiliary_provider); in MAYBE_TEST()
461 cache.GetModuleForAddress(reinterpret_cast<uintptr_t>(&AFunctionForTest)); in MAYBE_TEST()
466 EXPECT_NE(100u, module->GetSize()); in MAYBE_TEST()
467 cache.UnregisterAuxiliaryModuleProvider(&auxiliary_provider); in MAYBE_TEST()
472 ModuleCache cache; in TEST() local
474 EXPECT_EQ(nullptr, cache.GetModuleForAddress(1)); in TEST()
477 cache.RegisterAuxiliaryModuleProvider(&auxiliary_provider); in TEST()
478 cache.UnregisterAuxiliaryModuleProvider(&auxiliary_provider); in TEST()
480 EXPECT_EQ(nullptr, cache.GetModuleForAddress(1)); in TEST()
486 // base::TransformModuleIDToSymbolServerFormat implementation. in TEST()
494 } // namespace base