blob: 4e99ebdf98ad1bcd863628dcb1dcd2725fd37b8f [file] [log] [blame] [edit]
//===- AssertMacros.h - Macro aliases for ease-of-use -----------*- 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
/// Provides macros to be used in unit tests for OMPT events.
///
//===----------------------------------------------------------------------===//
#ifndef OPENMP_TOOLS_OMPTEST_INCLUDE_ASSERTMACROS_H
#define OPENMP_TOOLS_OMPTEST_INCLUDE_ASSERTMACROS_H
#define OMPTEST_EXCLUDED_EVENT omptest::ObserveState::Never
#define OMPTEST_REQUIRED_EVENT omptest::ObserveState::Always
/// ASSERT MACROS TO BE USED BY THE USER
#define OMPT_GENERATE_EVENTS(NumberOfCopies, EventMacro) \
for (size_t i = 0; i < NumberOfCopies; ++i) { \
EventMacro \
}
// Handle a minimum unordered set of events
// Required events
#define OMPT_ASSERT_SET_EVENT(Name, Group, EventTy, ...) \
SetAsserter->insert(OmptAssertEvent::EventTy( \
Name, Group, OMPTEST_REQUIRED_EVENT, __VA_ARGS__));
#define OMPT_ASSERT_SET(EventTy, ...) \
OMPT_ASSERT_SET_EVENT("", "", EventTy, __VA_ARGS__)
#define OMPT_ASSERT_SET_GROUPED(Group, EventTy, ...) \
OMPT_ASSERT_SET_EVENT("", Group, EventTy, __VA_ARGS__)
#define OMPT_ASSERT_SET_NAMED(Name, EventTy, ...) \
OMPT_ASSERT_SET_EVENT(Name, "", EventTy, __VA_ARGS__)
// Excluded ("NOT") events
#define OMPT_ASSERT_SET_EVENT_NOT(Name, Group, EventTy, ...) \
SetAsserter->insert(OmptAssertEvent::EventTy( \
Name, Group, OMPTEST_EXCLUDED_EVENT, __VA_ARGS__));
#define OMPT_ASSERT_SET_NOT(EventTy, ...) \
OMPT_ASSERT_SET_EVENT_NOT("", "", EventTy, __VA_ARGS__)
#define OMPT_ASSERT_SET_GROUPED_NOT(Group, EventTy, ...) \
OMPT_ASSERT_SET_EVENT_NOT("", Group, EventTy, __VA_ARGS__)
#define OMPT_ASSERT_SET_NAMED_NOT(Name, EventTy, ...) \
OMPT_ASSERT_SET_EVENT_NOT(Name, "", EventTy, __VA_ARGS__)
// Handle an exact sequence of events
// Required events
#define OMPT_ASSERT_SEQUENCE_EVENT(Name, Group, EventTy, ...) \
SequenceAsserter->insert(OmptAssertEvent::EventTy( \
Name, Group, OMPTEST_REQUIRED_EVENT, __VA_ARGS__));
#define OMPT_ASSERT_SEQUENCE(EventTy, ...) \
OMPT_ASSERT_SEQUENCE_EVENT("", "", EventTy, __VA_ARGS__)
#define OMPT_ASSERT_SEQUENCE_GROUPED(Group, EventTy, ...) \
OMPT_ASSERT_SEQUENCE_EVENT("", Group, EventTy, __VA_ARGS__)
#define OMPT_ASSERT_SEQUENCE_NAMED(Name, EventTy, ...) \
OMPT_ASSERT_SEQUENCE_EVENT(Name, "", EventTy, __VA_ARGS__)
// Excluded ("NOT") events
#define OMPT_ASSERT_SEQUENCE_EVENT_NOT(Name, Group, EventTy, ...) \
SequenceAsserter->insert(OmptAssertEvent::EventTy( \
Name, Group, OMPTEST_EXCLUDED_EVENT, __VA_ARGS__));
#define OMPT_ASSERT_SEQUENCE_NOT(EventTy, ...) \
OMPT_ASSERT_SEQUENCE_EVENT_NOT("", "", EventTy, __VA_ARGS__)
#define OMPT_ASSERT_SEQUENCE_GROUPED_NOT(Group, EventTy, ...) \
OMPT_ASSERT_SEQUENCE_EVENT_NOT("", Group, EventTy, __VA_ARGS__)
#define OMPT_ASSERT_SEQUENCE_NAMED_NOT(Name, EventTy, ...) \
OMPT_ASSERT_SEQUENCE_EVENT_NOT(Name, "", EventTy, __VA_ARGS__)
// Special command: suspend active assertion
// The created event is not correlated to any observed event
#define OMPT_ASSERT_SEQUENCE_SUSPEND() \
SequenceAsserter->insert( \
OmptAssertEvent::AssertionSuspend("", "", OMPTEST_EXCLUDED_EVENT));
#define OMPT_ASSERT_SEQUENCE_ONLY(EventTy, ...) \
OMPT_ASSERT_SEQUENCE_SUSPEND() \
OMPT_ASSERT_SEQUENCE_EVENT("", "", EventTy, __VA_ARGS__) \
OMPT_ASSERT_SEQUENCE_SUSPEND()
#define OMPT_ASSERT_SEQUENCE_GROUPED_ONLY(Group, EventTy, ...) \
OMPT_ASSERT_SEQUENCE_SUSPEND() \
OMPT_ASSERT_SEQUENCE_EVENT("", Group, EventTy, __VA_ARGS__) \
OMPT_ASSERT_SEQUENCE_SUSPEND()
#define OMPT_ASSERT_SEQUENCE_NAMED_ONLY(Name, EventTy, ...) \
OMPT_ASSERT_SEQUENCE_SUSPEND() \
OMPT_ASSERT_SEQUENCE_EVENT(Name, "", EventTy, __VA_ARGS__) \
OMPT_ASSERT_SEQUENCE_SUSPEND()
#define OMPT_ASSERTER_MODE_STRICT(Asserter) \
Asserter->setOperationMode(AssertMode::Strict);
#define OMPT_ASSERTER_MODE_RELAXED(Asserter) \
Asserter->setOperationMode(AssertMode::Relaxed);
#define OMPT_ASSERT_SEQUENCE_MODE_STRICT() \
OMPT_ASSERTER_MODE_STRICT(SequenceAsserter)
#define OMPT_ASSERT_SEQUENCE_MODE_RELAXED() \
OMPT_ASSERTER_MODE_RELAXED(SequenceAsserter)
#define OMPT_ASSERT_SET_MODE_STRICT() OMPT_ASSERTER_MODE_STRICT(SetAsserter)
#define OMPT_ASSERT_SET_MODE_RELAXED() OMPT_ASSERTER_MODE_RELAXED(SetAsserter)
// Enable / disable asserters entirely
#define OMPT_ASSERTER_DISABLE(Asserter) Asserter->setActive(false);
#define OMPT_ASSERTER_ENABLE(Asserter) Asserter->setActive(true);
#define OMPT_ASSERT_SET_DISABLE() OMPT_ASSERTER_DISABLE(SetAsserter)
#define OMPT_ASSERT_SET_ENABLE() OMPT_ASSERTER_ENABLE(SetAsserter)
#define OMPT_ASSERT_SEQUENCE_DISABLE() OMPT_ASSERTER_DISABLE(SequenceAsserter)
#define OMPT_ASSERT_SEQUENCE_ENABLE() OMPT_ASSERTER_ENABLE(SequenceAsserter)
#define OMPT_REPORT_EVENT_DISABLE() OMPT_ASSERTER_DISABLE(EventReporter)
#define OMPT_REPORT_EVENT_ENABLE() OMPT_ASSERTER_ENABLE(EventReporter)
// Enable / disable certain event types for asserters
#define OMPT_ASSERTER_PERMIT_EVENT(Asserter, EventTy) \
Asserter->permitEvent(EventTy);
#define OMPT_ASSERTER_SUPPRESS_EVENT(Asserter, EventTy) \
Asserter->suppressEvent(EventTy);
#define OMPT_PERMIT_EVENT(EventTy) \
OMPT_ASSERTER_PERMIT_EVENT(SetAsserter, EventTy); \
OMPT_ASSERTER_PERMIT_EVENT(EventReporter, EventTy); \
OMPT_ASSERTER_PERMIT_EVENT(SequenceAsserter, EventTy);
#define OMPT_SUPPRESS_EVENT(EventTy) \
OMPT_ASSERTER_SUPPRESS_EVENT(SetAsserter, EventTy); \
OMPT_ASSERTER_SUPPRESS_EVENT(EventReporter, EventTy); \
OMPT_ASSERTER_SUPPRESS_EVENT(SequenceAsserter, EventTy);
// Set logging level for asserters
// Note: Logger is a singleton, hence this will affect all asserter instances
#define OMPT_ASSERTER_LOG_LEVEL(Asserter, LogLevel) \
Asserter->getLog()->setLoggingLevel(LogLevel);
// Set log formatting (esp. coloring) for asserters
// Note: Logger is a singleton, hence this will affect all asserter instances
#define OMPT_ASSERTER_LOG_FORMATTED(Asserter, FormatLog) \
Asserter->getLog()->setFormatOutput(FormatLog);
// SyncPoint handling
#define OMPT_ASSERT_SYNC_POINT(SyncPointName) \
flush_traced_devices(); \
OmptCallbackHandler::get().handleAssertionSyncPoint(SyncPointName);
#endif