139 lines · c
1//===- AssertMacros.h - Macro aliases for ease-of-use -----------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// Provides macros to be used in unit tests for OMPT events.11///12//===----------------------------------------------------------------------===//13 14#ifndef OPENMP_TOOLS_OMPTEST_INCLUDE_ASSERTMACROS_H15#define OPENMP_TOOLS_OMPTEST_INCLUDE_ASSERTMACROS_H16 17#define OMPTEST_EXCLUDED_EVENT omptest::ObserveState::Never18#define OMPTEST_REQUIRED_EVENT omptest::ObserveState::Always19 20/// ASSERT MACROS TO BE USED BY THE USER21 22#define OMPT_GENERATE_EVENTS(NumberOfCopies, EventMacro) \23 for (size_t i = 0; i < NumberOfCopies; ++i) { \24 EventMacro \25 }26 27// Handle a minimum unordered set of events28// Required events29#define OMPT_ASSERT_SET_EVENT(Name, Group, EventTy, ...) \30 SetAsserter->insert(OmptAssertEvent::EventTy( \31 Name, Group, OMPTEST_REQUIRED_EVENT, __VA_ARGS__));32#define OMPT_ASSERT_SET(EventTy, ...) \33 OMPT_ASSERT_SET_EVENT("", "", EventTy, __VA_ARGS__)34#define OMPT_ASSERT_SET_GROUPED(Group, EventTy, ...) \35 OMPT_ASSERT_SET_EVENT("", Group, EventTy, __VA_ARGS__)36#define OMPT_ASSERT_SET_NAMED(Name, EventTy, ...) \37 OMPT_ASSERT_SET_EVENT(Name, "", EventTy, __VA_ARGS__)38// Excluded ("NOT") events39#define OMPT_ASSERT_SET_EVENT_NOT(Name, Group, EventTy, ...) \40 SetAsserter->insert(OmptAssertEvent::EventTy( \41 Name, Group, OMPTEST_EXCLUDED_EVENT, __VA_ARGS__));42#define OMPT_ASSERT_SET_NOT(EventTy, ...) \43 OMPT_ASSERT_SET_EVENT_NOT("", "", EventTy, __VA_ARGS__)44#define OMPT_ASSERT_SET_GROUPED_NOT(Group, EventTy, ...) \45 OMPT_ASSERT_SET_EVENT_NOT("", Group, EventTy, __VA_ARGS__)46#define OMPT_ASSERT_SET_NAMED_NOT(Name, EventTy, ...) \47 OMPT_ASSERT_SET_EVENT_NOT(Name, "", EventTy, __VA_ARGS__)48 49// Handle an exact sequence of events50// Required events51#define OMPT_ASSERT_SEQUENCE_EVENT(Name, Group, EventTy, ...) \52 SequenceAsserter->insert(OmptAssertEvent::EventTy( \53 Name, Group, OMPTEST_REQUIRED_EVENT, __VA_ARGS__));54#define OMPT_ASSERT_SEQUENCE(EventTy, ...) \55 OMPT_ASSERT_SEQUENCE_EVENT("", "", EventTy, __VA_ARGS__)56#define OMPT_ASSERT_SEQUENCE_GROUPED(Group, EventTy, ...) \57 OMPT_ASSERT_SEQUENCE_EVENT("", Group, EventTy, __VA_ARGS__)58#define OMPT_ASSERT_SEQUENCE_NAMED(Name, EventTy, ...) \59 OMPT_ASSERT_SEQUENCE_EVENT(Name, "", EventTy, __VA_ARGS__)60// Excluded ("NOT") events61#define OMPT_ASSERT_SEQUENCE_EVENT_NOT(Name, Group, EventTy, ...) \62 SequenceAsserter->insert(OmptAssertEvent::EventTy( \63 Name, Group, OMPTEST_EXCLUDED_EVENT, __VA_ARGS__));64#define OMPT_ASSERT_SEQUENCE_NOT(EventTy, ...) \65 OMPT_ASSERT_SEQUENCE_EVENT_NOT("", "", EventTy, __VA_ARGS__)66#define OMPT_ASSERT_SEQUENCE_GROUPED_NOT(Group, EventTy, ...) \67 OMPT_ASSERT_SEQUENCE_EVENT_NOT("", Group, EventTy, __VA_ARGS__)68#define OMPT_ASSERT_SEQUENCE_NAMED_NOT(Name, EventTy, ...) \69 OMPT_ASSERT_SEQUENCE_EVENT_NOT(Name, "", EventTy, __VA_ARGS__)70// Special command: suspend active assertion71// The created event is not correlated to any observed event72#define OMPT_ASSERT_SEQUENCE_SUSPEND() \73 SequenceAsserter->insert( \74 OmptAssertEvent::AssertionSuspend("", "", OMPTEST_EXCLUDED_EVENT));75#define OMPT_ASSERT_SEQUENCE_ONLY(EventTy, ...) \76 OMPT_ASSERT_SEQUENCE_SUSPEND() \77 OMPT_ASSERT_SEQUENCE_EVENT("", "", EventTy, __VA_ARGS__) \78 OMPT_ASSERT_SEQUENCE_SUSPEND()79#define OMPT_ASSERT_SEQUENCE_GROUPED_ONLY(Group, EventTy, ...) \80 OMPT_ASSERT_SEQUENCE_SUSPEND() \81 OMPT_ASSERT_SEQUENCE_EVENT("", Group, EventTy, __VA_ARGS__) \82 OMPT_ASSERT_SEQUENCE_SUSPEND()83#define OMPT_ASSERT_SEQUENCE_NAMED_ONLY(Name, EventTy, ...) \84 OMPT_ASSERT_SEQUENCE_SUSPEND() \85 OMPT_ASSERT_SEQUENCE_EVENT(Name, "", EventTy, __VA_ARGS__) \86 OMPT_ASSERT_SEQUENCE_SUSPEND()87 88#define OMPT_ASSERTER_MODE_STRICT(Asserter) \89 Asserter->setOperationMode(AssertMode::Strict);90#define OMPT_ASSERTER_MODE_RELAXED(Asserter) \91 Asserter->setOperationMode(AssertMode::Relaxed);92#define OMPT_ASSERT_SEQUENCE_MODE_STRICT() \93 OMPT_ASSERTER_MODE_STRICT(SequenceAsserter)94#define OMPT_ASSERT_SEQUENCE_MODE_RELAXED() \95 OMPT_ASSERTER_MODE_RELAXED(SequenceAsserter)96#define OMPT_ASSERT_SET_MODE_STRICT() OMPT_ASSERTER_MODE_STRICT(SetAsserter)97#define OMPT_ASSERT_SET_MODE_RELAXED() OMPT_ASSERTER_MODE_RELAXED(SetAsserter)98 99// Enable / disable asserters entirely100#define OMPT_ASSERTER_DISABLE(Asserter) Asserter->setActive(false);101#define OMPT_ASSERTER_ENABLE(Asserter) Asserter->setActive(true);102#define OMPT_ASSERT_SET_DISABLE() OMPT_ASSERTER_DISABLE(SetAsserter)103#define OMPT_ASSERT_SET_ENABLE() OMPT_ASSERTER_ENABLE(SetAsserter)104#define OMPT_ASSERT_SEQUENCE_DISABLE() OMPT_ASSERTER_DISABLE(SequenceAsserter)105#define OMPT_ASSERT_SEQUENCE_ENABLE() OMPT_ASSERTER_ENABLE(SequenceAsserter)106#define OMPT_REPORT_EVENT_DISABLE() OMPT_ASSERTER_DISABLE(EventReporter)107#define OMPT_REPORT_EVENT_ENABLE() OMPT_ASSERTER_ENABLE(EventReporter)108 109// Enable / disable certain event types for asserters110#define OMPT_ASSERTER_PERMIT_EVENT(Asserter, EventTy) \111 Asserter->permitEvent(EventTy);112#define OMPT_ASSERTER_SUPPRESS_EVENT(Asserter, EventTy) \113 Asserter->suppressEvent(EventTy);114#define OMPT_PERMIT_EVENT(EventTy) \115 OMPT_ASSERTER_PERMIT_EVENT(SetAsserter, EventTy); \116 OMPT_ASSERTER_PERMIT_EVENT(EventReporter, EventTy); \117 OMPT_ASSERTER_PERMIT_EVENT(SequenceAsserter, EventTy);118#define OMPT_SUPPRESS_EVENT(EventTy) \119 OMPT_ASSERTER_SUPPRESS_EVENT(SetAsserter, EventTy); \120 OMPT_ASSERTER_SUPPRESS_EVENT(EventReporter, EventTy); \121 OMPT_ASSERTER_SUPPRESS_EVENT(SequenceAsserter, EventTy);122 123// Set logging level for asserters124// Note: Logger is a singleton, hence this will affect all asserter instances125#define OMPT_ASSERTER_LOG_LEVEL(Asserter, LogLevel) \126 Asserter->getLog()->setLoggingLevel(LogLevel);127 128// Set log formatting (esp. coloring) for asserters129// Note: Logger is a singleton, hence this will affect all asserter instances130#define OMPT_ASSERTER_LOG_FORMATTED(Asserter, FormatLog) \131 Asserter->getLog()->setFormatOutput(FormatLog);132 133// SyncPoint handling134#define OMPT_ASSERT_SYNC_POINT(SyncPointName) \135 flush_traced_devices(); \136 OmptCallbackHandler::get().handleAssertionSyncPoint(SyncPointName);137 138#endif139