diff options
Diffstat (limited to 'llvm/lib/CAS/BuiltinCAS.h')
-rw-r--r-- | llvm/lib/CAS/BuiltinCAS.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/llvm/lib/CAS/BuiltinCAS.h b/llvm/lib/CAS/BuiltinCAS.h new file mode 100644 index 0000000..8091cf3 --- /dev/null +++ b/llvm/lib/CAS/BuiltinCAS.h @@ -0,0 +1,76 @@ +//===- BuiltinCAS.h ---------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_CAS_BUILTINCAS_H +#define LLVM_LIB_CAS_BUILTINCAS_H + +#include "llvm/ADT/StringRef.h" +#include "llvm/CAS/BuiltinCASContext.h" +#include "llvm/CAS/ObjectStore.h" + +namespace llvm::cas { +class ActionCache; +namespace builtin { + +class BuiltinCAS : public ObjectStore { +public: + BuiltinCAS() : ObjectStore(BuiltinCASContext::getDefaultContext()) {} + + Expected<CASID> parseID(StringRef Reference) final; + + Expected<ObjectRef> store(ArrayRef<ObjectRef> Refs, + ArrayRef<char> Data) final; + virtual Expected<ObjectRef> storeImpl(ArrayRef<uint8_t> ComputedHash, + ArrayRef<ObjectRef> Refs, + ArrayRef<char> Data) = 0; + + virtual Expected<ObjectRef> + storeFromNullTerminatedRegion(ArrayRef<uint8_t> ComputedHash, + sys::fs::mapped_file_region Map) { + return storeImpl(ComputedHash, std::nullopt, + ArrayRef(Map.data(), Map.size())); + } + + /// Both builtin CAS implementations provide lifetime for free, so this can + /// be const, and readData() and getDataSize() can be implemented on top of + /// it. + virtual ArrayRef<char> getDataConst(ObjectHandle Node) const = 0; + + ArrayRef<char> getData(ObjectHandle Node, + bool RequiresNullTerminator) const final { + // BuiltinCAS Objects are always null terminated. + return getDataConst(Node); + } + uint64_t getDataSize(ObjectHandle Node) const final { + return getDataConst(Node).size(); + } + + Error createUnknownObjectError(const CASID &ID) const { + return createStringError(std::make_error_code(std::errc::invalid_argument), + "unknown object '" + ID.toString() + "'"); + } + + Error createCorruptObjectError(const CASID &ID) const { + return createStringError(std::make_error_code(std::errc::invalid_argument), + "corrupt object '" + ID.toString() + "'"); + } + + Error createCorruptStorageError() const { + return createStringError(std::make_error_code(std::errc::invalid_argument), + "corrupt storage"); + } + + Error validate(const CASID &ID) final; +}; + +constexpr StringLiteral DefaultDir = "llvm.cas.builtin.default"; + +} // end namespace builtin +} // end namespace llvm::cas + +#endif // LLVM_LIB_CAS_BUILTINCAS_H |