1111// ===----------------------------------------------------------------------===//
1212
1313#include " llvm-c/CAS/PluginAPI_functions.h"
14- #include " llvm/CAS/BuiltinCASContext.h"
1514#include " llvm/CAS/BuiltinObjectHasher.h"
15+ #include " llvm/CAS/CASID.h"
1616#include " llvm/CAS/UnifiedOnDiskCache.h"
1717#include " llvm/Support/CBindingWrapping.h"
1818#include " llvm/Support/Errc.h"
1919#include " llvm/Support/Error.h"
2020#include " llvm/Support/ThreadPool.h"
21+ #include " llvm/Support/SHA1.h"
2122
2223using namespace llvm ;
2324using namespace llvm ::cas;
24- using namespace llvm ::cas::builtin;
2525using namespace llvm ::cas::ondisk;
2626
2727static char *copyNewMallocString (StringRef Str) {
@@ -125,6 +125,54 @@ bool llcas_cas_options_set_option(llcas_cas_options_t c_opts, const char *name,
125125
126126namespace {
127127
128+ using HasherT = SHA1;
129+ using HashType = decltype (HasherT::hash(std::declval<ArrayRef<uint8_t > &>()));
130+
131+ class PluginCASContext : public CASContext {
132+ void printIDImpl (raw_ostream &OS, const CASID &ID) const final {
133+ PluginCASContext::printID (ID.getHash (), OS);
134+ }
135+
136+ public:
137+ static StringRef getHashName () { return " SHA1" ; }
138+ StringRef getHashSchemaIdentifier () const final {
139+ static const std::string ID =
140+ (" llvm.cas.builtin.v2[" + getHashName () + " ]" ).str ();
141+ return ID;
142+ }
143+
144+ PluginCASContext () = default ;
145+
146+ static Expected<HashType> parseID (StringRef Reference) {
147+ if (!Reference.consume_front (" llvmcas://" ))
148+ return createStringError (
149+ std::make_error_code (std::errc::invalid_argument),
150+ " invalid cas-id '" + Reference + " '" );
151+
152+ if (Reference.size () != 2 * sizeof (HashType))
153+ return createStringError (
154+ std::make_error_code (std::errc::invalid_argument),
155+ " wrong size for cas-id hash '" + Reference + " '" );
156+
157+ std::string Binary;
158+ if (!tryGetFromHex (Reference, Binary))
159+ return createStringError (
160+ std::make_error_code (std::errc::invalid_argument),
161+ " invalid hash in cas-id '" + Reference + " '" );
162+
163+ assert (Binary.size () == sizeof (HashType));
164+ HashType Digest;
165+ llvm::copy (Binary, Digest.data ());
166+ return Digest;
167+ }
168+
169+ static void printID (ArrayRef<uint8_t > Digest, raw_ostream &OS) {
170+ SmallString<64 > Hash;
171+ toHex (Digest, /* LowerCase=*/ true , Hash);
172+ OS << " llvmcas://" << Hash;
173+ }
174+ };
175+
128176struct CASWrapper {
129177 std::string FirstPrefix;
130178 std::string SecondPrefix;
@@ -308,15 +356,15 @@ llcas_cas_t llcas_cas_create(llcas_cas_options_t c_opts, char **error) {
308356 auto &Opts = *unwrap (c_opts);
309357 Expected<std::unique_ptr<UnifiedOnDiskCache>> DB = UnifiedOnDiskCache::open (
310358 Opts.OnDiskPath , /* SizeLimit=*/ std::nullopt ,
311- BuiltinCASContext ::getHashName (), sizeof (HashType));
359+ PluginCASContext ::getHashName (), sizeof (HashType));
312360 if (!DB)
313361 return reportError<llcas_cas_t >(DB.takeError (), error);
314362
315363 std::unique_ptr<UnifiedOnDiskCache> UpstreamDB;
316364 if (!Opts.UpstreamPath .empty ()) {
317365 if (Error E = UnifiedOnDiskCache::open (
318366 Opts.UpstreamPath , /* SizeLimit=*/ std::nullopt ,
319- BuiltinCASContext ::getHashName (), sizeof (HashType))
367+ PluginCASContext ::getHashName (), sizeof (HashType))
320368 .moveInto (UpstreamDB))
321369 return reportError<llcas_cas_t >(std::move (E), error);
322370 }
@@ -380,7 +428,7 @@ unsigned llcas_digest_parse(llcas_cas_t c_cas, const char *printed_digest,
380428 assert (Consumed);
381429 (void )Consumed;
382430
383- Expected<HashType> Digest = BuiltinCASContext ::parseID (PrintedDigest);
431+ Expected<HashType> Digest = PluginCASContext ::parseID (PrintedDigest);
384432 if (!Digest)
385433 return reportError (Digest.takeError (), error, 0 );
386434 std::uninitialized_copy (Digest->begin (), Digest->end (), bytes);
@@ -394,7 +442,7 @@ bool llcas_digest_print(llcas_cas_t c_cas, llcas_digest_t c_digest,
394442 raw_svector_ostream OS (PrintDigest);
395443 // Include these for testing purposes.
396444 OS << Wrapper.FirstPrefix << Wrapper.SecondPrefix ;
397- BuiltinCASContext ::printID (ArrayRef (c_digest.data , c_digest.size ), OS);
445+ PluginCASContext ::printID (ArrayRef (c_digest.data , c_digest.size ), OS);
398446 *printed_id = copyNewMallocString (PrintDigest);
399447 return false ;
400448}
0 commit comments