mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
* spelling: accessor Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: accommodates Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: argument Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: associated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: availability Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: available Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: belongs Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: bookkeeping Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: building Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: clazz Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: clonable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: closure Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: concatenated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: conformance Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: context Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: conversion Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: correspondence Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: declarations Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: declared Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: defining Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: delayed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: dependency Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: deployed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: descendants Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: diagnose Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: diagnostic Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: equitable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: evaluation Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: exclusivity Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: existence Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: existential Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: explicit Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: expressed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: for Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: foreign Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: function Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: identifier Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: implicit Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: indices Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: information Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: instance Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: interchangeable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: interface Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: introduced Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: invalid Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: kind-in Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: least Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: library Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: location Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: namespace Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: necessary Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: nonexistent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: not Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: number Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: obtains Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: occurs Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: opaque Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: overridden Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: parameter Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: precede Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: preceding Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: property Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: protocol Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: qualified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: recognized Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: recursively Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: references Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: relaxing Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: represented Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: request Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: requirement Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: requirements Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: retrieve Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: returned Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: satisfied Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: satisfy Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: scanner Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: siblings Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: simplified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: something Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: source Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: specializations Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: specially Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: statement Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: stripped Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: structure Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: substitution Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: the Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transform Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transformed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transitively Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transparent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: typecheck Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unknown Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unlabeled Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unqualified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: whether Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: with Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: scanner Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> Co-authored-by: Josh Soref <jsoref@users.noreply.github.com>
169 lines
6.0 KiB
C++
169 lines
6.0 KiB
C++
//===---- FineGrainedDependencyFormat.h - swiftdeps format ---*- C++ -*-======//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_AST_FINEGRAINEDDEPENDENCYFORMAT_H
|
|
#define SWIFT_AST_FINEGRAINEDDEPENDENCYFORMAT_H
|
|
|
|
#include "llvm/Bitcode/BitcodeConvenience.h"
|
|
#include "llvm/Bitstream/BitCodes.h"
|
|
|
|
namespace llvm {
|
|
class MemoryBuffer;
|
|
}
|
|
|
|
namespace swift {
|
|
|
|
class DiagnosticEngine;
|
|
|
|
namespace fine_grained_dependencies {
|
|
|
|
class SourceFileDepGraph;
|
|
|
|
using llvm::BCFixed;
|
|
using llvm::BCVBR;
|
|
using llvm::BCBlob;
|
|
using llvm::BCRecordLayout;
|
|
|
|
/// Every .swiftdeps file begins with these 4 bytes, for easy identification when
|
|
/// debugging.
|
|
const unsigned char FINE_GRAINED_DEPENDENCY_FORMAT_SIGNATURE[] = {'D', 'E', 'P', 'S'};
|
|
|
|
const unsigned FINE_GRAINED_DEPENDENCY_FORMAT_VERSION_MAJOR = 1;
|
|
|
|
/// Increment this on every change.
|
|
const unsigned FINE_GRAINED_DEPENDENCY_FORMAT_VERSION_MINOR = 0;
|
|
|
|
using IdentifierIDField = BCVBR<13>;
|
|
|
|
using NodeKindField = BCFixed<3>;
|
|
using DeclAspectField = BCFixed<1>;
|
|
|
|
const unsigned RECORD_BLOCK_ID = llvm::bitc::FIRST_APPLICATION_BLOCKID;
|
|
const unsigned INCREMENTAL_INFORMATION_BLOCK_ID = 196;
|
|
|
|
/// The swiftdeps file format consists of a METADATA record, followed by zero or more
|
|
/// IDENTIFIER_NODE records.
|
|
///
|
|
/// Then, there is one SOURCE_FILE_DEP_GRAPH_NODE for each serialized
|
|
/// SourceFileDepGraphNode. These are followed by FINGERPRINT_NODE and
|
|
/// DEPENDS_ON_DEFINITION_NODE, if the node has a fingerprint and depends-on
|
|
/// definitions, respectively.
|
|
namespace record_block {
|
|
enum {
|
|
METADATA = 1,
|
|
SOURCE_FILE_DEP_GRAPH_NODE,
|
|
FINGERPRINT_NODE,
|
|
DEPENDS_ON_DEFINITION_NODE,
|
|
IDENTIFIER_NODE,
|
|
};
|
|
|
|
// Always the first record in the file.
|
|
using MetadataLayout = BCRecordLayout<
|
|
METADATA, // ID
|
|
BCFixed<16>, // Dependency graph format major version
|
|
BCFixed<16>, // Dependency graph format minor version
|
|
BCBlob // Compiler version string
|
|
>;
|
|
|
|
// After the metadata record, we have zero or more identifier records,
|
|
// for each unique string that is referenced from a SourceFileDepGraphNode.
|
|
//
|
|
// Identifiers are referenced by their sequence number, starting from 1.
|
|
// The identifier value 0 is special; it always represents the empty string.
|
|
// There is no IDENTIFIER_NODE serialized that corresponds to it, instead
|
|
// the first IDENTIFIER_NODE always has a sequence number of 1.
|
|
using IdentifierNodeLayout = BCRecordLayout<
|
|
IDENTIFIER_NODE,
|
|
BCBlob
|
|
>;
|
|
|
|
using SourceFileDepGraphNodeLayout = BCRecordLayout<
|
|
SOURCE_FILE_DEP_GRAPH_NODE, // ID
|
|
// The next four fields correspond to the fields of the DependencyKey
|
|
// structure.
|
|
NodeKindField, // DependencyKey::kind
|
|
DeclAspectField, // DependencyKey::aspect
|
|
IdentifierIDField, // DependencyKey::context
|
|
IdentifierIDField, // DependencyKey::name
|
|
BCFixed<1> // Is this a "provides" node?
|
|
>;
|
|
|
|
// Follows DEPENDS_ON_DEFINITION_NODE when the SourceFileDepGraphNode has a
|
|
// fingerprint set.
|
|
using FingerprintNodeLayout = BCRecordLayout<
|
|
FINGERPRINT_NODE,
|
|
BCBlob
|
|
>;
|
|
|
|
// Follows SOURCE_FILE_DEP_GRAPH_NODE and FINGERPRINT_NODE when the
|
|
// SourceFileDepGraphNode has one or more depends-on entries.
|
|
using DependsOnDefNodeLayout = BCRecordLayout<
|
|
DEPENDS_ON_DEFINITION_NODE,
|
|
BCVBR<16> // The sequence number (starting from 0) of the referenced
|
|
// SOURCE_FILE_DEP_GRAPH_NODE
|
|
>;
|
|
}
|
|
|
|
/// Tries to read the dependency graph from the given buffer.
|
|
/// Returns \c true if there was an error.
|
|
bool readFineGrainedDependencyGraph(llvm::MemoryBuffer &buffer,
|
|
SourceFileDepGraph &g);
|
|
|
|
/// Tries to read the dependency graph from the given buffer, assuming that it
|
|
/// is in the format of a swiftmodule file.
|
|
/// Returns \c true if there was an error.
|
|
bool readFineGrainedDependencyGraphFromSwiftModule(llvm::MemoryBuffer &buffer,
|
|
SourceFileDepGraph &g);
|
|
|
|
/// Tries to read the dependency graph from the given path name.
|
|
/// Returns true if there was an error.
|
|
bool readFineGrainedDependencyGraph(llvm::StringRef path,
|
|
SourceFileDepGraph &g);
|
|
|
|
/// Tries to write the dependency graph to the given path name.
|
|
/// Returns true if there was an error.
|
|
bool writeFineGrainedDependencyGraphToPath(DiagnosticEngine &diags,
|
|
llvm::StringRef path,
|
|
const SourceFileDepGraph &g);
|
|
|
|
/// Enumerates the supported set of purposes for writing out or reading in
|
|
/// swift dependency information into a file. These can be used to influence
|
|
/// the structure of the resulting data that is produced by the serialization
|
|
/// machinery defined here.
|
|
enum class Purpose : bool {
|
|
/// Write out fine grained dependency metadata suitable for embedding in
|
|
/// \c .swiftmodule file.
|
|
///
|
|
/// The resulting metadata does not contain the usual block descriptor header
|
|
/// nor does it contain a leading magic signature, which would otherwise
|
|
/// disrupt clients and tools that do not expect them to be present such as
|
|
/// llvm-bcanalyzer.
|
|
ForSwiftModule = false,
|
|
/// Write out fine grained dependency metadata suitable for a standalone
|
|
/// \c .swiftdeps file.
|
|
///
|
|
/// The resulting metadata will contain a leading magic signature and block
|
|
/// descriptor header.
|
|
ForSwiftDeps = true,
|
|
};
|
|
|
|
/// Tries to write out the given dependency graph with the given
|
|
/// bitstream writer.
|
|
void writeFineGrainedDependencyGraph(llvm::BitstreamWriter &Out,
|
|
const SourceFileDepGraph &g,
|
|
Purpose purpose);
|
|
|
|
} // namespace fine_grained_dependencies
|
|
} // namespace swift
|
|
|
|
#endif
|