Commit Graph

123 Commits

Author SHA1 Message Date
Artem Chikin
9429136112 [Dependency Scanning] Split the ModuleDependencyCache into two: current scan cache & global.
This change causes the cache to be layered with a local "cache" that wraps the global cache, which will serve as the source of truth. The local cache persists only for the duration of a given scanning action, and has a store of references to dependencies resolved as a part of the current scanning action only, while the global cache is the one that persists across scanning actions (e.g. in `DependencyScanningTool`) and stores actual module dependency info values.

Only the local cache can answer dependency lookup queries, checking current scanning action results first, before falling back to querying the global cache, with queries disambiguated by the current scannning action's search paths, ensuring we never resolve a dependency lookup query with a module info that could not be found in the current action's search paths.

This change is required because search-path disambiguation can lead to false-negatives: for example, the Clang dependency scanner may find modules relative to the compiler's path that are not on the compiler's direct search paths. While such false-negative query responses should be functionally safe, we rely on the current scanning action's results being always-present-in-the-cache for the scanner's functionality. This layering ensures that the cache use-sites remain unchanged and that we get both: preserved global state which can be queried disambiguated with the search path details, and an always-consistent local (current action) cache state.
2021-08-06 09:13:42 -07:00
hiro
923fba78e1 Fixed typos (#38247)
* fix: typo occured -> occurred

* fix: typo occured -> occurred

* fix: typo depenedency -> dependency
2021-07-03 14:56:44 -03:00
Artem Chikin
7e2c8e97fc [Dependency Scanning] Add ability for -scan-dependencies action to serialize and deserialize dependency scanner cache from a .moddepcache file.
Using the serialization format added in https://github.com/apple/swift/pull/37585.

- Add load/save code for the `-scan-dependencies` code-path.
- Add `libSwiftDriver` entry-points to load/store the cache of a given scanner instance.
2021-06-01 14:45:50 -07:00
Artem Chikin
14229f13b0 [Dependency Scanning] Add a binary serialization format for the Inter-Module Dependencies Cache
- Adds serialization format based on the LLVM Bitcode File Format (https://llvm.org/docs/BitCodeFormat.html).
- Adds Serialization and Deserialization code.
2021-05-21 14:31:00 -07:00
Artem Chikin
39483f0a91 [Dependency Scanning] Cache compiler instance/module depenency cache used for batched versioned-PCM scans. 2021-01-07 09:08:21 -08:00
Artem Chikin
d621e22ffe [Dependency Scanning] Use DEFINE_SIMPLE_CONVERSION_FUNCTIONS macro instead of defining own wrap/unwrap functions for the opaque scanner type. 2021-01-07 09:08:21 -08:00
Artem Chikin
41a09a4092 [Dependency Scanning] Establish object ownership convention by using a Foundation-style ownership signals naming scheme across the API surface.
Foundation-style ownership signals documentation:
https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-CJBEJBHH
2021-01-07 09:08:21 -08:00
Artem Chikin
f91c8a8574 [Dependency Scanning] Refactor string implementation to always malloc and tie lifetime to owning object. 2021-01-07 09:08:21 -08:00
Artem Chikin
53e53db6c0 [Dependency Scanning] Factor the shared library libSwiftScan into tools and add exports file.
This library now relires on a static compiler library called `swiftDependencyScan`, which is also common to being used by `swift-frontend` for its dependency scanner invocations.
2021-01-07 09:08:20 -08:00
Artem Chikin
ca1694442d [Dependency Scanning] Export opaque types as pointers to C structs instead of void* for better type-safety and cleaner code 2021-01-07 09:08:20 -08:00
Artem Chikin
108e9da448 [Dependency Scanning] Make scanner invocation context (argc, argv, working_dir) an opaque type 2021-01-07 09:08:20 -08:00
Artem Chikin
cff741b60f [Dependency Scanning] Make the prescan dependency scan result (import set) an opaque structure 2021-01-07 09:08:20 -08:00
Artem Chikin
c6705ad090 [Dependency Scanning] Make the batch scan entry container an opaque type 2021-01-07 09:08:20 -08:00
Artem Chikin
409de733f7 [Dependency Scanning] Make the overall dependency scan result (inter-module dependency graph) an opaque structure 2021-01-07 09:08:20 -08:00
Artem Chikin
5cacff4d84 [Dependency Scanning] Make a module's dependency info an opaque structure 2021-01-07 09:08:20 -08:00
Artem Chikin
fcf943370e [Dependency Scanning] Change C API prefix to: swiftscan from ds and adopt query method naming scheme of:
`<prefix>_<object>_<action>`
2021-01-07 09:08:20 -08:00
Artem Chikin
d0220e50ff [Dependency Scanning] Add entry-point to DependencyScanningTool and the corresponding C API for a batch scan operation 2021-01-07 09:08:20 -08:00
Artem Chikin
2ad960083a [Dependency Scanning] Use an opaque type for dependency module details with API query functions for individual fields 2021-01-07 09:08:20 -08:00
Artem Chikin
75b8a0ea44 [Dependency Scanning] Add entry-point to DependencyScanningTool and the corresponding C API for an import prescan operation 2021-01-07 09:08:20 -08:00
Artem Chikin
75a8cfa048 [Dependency Scanning] Add a C API layer for dependency scanning tool, scanning actions, and scan results.
Adds a C API layer consisting of:
- Data structures used to represent in-memory result of dependency scanning
- Opaque dependency scanner tool (C wrapper for `DependencyScanningTool`)

Refactors `ScanDependencies.cpp` to produce dependency scanning result in the form of the above binary format.
2021-01-07 09:08:20 -08:00
Artem Chikin
082fc48b25 [Dependency Scanning] Refactor dependency scanner to return an in-memory format as a result
This commit refactors ScanDependencies.cpp to split the functionality into two functional groups:
- Scan execution code that performs the mechanics of the scan and produces an in-memory result
- Dependency scanner entry-points used when the scanning action is invoked as a `swift-frontend` execution mode
This commit also adds the aforementioned in-memory dependency scanning result in `FullDependencies.h`, modeled after the InterModuleDependencyGraph representation in swift-driver
2021-01-07 09:08:20 -08:00
Artem Chikin
dad14358fb [Dependency Scanning] Factor out import prescan into separate utility 2021-01-07 09:08:20 -08:00
Artem Chikin
aabcb22df1 Rename SwiftScan directory into DependencyScan 2021-01-07 09:08:20 -08:00