30 Expected<ObjectRef> storeImpl(ArrayRef<uint8_t> ComputedHash,
32 ArrayRef<char>
Data)
final;
34 Expected<std::optional<ObjectHandle>> loadIfExists(ObjectRef
Ref)
final;
36 CASID getID(ObjectRef
Ref)
const final;
38 std::optional<ObjectRef> getReference(
const CASID &
ID)
const final;
40 Expected<bool> isMaterialized(ObjectRef
Ref)
const final;
42 ArrayRef<char> getDataConst(ObjectHandle Node)
const final;
44 Expected<ObjectRef> storeFromFile(StringRef Path)
final;
46 Error exportDataToFile(ObjectHandle Node, StringRef Path)
const final;
48 void print(raw_ostream &OS)
const final;
51 static Expected<std::unique_ptr<OnDiskCAS>> open(StringRef Path);
53 OnDiskCAS(std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB)
54 : UnifiedDB(std::
move(UniDB)), DB(&UnifiedDB->getGraphDB()) {}
57 ObjectHandle convertHandle(ondisk::ObjectHandle Node)
const {
58 return makeObjectHandle(
Node.getOpaqueData());
61 ondisk::ObjectHandle convertHandle(ObjectHandle Node)
const {
62 return ondisk::ObjectHandle(
Node.getInternalRef(*
this));
65 ObjectRef convertRef(ondisk::ObjectID
Ref)
const {
66 return makeObjectRef(
Ref.getOpaqueData());
69 ondisk::ObjectID convertRef(ObjectRef
Ref)
const {
73 size_t getNumRefs(ObjectHandle Node)
const final {
74 auto RefsRange = DB->getObjectRefs(convertHandle(Node));
78 ObjectRef readRef(ObjectHandle Node,
size_t I)
const final {
79 auto RefsRange = DB->getObjectRefs(convertHandle(Node));
80 return convertRef(RefsRange.begin()[
I]);
83 Error forEachRef(ObjectHandle Node,
84 function_ref<
Error(ObjectRef)> Callback)
const final;
87 Expected<std::optional<uint64_t>> getStorageSize()
const final;
88 Error pruneStorageData() final;
90 OnDiskCAS(std::unique_ptr<ondisk::OnDiskGraphDB> GraphDB)
91 : OwnedDB(std::
move(GraphDB)), DB(OwnedDB.
get()) {}
93 std::unique_ptr<ondisk::OnDiskGraphDB> OwnedDB;
94 std::shared_ptr<ondisk::UnifiedOnDiskCache> UnifiedDB;
95 ondisk::OnDiskGraphDB *DB;
101Error OnDiskCAS::validate(
bool CheckHash)
const {
108CASID OnDiskCAS::getID(ObjectRef
Ref)
const {
109 ArrayRef<uint8_t> Hash = DB->
getDigest(convertRef(
Ref));
113std::optional<ObjectRef> OnDiskCAS::getReference(
const CASID &
ID)
const {
114 std::optional<ondisk::ObjectID> ObjID =
118 return convertRef(*ObjID);
121Expected<bool> OnDiskCAS::isMaterialized(ObjectRef ExternalRef)
const {
125ArrayRef<char> OnDiskCAS::getDataConst(ObjectHandle Node)
const {
129Expected<std::optional<ObjectHandle>>
130OnDiskCAS::loadIfExists(ObjectRef ExternalRef) {
131 Expected<std::optional<ondisk::ObjectHandle>> ObjHnd =
132 DB->
load(convertRef(ExternalRef));
137 return convertHandle(**ObjHnd);
140Expected<ObjectRef> OnDiskCAS::storeImpl(ArrayRef<uint8_t> ComputedHash,
142 ArrayRef<char>
Data) {
145 for (ObjectRef
Ref : Refs) {
151 return StoredID.takeError();
154 return convertRef(*StoredID);
157Expected<ObjectRef> OnDiskCAS::storeFromFile(StringRef Path) {
160 return Hash.takeError();
163 return StoredID.takeError();
166 return convertRef(*StoredID);
169Error OnDiskCAS::exportDataToFile(ObjectHandle Node, StringRef Path)
const {
171 if (!FBData.FileInfo.has_value())
172 return BuiltinCAS::exportDataToFile(Node, Path);
175 assert(FBData.FileInfo.has_value());
179 ondisk::UniqueTempFile UniqueTmp;
181 FBData.FileInfo->FilePath);
183 return ExpectedPath.takeError();
184 StringRef TmpPath = *ExpectedPath;
186 if (FBData.FileInfo->IsFileNulTerminated) {
189 if (std::error_code EC =
206Error OnDiskCAS::forEachRef(ObjectHandle Node,
207 function_ref<
Error(ObjectRef)> Callback)
const {
209 for (ondisk::ObjectID
Ref : RefsRange) {
221Expected<std::optional<uint64_t>> OnDiskCAS::getStorageSize()
const {
222 return UnifiedDB->getStorageSize();
225Error OnDiskCAS::pruneStorageData() {
return UnifiedDB->collectGarbage(); }
227Expected<std::unique_ptr<OnDiskCAS>> OnDiskCAS::open(StringRef AbsPath) {
228 std::shared_ptr<ondisk::OnDiskCASLogger> Logger;
235 Expected<std::unique_ptr<ondisk::OnDiskGraphDB>> DB =
240 return DB.takeError();
241 return std::unique_ptr<OnDiskCAS>(
new OnDiskCAS(std::move(*DB)));
245#if LLVM_ENABLE_ONDISK_CAS
253#if LLVM_ENABLE_ONDISK_CAS
257 Path.toVector(AbsPath);
260 return OnDiskCAS::open(AbsPath);
266std::unique_ptr<ObjectStore>
268 std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB) {
269 return std::make_unique<OnDiskCAS>(std::move(UniDB));
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_UNLIKELY(EXPR)
static cl::opt< unsigned > SizeLimit("eif-limit", cl::init(6), cl::Hidden, cl::desc("Size limit in Hexagon early if-conversion"))
This file declares interface for OnDiskCASLogger, an interface that can be used to log CAS events to ...
This declares OnDiskGraphDB, an ondisk CAS database with a fixed length hash.
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
size_t size() const
size - Get the array size.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void reserve(size_type N)
void push_back(const T &Elt)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static Expected< HashT > hashFile(StringRef FilePath)
static CASID create(const CASContext *Context, StringRef Hash)
Create CASID from CASContext and raw hash bytes.
static StringRef getHashName()
Get the name of the hash for any table identifiers.
Common base class for builtin CAS implementations using the same CASContext.
static ObjectID fromOpaqueData(uint64_t Opaque)
static LLVM_ABI Expected< std::unique_ptr< OnDiskCASLogger > > openIfEnabled(const Twine &Path)
Create or append to a log file inside the given CAS directory Path if logging is enabled by the envir...
void print(raw_ostream &OS) const
LLVM_ABI_FOR_TEST Expected< std::optional< ObjectHandle > > load(ObjectID Ref)
Expected< bool > isMaterialized(ObjectID Ref)
Check whether the object associated with Ref is stored in the CAS.
Error validate(bool Deep, HashingFuncT Hasher) const
Validate the OnDiskGraphDB.
object_refs_range getObjectRefs(ObjectHandle Node) const
LLVM_ABI_FOR_TEST Error store(ObjectID ID, ArrayRef< ObjectID > Refs, ArrayRef< char > Data)
Associate data & references with a particular object ID.
ArrayRef< uint8_t > getDigest(ObjectID Ref) const
FileBackedData getInternalFileBackedObjectData(ObjectHandle Node) const
Provides access to the underlying file path, that represents an object leaf node, when available.
LLVM_ABI_FOR_TEST Error storeFile(ObjectID ID, StringRef FilePath)
Associates the data of a file with a particular object ID.
static LLVM_ABI_FOR_TEST Expected< std::unique_ptr< OnDiskGraphDB > > open(StringRef Path, StringRef HashName, unsigned HashByteSize, OnDiskGraphDB *UpstreamDB=nullptr, std::shared_ptr< OnDiskCASLogger > Logger=nullptr, FaultInPolicy Policy=FaultInPolicy::FullTree)
Open the on-disk store from a directory.
LLVM_ABI_FOR_TEST Expected< ObjectID > getReference(ArrayRef< uint8_t > Hash)
Form a reference for the provided hash.
LLVM_ABI_FOR_TEST ArrayRef< char > getObjectData(ObjectHandle Node) const
LLVM_ABI_FOR_TEST std::optional< ObjectID > getExistingReference(ArrayRef< uint8_t > Digest, bool CheckUpstream=true)
Get an existing reference to the object Digest.
Error renameTo(StringRef RenameToPath)
Rename the new unique file to RenameToPath.
Expected< StringRef > createAndCopyFrom(StringRef ParentPath, StringRef CopyFromPath)
Create a new unique file path under ParentPath and copy the contents of CopyFromPath into it.
This class implements an extremely fast bulk output stream that can only output to a stream.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
void validate(const Triple &TT, const FeatureBitset &FeatureBits)
std::unique_ptr< ObjectStore > createObjectStoreFromUnifiedOnDiskCache(std::shared_ptr< ondisk::UnifiedOnDiskCache > UniDB)
void hashingFunc(ArrayRef< ArrayRef< uint8_t > > Refs, ArrayRef< char > Data, SmallVectorImpl< uint8_t > &Result)
Convenience wrapper for BuiltinObjectHasher.
decltype(HasherT::hash(std::declval< ArrayRef< uint8_t > & >())) HashType
bool isOnDiskCASEnabled()
LLVM_ABI Expected< std::unique_ptr< ObjectStore > > createOnDiskCAS(const Twine &Path)
Create a persistent on-disk path at Path.
llvm::unique_function< void(llvm::Expected< T >)> Callback
A Callback<T> is a void function that accepts Expected<T>.
NodeAddr< NodeBase * > Node
Context & getContext() const
LLVM_ABI std::error_code closeFile(file_t &F)
Close the file object.
@ CD_OpenExisting
CD_OpenExisting - When opening a file:
std::error_code openFileForWrite(const Twine &Name, int &ResultFD, CreationDisposition Disp=CD_CreateAlways, OpenFlags Flags=OF_None, unsigned Mode=0666)
Opens the file with the given name in a write-only or read-write mode, returning its open file descri...
LLVM_ABI std::error_code make_absolute(SmallVectorImpl< char > &path)
Make path an absolute path.
LLVM_ABI std::error_code resize_file(int FD, uint64_t Size)
Resize path to size.
LLVM_ABI file_t convertFDToNativeFile(int FD)
Converts from a Posix file descriptor number to a native file handle.
LLVM_ABI StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
ScopedSetting scopedDisable()
This is an optimization pass for GlobalISel generic memory operations.
Error createFileError(const Twine &F, Error E)
Concatenate a source file path and/or name with an Error.
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
scope_exit(Callable) -> scope_exit< Callable >
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
@ Ref
The access may reference the value stored in memory.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
StringRef toStringRef(bool B)
Construct a string ref from a boolean.