Implement ScopedPragma
This change adds a ScopedPragma class which sets a pragma state and
reverts it to its old state on destruction.
For now only Boolean pragmas are supported (which in turn only has one
MemorySanitizerInstrumentation option). But since this is meant to
replace rr::Config, the implementation is based around an std::variant<>
to easily support additional settings.
PragmaBooleanOption was renamed to BooleanPragmaOption for easier
reading.
Bug: b/192879676
Change-Id: I63b9553b794b593f1bc3659e89fe3fcf3e266826
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/65248
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/Pragma.cpp b/src/Reactor/Pragma.cpp
index 0df95d7..f8780ff 100644
--- a/src/Reactor/Pragma.cpp
+++ b/src/Reactor/Pragma.cpp
@@ -59,7 +59,7 @@
namespace rr {
-void Pragma(PragmaBooleanOption option, bool enable)
+void Pragma(BooleanPragmaOption option, bool enable)
{
PragmaState &state = ::getPragmaState();
@@ -69,11 +69,11 @@
state.memorySanitizerInstrumentation = enable;
break;
default:
- UNSUPPORTED("Unknown pragma %d", int(option));
+ UNSUPPORTED("Unknown Boolean pragma option %d", int(option));
}
}
-bool getPragmaState(PragmaBooleanOption option)
+bool getPragmaState(BooleanPragmaOption option)
{
PragmaState &state = ::getPragmaState();
@@ -82,9 +82,21 @@
case MemorySanitizerInstrumentation:
return state.memorySanitizerInstrumentation;
default:
- UNSUPPORTED("Unknown pragma %d", int(option));
+ UNSUPPORTED("Unknown Boolean pragma option %d", int(option));
return false;
}
}
+ScopedPragma::ScopedPragma(BooleanPragmaOption option, bool enable)
+{
+ oldState = BooleanPragma{ option, getPragmaState(option) };
+ Pragma(option, enable);
+}
+
+ScopedPragma::~ScopedPragma()
+{
+ auto &restore = std::get<BooleanPragma>(oldState);
+ Pragma(restore.option, restore.enable);
+}
+
} // namespace rr
\ No newline at end of file
diff --git a/src/Reactor/Pragma.hpp b/src/Reactor/Pragma.hpp
index 7f05095..1dd9b16 100644
--- a/src/Reactor/Pragma.hpp
+++ b/src/Reactor/Pragma.hpp
@@ -15,14 +15,33 @@
#ifndef rr_Pragma_hpp
#define rr_Pragma_hpp
+#include <variant>
+
namespace rr {
-enum PragmaBooleanOption
+enum BooleanPragmaOption
{
MemorySanitizerInstrumentation,
};
-void Pragma(PragmaBooleanOption option, bool enable);
+void Pragma(BooleanPragmaOption option, bool enable);
+
+class ScopedPragma
+{
+public:
+ ScopedPragma(BooleanPragmaOption option, bool enable);
+
+ ~ScopedPragma();
+
+private:
+ struct BooleanPragma
+ {
+ BooleanPragmaOption option;
+ bool enable;
+ };
+
+ std::variant<BooleanPragma> oldState;
+};
} // namespace rr
diff --git a/src/Reactor/PragmaInternals.hpp b/src/Reactor/PragmaInternals.hpp
index 9009d34..59296db 100644
--- a/src/Reactor/PragmaInternals.hpp
+++ b/src/Reactor/PragmaInternals.hpp
@@ -19,7 +19,7 @@
namespace rr {
-bool getPragmaState(PragmaBooleanOption option);
+bool getPragmaState(BooleanPragmaOption option);
} // namespace rr