| // -*- C++ -*- | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // The other libunwind tests don't test internal interfaces, so the include path | |
| // is a little wonky. | |
| #include "../src/config.h" | |
| // Only run this test under supported configurations. | |
| #if defined(_LIBUNWIND_USE_DL_ITERATE_PHDR) && \ | |
| defined(_LIBUNWIND_USE_FRAME_HEADER_CACHE) | |
| #include <link.h> | |
| #include <stdio.h> | |
| // This file defines several of the data structures needed here, | |
| // and includes FrameHeaderCache.hpp as well. | |
| #include "../src/AddressSpace.hpp" | |
| #define kBaseAddr 0xFFF000 | |
| #define kTextSegmentLength 0xFF | |
| using namespace libunwind; | |
| int main(int, char**) { | |
| FrameHeaderCache FHC; | |
| struct dl_phdr_info PInfo; | |
| memset(&PInfo, 0, sizeof(PInfo)); | |
| // The cache itself should only care about these two fields--they | |
| // tell the cache to invalidate or not; everything else is handled | |
| // by AddressSpace.hpp. | |
| PInfo.dlpi_adds = 6; | |
| PInfo.dlpi_subs = 7; | |
| UnwindInfoSections UIS; | |
| UIS.dso_base = kBaseAddr; | |
| UIS.text_segment_length = kTextSegmentLength; | |
| dl_iterate_cb_data CBData; | |
| // Unused by the cache. | |
| CBData.addressSpace = nullptr; | |
| CBData.sects = &UIS; | |
| CBData.targetAddr = kBaseAddr + 1; | |
| // Nothing present, shouldn't find. | |
| if (FHC.find(&PInfo, 0, &CBData)) | |
| abort(); | |
| FHC.add(&UIS); | |
| // Just added. Should find. | |
| if (!FHC.find(&PInfo, 0, &CBData)) | |
| abort(); | |
| // Cache is invalid. Shouldn't find. | |
| PInfo.dlpi_adds++; | |
| if (FHC.find(&PInfo, 0, &CBData)) | |
| abort(); | |
| FHC.add(&UIS); | |
| CBData.targetAddr = kBaseAddr - 1; | |
| // Shouldn't find something outside of the addresses. | |
| if (FHC.find(&PInfo, 0, &CBData)) | |
| abort(); | |
| // Add enough things to the cache that the entry is evicted. | |
| for (int i = 0; i < 9; i++) { | |
| UIS.dso_base = kBaseAddr + (kTextSegmentLength * i); | |
| FHC.add(&UIS); | |
| } | |
| CBData.targetAddr = kBaseAddr; | |
| // Should have been evicted. | |
| if (FHC.find(&PInfo, 0, &CBData)) | |
| abort(); | |
| return 0; | |
| } | |
| #else | |
| int main(int, char**) { return 0;} | |
| #endif |