Files
swift-mirror/include/swift/Frontend/CompileJobCacheResult.h
Steven Wu 6c3097657a [Caching] Change swift cache key computation
Update swift cache key computation mechanism from one cache key per
output, to one cache key per primary input file (for all outputs that
associated with that input).

The new schema allows fewer cache lookups while still preserving most of
the flexibility for batch mode and incremental mode.
2023-10-13 09:15:22 -07:00

115 lines
3.7 KiB
C++

//===------CompileJobCacheResult.h-- -----------------------------*-C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 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_FRONTEND_COMPILEJOBCACHERESULT_H
#define SWIFT_FRONTEND_COMPILEJOBCACHERESULT_H
#include "swift/Basic/FileTypes.h"
#include "llvm/CAS/CASNodeSchema.h"
#include "llvm/CAS/ObjectStore.h"
namespace swift::cas {
class CompileJobResultSchema;
class CompileJobCacheResult : public llvm::cas::ObjectProxy {
public:
/// A single output file or stream.
struct Output {
/// The CAS object for this output.
llvm::cas::ObjectRef Object;
/// The output kind.
file_types::ID Kind;
bool operator==(const Output &Other) const {
return Object == Other.Object && Kind == Other.Kind;
}
};
/// Retrieves each \c Output from this result.
llvm::Error
forEachOutput(llvm::function_ref<llvm::Error(Output)> Callback) const;
/// Loads all outputs concurrently and passes the resulting \c ObjectProxy
/// objects to \p Callback. If there was an error during loading then the
/// callback will not be invoked.
llvm::Error forEachLoadedOutput(
llvm::function_ref<llvm::Error(Output, std::optional<ObjectProxy>)>
Callback);
size_t getNumOutputs() const;
Output getOutput(size_t I) const;
/// Retrieves a specific output specified by \p Kind, if it exists.
llvm::Optional<Output> getOutput(file_types::ID Kind) const;
/// Print this result to \p OS.
llvm::Error print(llvm::raw_ostream &OS);
/// Helper to build a \c CompileJobCacheResult from individual outputs.
class Builder {
public:
Builder();
~Builder();
/// Treat outputs added for \p Path as having the given \p Kind. Otherwise
/// they will have kind \c Unknown.
void addKindMap(file_types::ID Kind, StringRef Path);
/// Add an output with an explicit \p Kind.
void addOutput(file_types::ID Kind, llvm::cas::ObjectRef Object);
/// Add an output for the given \p Path. There must be a a kind map for it.
llvm::Error addOutput(StringRef Path, llvm::cas::ObjectRef Object);
/// Build a single \c ObjectRef representing the provided outputs. The
/// result can be used with \c CompileJobResultSchema to retrieve the
/// original outputs.
llvm::Expected<llvm::cas::ObjectRef> build(llvm::cas::ObjectStore &CAS);
private:
struct PrivateImpl;
PrivateImpl &Impl;
};
private:
llvm::cas::ObjectRef getOutputObject(size_t I) const;
llvm::cas::ObjectRef getPathsListRef() const;
file_types::ID getOutputKind(size_t I) const;
llvm::Expected<llvm::cas::ObjectRef> getOutputPath(size_t I) const;
private:
friend class CompileJobResultSchema;
CompileJobCacheResult(const ObjectProxy &);
};
class CompileJobResultSchema
: public llvm::RTTIExtends<CompileJobResultSchema, llvm::cas::NodeSchema> {
public:
static char ID;
CompileJobResultSchema(llvm::cas::ObjectStore &CAS);
/// Attempt to load \p Ref as a \c CompileJobCacheResult if it matches the
/// schema.
llvm::Expected<CompileJobCacheResult> load(llvm::cas::ObjectRef Ref) const;
bool isRootNode(const CompileJobCacheResult::ObjectProxy &Node) const final;
bool isNode(const CompileJobCacheResult::ObjectProxy &Node) const final;
/// Get this schema's marker node.
llvm::cas::ObjectRef getKindRef() const { return KindRef; }
private:
llvm::cas::ObjectRef KindRef;
};
} // namespace swift::cas
#endif