// // Copyright (c) 2017 The Khronos Group Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef TESTPRINTF_INCLUDED_H #define TESTPRINTF_INCLUDED_H #include "harness/compat.h" #include "harness/testHarness.h" #include "harness/rounding_mode.h" #include #include #include #ifdef __APPLE__ #include #include #else #include #include #endif #define ANALYSIS_BUFFER_SIZE 256 //----------------------------------------- // Definitions and initializations //----------------------------------------- //----------------------------------------- // Types //----------------------------------------- enum PrintfTestType { TYPE_INT, TYPE_FLOAT, TYPE_FLOAT_LIMITS, TYPE_OCTAL, TYPE_UNSIGNED, TYPE_HEXADEC, TYPE_CHAR, TYPE_STRING, TYPE_VECTOR, TYPE_ADDRESS_SPACE, TYPE_COUNT }; struct printDataGenParameters { const char* genericFormat; const char* dataRepresentation; const char* vectorFormatFlag; const char* vectorFormatSpecifier; const char* dataType; const char* vectorSize; const char* addrSpaceArgumentTypeQualifier; const char* addrSpaceVariableTypeQualifier; const char* addrSpaceParameter; const char* addrSpacePAdd; }; // Reference results - filled out at run-time static std::vector correctBufferInt; static std::vector correctBufferFloat; static std::vector correctBufferOctal; static std::vector correctBufferUnsigned; static std::vector correctBufferHexadecimal; // Reference results - Compile-time known extern std::vector correctBufferChar; extern std::vector correctBufferString; extern std::vector correctBufferFloatLimits; extern std::vector correctBufferVector; extern std::vector correctAddrSpace; // Helper for generating reference results void generateRef(const cl_device_id device); //----------------------------------------- //Test Case //----------------------------------------- struct testCase { enum PrintfTestType _type; //(data)type for test std::vector& _correctBuffer; //look-up table for correct results for printf std::vector& _genParameters; //auxiliary data to build the code for kernel source void (*printFN)(printDataGenParameters&, char*, const size_t); //function pointer for generating reference results Type dataType; //the data type that will be printed during reference result generation (used for setting rounding mode) }; extern const char* strType[]; extern std::vector allTestCase; size_t verifyOutputBuffer(char *analysisBuffer,testCase* pTestCase,size_t testId,cl_ulong pAddr = 0); // Helpful macros // The next three functions check on different return values. Returns -1 // if the check failed #define checkErr(err, msg) \ if (err != CL_SUCCESS) { \ log_error("%s failed errcode:%d\n", msg, err); \ return -1; \ } #define checkZero(val, msg) \ if (val == 0) { \ log_error("%s failed errcode:%d\n", msg, err); \ return -1; \ } #define checkNull(ptr, msg) \ if (!ptr) { \ log_error("%s failed\n", msg); \ return TEST_FAIL; \ } // When a helper returns a negative one, we want to return from main // with negative one. This helper prevents me from having to write // this multiple time #define checkHelperErr(err) \ if (err == -1) { \ return err; \ } #endif // TESTSPRINTF_INCLUDED_H