blob: 3165e2837d22e00c893785f17db1389fc228a480 [file] [log] [blame] [edit]
//===- OmptAssertEvent.h - Assertion event declarations ---------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Contains assertion event constructors, for generally all observable events.
/// This includes user-generated events, like synchronization.
///
//===----------------------------------------------------------------------===//
#ifndef OPENMP_TOOLS_OMPTEST_INCLUDE_OMPTASSERTEVENT_H
#define OPENMP_TOOLS_OMPTEST_INCLUDE_OMPTASSERTEVENT_H
#include "InternalEvent.h"
#include "omp-tools.h"
#include <cassert>
#include <limits>
#include <memory>
#include <string>
namespace omptest {
enum class ObserveState { Generated, Always, Never };
/// Helper function, returning an ObserveState string representation
const char *to_string(ObserveState State);
/// Assertion event struct, provides statically callable CTORs.
struct OmptAssertEvent {
static OmptAssertEvent AssertionSyncPoint(const std::string &Name,
const std::string &Group,
const ObserveState &Expected,
const std::string &SyncPointName);
static OmptAssertEvent AssertionSuspend(const std::string &Name,
const std::string &Group,
const ObserveState &Expected);
static OmptAssertEvent ThreadBegin(const std::string &Name,
const std::string &Group,
const ObserveState &Expected,
ompt_thread_t ThreadType);
static OmptAssertEvent ThreadEnd(const std::string &Name,
const std::string &Group,
const ObserveState &Expected);
static OmptAssertEvent ParallelBegin(const std::string &Name,
const std::string &Group,
const ObserveState &Expected,
int NumThreads);
static OmptAssertEvent ParallelEnd(
const std::string &Name, const std::string &Group,
const ObserveState &Expected,
ompt_data_t *ParallelData = expectedDefault(ompt_data_t *),
ompt_data_t *EncounteringTaskData = expectedDefault(ompt_data_t *),
int Flags = expectedDefault(int),
const void *CodeptrRA = expectedDefault(const void *));
static OmptAssertEvent
Work(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_work_t WorkType,
ompt_scope_endpoint_t Endpoint,
ompt_data_t *ParallelData = expectedDefault(ompt_data_t *),
ompt_data_t *TaskData = expectedDefault(ompt_data_t *),
uint64_t Count = expectedDefault(uint64_t),
const void *CodeptrRA = expectedDefault(const void *));
static OmptAssertEvent
Dispatch(const std::string &Name, const std::string &Group,
const ObserveState &Expected,
ompt_data_t *ParallelData = expectedDefault(ompt_data_t *),
ompt_data_t *TaskData = expectedDefault(ompt_data_t *),
ompt_dispatch_t Kind = expectedDefault(ompt_dispatch_t),
ompt_data_t Instance = expectedDefault(ompt_data_t));
static OmptAssertEvent
TaskCreate(const std::string &Name, const std::string &Group,
const ObserveState &Expected,
ompt_data_t *EncounteringTaskData = expectedDefault(ompt_data_t *),
const ompt_frame_t *EncounteringTaskFrame =
expectedDefault(ompt_frame_t *),
ompt_data_t *NewTaskData = expectedDefault(ompt_data_t *),
int Flags = expectedDefault(int),
int HasDependences = expectedDefault(int),
const void *CodeptrRA = expectedDefault(const void *));
static OmptAssertEvent TaskSchedule(const std::string &Name,
const std::string &Group,
const ObserveState &Expected);
static OmptAssertEvent
ImplicitTask(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_scope_endpoint_t Endpoint,
ompt_data_t *ParallelData = expectedDefault(ompt_data_t *),
ompt_data_t *TaskData = expectedDefault(ompt_data_t *),
unsigned int ActualParallelism = expectedDefault(unsigned int),
unsigned int Index = expectedDefault(unsigned int),
int Flags = expectedDefault(int));
static OmptAssertEvent
SyncRegion(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_sync_region_t Kind,
ompt_scope_endpoint_t Endpoint,
ompt_data_t *ParallelData = expectedDefault(ompt_data_t *),
ompt_data_t *TaskData = expectedDefault(ompt_data_t *),
const void *CodeptrRA = expectedDefault(const void *));
static OmptAssertEvent
Target(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_target_t Kind,
ompt_scope_endpoint_t Endpoint, int DeviceNum = expectedDefault(int),
ompt_data_t *TaskData = expectedDefault(ompt_data_t *),
ompt_id_t TargetId = expectedDefault(ompt_id_t),
const void *CodeptrRA = expectedDefault(void *));
static OmptAssertEvent
TargetEmi(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_target_t Kind,
ompt_scope_endpoint_t Endpoint,
int DeviceNum = expectedDefault(int),
ompt_data_t *TaskData = expectedDefault(ompt_data_t *),
ompt_data_t *TargetTaskData = expectedDefault(ompt_data_t *),
ompt_data_t *TargetData = expectedDefault(ompt_data_t *),
const void *CodeptrRA = expectedDefault(void *));
static OmptAssertEvent
TargetDataOp(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_id_t TargetId,
ompt_id_t HostOpId, ompt_target_data_op_t OpType, void *SrcAddr,
int SrcDeviceNum, void *DstAddr, int DstDeviceNum, size_t Bytes,
const void *CodeptrRA);
static OmptAssertEvent
TargetDataOp(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_target_data_op_t OpType,
size_t Bytes = expectedDefault(size_t),
void *SrcAddr = expectedDefault(void *),
void *DstAddr = expectedDefault(void *),
int SrcDeviceNum = expectedDefault(int),
int DstDeviceNum = expectedDefault(int),
ompt_id_t TargetId = expectedDefault(ompt_id_t),
ompt_id_t HostOpId = expectedDefault(ompt_id_t),
const void *CodeptrRA = expectedDefault(void *));
static OmptAssertEvent
TargetDataOpEmi(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_scope_endpoint_t Endpoint,
ompt_data_t *TargetTaskData, ompt_data_t *TargetData,
ompt_id_t *HostOpId, ompt_target_data_op_t OpType,
void *SrcAddr, int SrcDeviceNum, void *DstAddr,
int DstDeviceNum, size_t Bytes, const void *CodeptrRA);
static OmptAssertEvent
TargetDataOpEmi(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_target_data_op_t OpType,
ompt_scope_endpoint_t Endpoint,
size_t Bytes = expectedDefault(size_t),
void *SrcAddr = expectedDefault(void *),
void *DstAddr = expectedDefault(void *),
int SrcDeviceNum = expectedDefault(int),
int DstDeviceNum = expectedDefault(int),
ompt_data_t *TargetTaskData = expectedDefault(ompt_data_t *),
ompt_data_t *TargetData = expectedDefault(ompt_data_t *),
ompt_id_t *HostOpId = expectedDefault(ompt_id_t *),
const void *CodeptrRA = expectedDefault(void *));
static OmptAssertEvent TargetSubmit(const std::string &Name,
const std::string &Group,
const ObserveState &Expected,
ompt_id_t TargetId, ompt_id_t HostOpId,
unsigned int RequestedNumTeams);
static OmptAssertEvent
TargetSubmit(const std::string &Name, const std::string &Group,
const ObserveState &Expected, unsigned int RequestedNumTeams,
ompt_id_t TargetId = expectedDefault(ompt_id_t),
ompt_id_t HostOpId = expectedDefault(ompt_id_t));
static OmptAssertEvent
TargetSubmitEmi(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_scope_endpoint_t Endpoint,
ompt_data_t *TargetData, ompt_id_t *HostOpId,
unsigned int RequestedNumTeams);
static OmptAssertEvent
TargetSubmitEmi(const std::string &Name, const std::string &Group,
const ObserveState &Expected, unsigned int RequestedNumTeams,
ompt_scope_endpoint_t Endpoint,
ompt_data_t *TargetData = expectedDefault(ompt_data_t *),
ompt_id_t *HostOpId = expectedDefault(ompt_id_t *));
static OmptAssertEvent ControlTool(const std::string &Name,
const std::string &Group,
const ObserveState &Expected);
static OmptAssertEvent DeviceInitialize(
const std::string &Name, const std::string &Group,
const ObserveState &Expected, int DeviceNum,
const char *Type = expectedDefault(const char *),
ompt_device_t *Device = expectedDefault(ompt_device_t *),
ompt_function_lookup_t LookupFn = expectedDefault(ompt_function_lookup_t),
const char *DocumentationStr = expectedDefault(const char *));
static OmptAssertEvent DeviceFinalize(const std::string &Name,
const std::string &Group,
const ObserveState &Expected,
int DeviceNum);
static OmptAssertEvent
DeviceLoad(const std::string &Name, const std::string &Group,
const ObserveState &Expected, int DeviceNum,
const char *Filename = expectedDefault(const char *),
int64_t OffsetInFile = expectedDefault(int64_t),
void *VmaInFile = expectedDefault(void *),
size_t Bytes = expectedDefault(size_t),
void *HostAddr = expectedDefault(void *),
void *DeviceAddr = expectedDefault(void *),
uint64_t ModuleId = expectedDefault(int64_t));
static OmptAssertEvent DeviceUnload(const std::string &Name,
const std::string &Group,
const ObserveState &Expected);
static OmptAssertEvent BufferRequest(const std::string &Name,
const std::string &Group,
const ObserveState &Expected,
int DeviceNum, ompt_buffer_t **Buffer,
size_t *Bytes);
static OmptAssertEvent
BufferComplete(const std::string &Name, const std::string &Group,
const ObserveState &Expected, int DeviceNum,
ompt_buffer_t *Buffer, size_t Bytes,
ompt_buffer_cursor_t Begin, int BufferOwned);
static OmptAssertEvent BufferRecord(const std::string &Name,
const std::string &Group,
const ObserveState &Expected,
ompt_record_ompt_t *Record);
/// Handle type = ompt_record_target_t
static OmptAssertEvent
BufferRecord(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_callbacks_t Type,
ompt_target_t Kind, ompt_scope_endpoint_t Endpoint,
int DeviceNum = expectedDefault(int),
ompt_id_t TaskId = expectedDefault(ompt_id_t),
ompt_id_t TargetId = expectedDefault(ompt_id_t),
const void *CodeptrRA = expectedDefault(void *));
/// Handle type = ompt_callback_target_data_op
static OmptAssertEvent
BufferRecord(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_callbacks_t Type,
ompt_target_data_op_t OpType, size_t Bytes,
std::pair<ompt_device_time_t, ompt_device_time_t> Timeframe,
void *SrcAddr = expectedDefault(void *),
void *DstAddr = expectedDefault(void *),
int SrcDeviceNum = expectedDefault(int),
int DstDeviceNum = expectedDefault(int),
ompt_id_t TargetId = expectedDefault(ompt_id_t),
ompt_id_t HostOpId = expectedDefault(ompt_id_t),
const void *CodeptrRA = expectedDefault(void *));
/// Handle type = ompt_callback_target_data_op
static OmptAssertEvent BufferRecord(
const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_callbacks_t Type,
ompt_target_data_op_t OpType, size_t Bytes = expectedDefault(size_t),
ompt_device_time_t MinimumTimeDelta = expectedDefault(ompt_device_time_t),
void *SrcAddr = expectedDefault(void *),
void *DstAddr = expectedDefault(void *),
int SrcDeviceNum = expectedDefault(int),
int DstDeviceNum = expectedDefault(int),
ompt_id_t TargetId = expectedDefault(ompt_id_t),
ompt_id_t HostOpId = expectedDefault(ompt_id_t),
const void *CodeptrRA = expectedDefault(void *));
/// Handle type = ompt_callback_target_submit
static OmptAssertEvent
BufferRecord(const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_callbacks_t Type,
std::pair<ompt_device_time_t, ompt_device_time_t> Timeframe,
unsigned int RequestedNumTeams = expectedDefault(unsigned int),
unsigned int GrantedNumTeams = expectedDefault(unsigned int),
ompt_id_t TargetId = expectedDefault(ompt_id_t),
ompt_id_t HostOpId = expectedDefault(ompt_id_t));
/// Handle type = ompt_callback_target_submit
/// Note: This will also act as the simplest default CTOR
static OmptAssertEvent BufferRecord(
const std::string &Name, const std::string &Group,
const ObserveState &Expected, ompt_callbacks_t Type,
ompt_device_time_t MinimumTimeDelta = expectedDefault(ompt_device_time_t),
unsigned int RequestedNumTeams = expectedDefault(unsigned int),
unsigned int GrantedNumTeams = expectedDefault(unsigned int),
ompt_id_t TargetId = expectedDefault(ompt_id_t),
ompt_id_t HostOpId = expectedDefault(ompt_id_t));
static OmptAssertEvent BufferRecordDeallocation(const std::string &Name,
const std::string &Group,
const ObserveState &Expected,
ompt_buffer_t *Buffer);
/// Allow move construction (due to std::unique_ptr)
OmptAssertEvent(OmptAssertEvent &&o) = default;
OmptAssertEvent &operator=(OmptAssertEvent &&o) = default;
/// Get the event's name
std::string getEventName() const;
/// Get the event's group name
std::string getEventGroup() const;
/// Get the event's expected observation state
ObserveState getEventExpectedState() const;
/// Return the actual event type enum value
internal::EventTy getEventType() const;
/// Get a pointer to the internal event
internal::InternalEvent *getEvent() const;
/// Make events comparable
friend bool operator==(const OmptAssertEvent &A, const OmptAssertEvent &B);
/// Returns the string representation of the event
std::string toString(bool PrefixEventName = false) const;
private:
OmptAssertEvent(const std::string &Name, const std::string &Group,
const ObserveState &Expected, internal::InternalEvent *IE);
OmptAssertEvent(const OmptAssertEvent &o) = delete;
/// Determine the event name. Either it is provided directly or determined
/// from the calling function's name.
static std::string getName(const std::string &Name,
const char *Caller = __builtin_FUNCTION()) {
std::string EName = Name;
if (EName.empty())
EName.append(Caller).append(" (auto generated)");
return EName;
}
/// Determine the event name. Either it is provided directly or "default".
static std::string getGroup(const std::string &Group) {
if (Group.empty())
return "default";
return Group;
}
std::string Name;
std::string Group;
ObserveState ExpectedState;
std::unique_ptr<internal::InternalEvent> TheEvent;
};
/// POD type, which holds the target region id, corresponding to an event group.
struct AssertEventGroup {
AssertEventGroup(uint64_t TargetRegion) : TargetRegion(TargetRegion) {}
uint64_t TargetRegion;
};
bool operator==(const OmptAssertEvent &A, const OmptAssertEvent &B);
} // namespace omptest
#endif