diff --git a/include/revng/PipelineC/Prototypes.h b/include/revng/PipelineC/Prototypes.h index 4230c2c5b..f2c3d4eb2 100644 --- a/include/revng/PipelineC/Prototypes.h +++ b/include/revng/PipelineC/Prototypes.h @@ -364,7 +364,8 @@ bool rp_manager_container_deserialize(rp_manager *manager, rp_step *step, const char *container_name, const char *content, - uint64_t size); + uint64_t size, + rp_invalidations *invalidations); LENGTH_HINT(rp_manager_container_deserialize, 3, 4) /** diff --git a/include/revng/Pipes/PipelineManager.h b/include/revng/Pipes/PipelineManager.h index 80023eb1c..573fea5c3 100644 --- a/include/revng/Pipes/PipelineManager.h +++ b/include/revng/Pipes/PipelineManager.h @@ -105,9 +105,10 @@ public: const pipeline::Step::AnalysisValueType & getAnalysis(const pipeline::AnalysisReference &Reference) const; - llvm::Error deserializeContainer(pipeline::Step &Step, - llvm::StringRef ContainerName, - const llvm::MemoryBuffer &Buffer); + llvm::Expected + deserializeContainer(pipeline::Step &Step, + llvm::StringRef ContainerName, + const llvm::MemoryBuffer &Buffer); const pipeline::Context &context() const { return *PipelineContext; } diff --git a/lib/PipelineC/PipelineC.cpp b/lib/PipelineC/PipelineC.cpp index a2011aef3..65eca4ae0 100644 --- a/lib/PipelineC/PipelineC.cpp +++ b/lib/PipelineC/PipelineC.cpp @@ -387,20 +387,25 @@ static bool _rp_manager_container_deserialize(rp_manager *manager, rp_step *step, const char *container_name, const char *content, - uint64_t size) { + uint64_t size, + rp_invalidations *invalidations) { revng_check(manager != nullptr); revng_check(step != nullptr); revng_check(container_name != nullptr); revng_check(content != nullptr); - auto Buffer = llvm::MemoryBuffer::getMemBuffer(llvm::StringRef(content, size), - "", - false); - auto Error = manager->deserializeContainer(*step, container_name, *Buffer); - if (!!Error) { - llvm::consumeError(std::move(Error)); + llvm::StringRef String(content, size); + auto Buffer = llvm::MemoryBuffer::getMemBuffer(String, "", false); + auto MaybeInvalidations = manager->deserializeContainer(*step, + container_name, + *Buffer); + if (not MaybeInvalidations) { + llvm::consumeError(MaybeInvalidations.takeError()); return false; } + + ExistingOrNew Invalidations(invalidations); + *Invalidations = MaybeInvalidations.get(); return true; } diff --git a/lib/Pipes/PipelineManager.cpp b/lib/Pipes/PipelineManager.cpp index ca230a2c1..c57e57c90 100644 --- a/lib/Pipes/PipelineManager.cpp +++ b/lib/Pipes/PipelineManager.cpp @@ -272,7 +272,7 @@ llvm::Error PipelineManager::storeStepToDisk(llvm::StringRef StepName) { return StorageClient->commit(); } -llvm::Error +llvm::Expected PipelineManager::deserializeContainer(pipeline::Step &Step, llvm::StringRef ContainerName, const llvm::MemoryBuffer &Buffer) { @@ -286,12 +286,14 @@ PipelineManager::deserializeContainer(pipeline::Step &Step, if (auto Error = Container.deserialize(Buffer); !!Error) return Error; - recalculateAllPossibleTargets(); + auto MaybeInvalidations = invalidateAllPossibleTargets(); + if (not MaybeInvalidations) + return MaybeInvalidations.takeError(); if (auto Error = storeStepToDisk(Step.getName()); !!Error) return Error; - return Error::success(); + return MaybeInvalidations.get(); } llvm::Error PipelineManager::store(const PipelineFileMapping &Mapping) { diff --git a/python/revng/api/manager.py b/python/revng/api/manager.py index 047215779..e50db38af 100644 --- a/python/revng/api/manager.py +++ b/python/revng/api/manager.py @@ -339,12 +339,18 @@ class Manager: _out = _api.rp_manager_create_global_copy(self._manager, _name) return make_python_string(_out) - def set_input(self, container_name: str, content: bytes, _key=None): + def set_input(self, container_name: str, content: bytes, _key=None) -> Invalidations: step_ptr = self._get_step_ptr("begin") _content = ffi.from_buffer(content) + invalidations = Invalidations() success = _api.rp_manager_container_deserialize( - self._manager, step_ptr, make_c_string(container_name), _content, len(_content) + self._manager, + step_ptr, + make_c_string(container_name), + _content, + len(_content), + invalidations._invalidations, ) if not success: @@ -352,6 +358,8 @@ class Manager: f"Failed loading user provided input for container {container_name}" ) + return invalidations + def get_pipeline_description(self): return self._description_str