#include "spirv-tools/libspirv.h"
namespace libspirv {
-class diagnostic_helper {
- public:
- diagnostic_helper(spv_position_t& position, spv_diagnostic* diagnostic)
- : position_(&position), diagnostic_(diagnostic) {}
-
- diagnostic_helper(spv_position position, spv_diagnostic* diagnostic)
- : position_(position), diagnostic_(diagnostic) {}
-
- ~diagnostic_helper() {
- *diagnostic_ = spvDiagnosticCreate(position_, stream().str().c_str());
- }
-
- std::stringstream& stream() { return stream_; }
-
- private:
- std::stringstream stream_;
- spv_position position_;
- spv_diagnostic* diagnostic_;
-};
// A DiagnosticStream remembers the current position of the input and an error
// code, and captures diagnostic messages via the left-shift operator.
// If the error code is not SPV_FAILED_MATCH, then captured messages are
// emitted during the destructor.
-// TODO(awoloszyn): This is very similar to diagnostic_helper, and hides
-// the data more easily. Replace diagnostic_helper elsewhere
-// eventually.
class DiagnosticStream {
public:
DiagnosticStream(spv_position_t position, spv_diagnostic* pDiagnostic,
spv_result_t error_;
};
-#define DIAGNOSTIC \
- libspirv::diagnostic_helper helper(position, pDiagnostic); \
- helper.stream()
-
std::string spvResultToString(spv_result_t res);
} // namespace libspirv
spv_endianness_t endian;
spv_position_t position = {};
if (spvBinaryEndianness(binary, &endian)) {
- DIAGNOSTIC << "Invalid SPIR-V magic number.";
- return SPV_ERROR_INVALID_BINARY;
+ return libspirv::DiagnosticStream(position, pDiagnostic,
+ SPV_ERROR_INVALID_BINARY)
+ << "Invalid SPIR-V magic number.";
}
spv_header_t header;
if (spvBinaryHeaderGet(binary, endian, &header)) {
- DIAGNOSTIC << "Invalid SPIR-V header.";
- return SPV_ERROR_INVALID_BINARY;
+ return libspirv::DiagnosticStream(position, pDiagnostic,
+ SPV_ERROR_INVALID_BINARY)
+ << "Invalid SPIR-V header.";
}
// NOTE: Parse the module and perform inline validation checks. These
vector<uint32_t> entry_points_;
};
-#define DIAG(INDEX) \
- position->index += INDEX; \
- DIAGNOSTIC
+#define DIAG(INDEX) \
+ position->index += INDEX; \
+ libspirv::DiagnosticStream helper(*position, pDiagnostic, \
+ SPV_ERROR_INVALID_DIAGNOSTIC); \
+ helper
#if 0
template <>