Files
clang-p2996/clang/test/ClangScanDeps/optimize-vfs-edgecases.m
Michael Spencer 7847e44594 [clang][DependencyScanner] Remove unused -ivfsoverlay files (#73734)
`-ivfsoverlay` files are unused when building most modules. Enable
removing them by,
* adding a way to visit the filesystem tree with extensible RTTI to
  access each `RedirectingFileSystem`.
* Adding tracking to `RedirectingFileSystem` to record when it
  actually redirects a file access.
* Storing this information in each PCM.

Usage tracking is only enabled when iterating over the source manager
and affecting modulemaps. Here each path is stated to cause an access.
During scanning these stats all hit the cache.
2024-01-30 15:39:18 -08:00

85 lines
1.9 KiB
Objective-C

// RUN: rm -rf %t
// RUN: split-file %s %t
// RUN: sed -e "s|DIR|%/t|g" %t/build/compile-commands.json.in > %t/build/compile-commands.json
// RUN: sed -e "s|DIR|%/t|g" %t/build/vfsoverlay.yaml.in > %t/build/vfsoverlay.yaml
// RUN: sed -e "s|DIR|%/t|g" %t/build/vfs.notyaml.in > %t/build/vfs.notyaml
// RUN: clang-scan-deps -compilation-database %t/build/compile-commands.json \
// RUN: -j 1 -format experimental-full --optimize-args=vfs,header-search > %t/deps.db
// RUN: %deps-to-rsp %t/deps.db --module-name=A > %t/A.rsp
// RUN: cd %t && %clang @%t/A.rsp
// Check that the following edge cases are handled by ivfsoverlay tracking
// * `-ivfsoverlay` args that depend on earlier `-ivfsoverlay` args.
//--- build/compile-commands.json.in
[
{
"directory": "DIR",
"command": "clang -c DIR/0.m -Imodules/A -fmodules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps -ivfsoverlay build/vfsoverlay.yaml -ivfsoverlay build/vfs.yaml",
"file": "DIR/0.m"
}
]
//--- build/vfsoverlay.yaml.in
{
"version":0,
"case-sensitive":"false",
"roots":[
{
"contents":[
{
"external-contents":"DIR/build/vfs.notyaml",
"name":"vfs.yaml",
"type":"file"
}
],
"name":"DIR/build",
"type":"directory"
}
]
}
//--- build/vfs.notyaml.in
{
"version":0,
"case-sensitive":"false",
"roots":[
{
"contents":[
{
"external-contents":"DIR/build/module.modulemap",
"name":"module.modulemap",
"type":"file"
},
{
"external-contents":"DIR/build/A.h",
"name":"A.h",
"type":"file"
}
],
"name":"DIR/modules/A",
"type":"directory"
}
]
}
//--- build/module.modulemap
module A {
umbrella header "A.h"
}
//--- build/A.h
typedef int A_t;
//--- 0.m
#include <A.h>
A_t a = 0;