blob: 84f060fafcc7f1120467974caf57625ea14f1bcb [file] [log] [blame]
// Copyright 2023 The Centipede Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Abstraction of metadata collected from executions that does not
// contribute to coverage but can be useful in mutation.
//
// This library is for both engine and runner.
#ifndef THIRD_PARTY_CENTIPEDE_EXECUTION_METADATA_H_
#define THIRD_PARTY_CENTIPEDE_EXECUTION_METADATA_H_
#include <functional>
#include "./centipede/defs.h"
#include "./centipede/shared_memory_blob_sequence.h"
namespace centipede {
struct ExecutionMetadata {
// Appends a CMP entry comparing `a` and `b` to the metadata. Returns false if
// the entry cannot be appended. Return true otherwise.
bool AppendCmpEntry(ByteSpan a, ByteSpan b);
// Enumerates through all CMP entries in the metadata by calling
// `callback` on each of them. Returns false if there are invalid
// entries. Returns true otherwise.
bool ForEachCmpEntry(std::function<void(ByteSpan, ByteSpan)> callback) const;
// Writes the contents to `outputs_blobseq` with header `tag`. Returns true
// iff successful.
bool Write(Blob::SizeAndTagT tag, BlobSequence &outputs_blobseq) const;
// Reads the contents from `blob`.
//
// Note that the method does not check the blob tag, it should be checked by
// the method users.
void Read(Blob blob);
// CMP entries are stored in one large ByteArray to minimize RAM consumption.
// One CMP arg pair is stored as
// * `size` (1-byte value)
// * `value0` (`size` bytes)
// * `value1` (`size` bytes)
ByteArray cmp_data;
};
} // namespace centipede
#endif // THIRD_PARTY_CENTIPEDE_EXECUTION_METADATA_H_