@@ -105,17 +105,23 @@ swift::createCompileJobCacheKeyForOutput(llvm::cas::ObjectStore &CAS,
105
105
return CAS.storeFromString ({BaseKey}, OS.str ());
106
106
}
107
107
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
+
108
117
llvm::Error swift::printCompileJobCacheKey (llvm::cas::ObjectStore &CAS,
109
118
llvm::cas::ObjectRef Key,
110
119
llvm::raw_ostream &OS) {
111
120
auto Proxy = CAS.getProxy (Key);
112
121
if (!Proxy)
113
122
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;
119
125
120
126
uint32_t InputIndex = llvm::support::endian::read<uint32_t >(
121
127
Proxy->getData ().data (), llvm::endianness::little);
@@ -153,3 +159,41 @@ llvm::Error swift::printCompileJobCacheKey(llvm::cas::ObjectStore &CAS,
153
159
154
160
return llvm::Error::success ();
155
161
}
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