llvm-project/clang/test/Modules/header-search-paths-mismatch.c
Jan Svoboda 6c465a201b
[clang][deps] Skip slow UNHASHED_CONTROL_BLOCK records (#69975)
Deserialization of the `DIAGNOSTIC_OPTIONS` and `HEADER_SEARCH_PATHS`
records is slow and done for every transitively loaded PCM.
Deserialization of these records cannot be skipped, because the words
are VBR6-encoded and we don't store the length of the entire record. We
could either turn them into binary blobs that can be skipped during
deserialization, or skip writing them altogether. This patch takes the
latter approach, since these records are not necessary in scanning PCMs.
The scanner doesn't make any guarantees about the accuracy of
diagnostics, and we always have the same header search paths due to
strict context hashing.

The commit that makes the `DIAGNOSTIC_OPTIONS` record skippable was
originally implemented by @benlangmuir in a downstream repo.
2023-11-02 15:07:58 -07:00

37 lines
1.6 KiB
C

// RUN: rm -rf %t && mkdir -p %t
// RUN: split-file %s %t
//--- module.modulemap
module Mod { header "mod.h" }
//--- mod.h
//--- tu.c
#include "mod.h"
//--- one/foo.h
//--- two/foo.h
// By default, mismatched header search paths are ignored, old PCM file gets reused.
//
// RUN: %clang_cc1 -fmodules -fmodule-map-file=%t/module.modulemap -fmodules-cache-path=%t/cache1 -fdisable-module-hash \
// RUN: -fsyntax-only %t/tu.c -I %t/one
// RUN: %clang_cc1 -fmodules -fmodule-map-file=%t/module.modulemap -fmodules-cache-path=%t/cache1 -fdisable-module-hash \
// RUN: -fsyntax-only %t/tu.c -I %t/two -Rmodule-build 2>&1 \
// RUN: | FileCheck %s --allow-empty --check-prefix=DID-REUSE
// DID-REUSE-NOT: remark: building module 'Mod'
//
// RUN: %clang_cc1 -module-file-info %t/cache1/Mod.pcm | FileCheck %s --check-prefix=HS-PATHS
// HS-PATHS: Header search paths:
// HS-PATHS-NEXT: User entries:
// HS-PATHS-NEXT: one
// When skipping serialization of header search paths, mismatches cannot be detected, old PCM file gets reused.
//
// RUN: %clang_cc1 -fmodules -fmodule-map-file=%t/module.modulemap -fmodules-cache-path=%t/cache2 -fdisable-module-hash \
// RUN: -fsyntax-only %t/tu.c -fmodules-skip-header-search-paths -I %t/one
// RUN: %clang_cc1 -fmodules -fmodule-map-file=%t/module.modulemap -fmodules-cache-path=%t/cache2 -fdisable-module-hash \
// RUN: -fsyntax-only %t/tu.c -fmodules-skip-header-search-paths -I %t/two -Rmodule-build 2>&1 \
// RUN: | FileCheck %s --check-prefix=DID-REUSE --allow-empty
//
// RUN: %clang_cc1 -module-file-info %t/cache2/Mod.pcm | FileCheck %s --check-prefix=NO-HS-PATHS
// NO-HS-PATHS-NOT: Header search paths: