@@ -105,17 +105,23 @@ swift::createCompileJobCacheKeyForOutput(llvm::cas::ObjectStore &CAS,
105105 return CAS.storeFromString ({BaseKey}, OS.str ());
106106}
107107
108+ static llvm::Error validateCacheKeyNode (llvm::cas::ObjectProxy Proxy) {
109+ if (Proxy.getData ().size () != sizeof (uint32_t ))
110+ return llvm::createStringError (" incorrect size for cache key node" );
111+ if (Proxy.getNumReferences () != 1 )
112+ return llvm::createStringError (" incorrect child number for cache key node" );
113+
114+ return llvm::Error::success ();
115+ }
116+
108117llvm::Error swift::printCompileJobCacheKey (llvm::cas::ObjectStore &CAS,
109118 llvm::cas::ObjectRef Key,
110119 llvm::raw_ostream &OS) {
111120 auto Proxy = CAS.getProxy (Key);
112121 if (!Proxy)
113122 return Proxy.takeError ();
114-
115- if (Proxy->getData ().size () != sizeof (uint32_t ))
116- return llvm::createStringError (" incorrect size for cache key node" );
117- if (Proxy->getNumReferences () != 1 )
118- return llvm::createStringError (" incorrect child number for cache key node" );
123+ if (auto Err = validateCacheKeyNode (*Proxy))
124+ return Err;
119125
120126 uint32_t InputIndex = llvm::support::endian::read<uint32_t >(
121127 Proxy->getData ().data (), llvm::endianness::little);
@@ -153,3 +159,41 @@ llvm::Error swift::printCompileJobCacheKey(llvm::cas::ObjectStore &CAS,
153159
154160 return llvm::Error::success ();
155161}
162+
163+ llvm::Error
164+ swift::iterateCommandLine (llvm::cas::ObjectStore &CAS, llvm::cas::ObjectRef Key,
165+ std::function<llvm::Error(StringRef)> Callback) {
166+ auto Proxy = CAS.getProxy (Key);
167+ if (!Proxy)
168+ return Proxy.takeError ();
169+
170+ if (auto Err = validateCacheKeyNode (*Proxy))
171+ return Err;
172+
173+ auto Base = Proxy->getReference (0 );
174+ llvm::cas::TreeSchema Schema (CAS);
175+ auto Tree = Schema.load (Base);
176+ if (!Tree)
177+ return Tree.takeError ();
178+
179+ std::string BaseStr;
180+ llvm::raw_string_ostream BaseOS (BaseStr);
181+ return Tree->forEachEntry (
182+ [&](const llvm::cas::NamedTreeEntry &Entry) -> llvm::Error {
183+ auto Ref = Entry.getRef ();
184+ auto DataProxy = CAS.getProxy (Ref);
185+ if (!DataProxy)
186+ return DataProxy.takeError ();
187+
188+ if (Entry.getName () != " command-line" )
189+ return llvm::Error::success ();
190+
191+ StringRef Line, Remain = DataProxy->getData ();
192+ while (!Remain.empty ()) {
193+ std::tie (Line, Remain) = Remain.split (0 );
194+ if (auto Err = Callback (Line))
195+ return Err;
196+ }
197+ return llvm::Error::success ();
198+ });
199+ }
0 commit comments