Partial clean up of test_compiler_defines_for_extensions (#1577)

Replace repetitions of extensions_supported[num_of_supported_extensions]
with a single pointer variable.

Replace character-by-character comparisons with a new string_has_prefix
function.

Signed-off-by: Stuart Brady <stuart.brady@arm.com>

Signed-off-by: Stuart Brady <stuart.brady@arm.com>
This commit is contained in:
Stuart Brady
2022-12-13 17:48:35 +00:00
committed by GitHub
parent 3cadff7115
commit a25b9c4948

View File

@@ -117,6 +117,11 @@ const char *kernel_strings[] = {
"}\n"
};
bool string_has_prefix(const char *str, const char *prefix)
{
return strncmp(str, prefix, strlen(prefix)) == 0;
}
int test_compiler_defines_for_extensions(cl_device_id device, cl_context context, cl_command_queue queue, int n_elems )
{
@@ -200,53 +205,47 @@ int test_compiler_defines_for_extensions(cl_device_id device, cl_context context
// record the extension name
uintptr_t extension_length = (uintptr_t) currentP - (uintptr_t) start;
extensions_supported[ num_of_supported_extensions ] = (char*) malloc( (extension_length + 1) * sizeof( char ) );
if( NULL == extensions_supported[ num_of_supported_extensions ] )
char *extension = (char *)malloc((extension_length + 1) * sizeof(char));
if (extension == NULL)
{
log_error( "Error: unable to allocate memory to hold extension name: %ld chars\n", extension_length );
return -1;
}
memcpy( extensions_supported[ num_of_supported_extensions ], start, extension_length * sizeof( char ) );
extensions_supported[ num_of_supported_extensions ][extension_length] = '\0';
extensions_supported[num_of_supported_extensions] = extension;
memcpy(extension, start, extension_length * sizeof(char));
extension[extension_length] = '\0';
// If the extension is a cl_khr extension, make sure it is an approved cl_khr extension -- looking for misspellings here
if( extensions_supported[ num_of_supported_extensions ][0] == 'c' &&
extensions_supported[ num_of_supported_extensions ][1] == 'l' &&
extensions_supported[ num_of_supported_extensions ][2] == '_' &&
extensions_supported[ num_of_supported_extensions ][3] == 'k' &&
extensions_supported[ num_of_supported_extensions ][4] == 'h' &&
extensions_supported[ num_of_supported_extensions ][5] == 'r' &&
extensions_supported[ num_of_supported_extensions ][6] == '_' )
if (string_has_prefix(extension, "cl_khr_"))
{
size_t ii;
for( ii = 0; ii < num_known_extensions; ii++ )
{
if( 0 == strcmp( known_extensions[ii], extensions_supported[ num_of_supported_extensions ] ) )
break;
if (strcmp(known_extensions[ii], extension) == 0) break;
}
if( ii == num_known_extensions )
{
log_error("FAIL: Extension %s is not in the list of approved "
"Khronos extensions!\n",
extensions_supported[num_of_supported_extensions]);
extension);
failed = true;
}
}
// Is it an embedded extension?
else if( memcmp( extensions_supported[ num_of_supported_extensions ], "cles_khr_", 9 ) == 0 )
else if (string_has_prefix(extension, "cles_khr_"))
{
// Yes, but is it a known one?
size_t ii;
for( ii = 0; known_embedded_extensions[ ii ] != NULL; ii++ )
{
if( strcmp( known_embedded_extensions[ ii ], extensions_supported[ num_of_supported_extensions ] ) == 0 )
if (strcmp(known_embedded_extensions[ii], extension) == 0)
break;
}
if( known_embedded_extensions[ ii ] == NULL )
{
log_error("FAIL: Extension %s is not in the list of approved "
"Khronos embedded extensions!\n",
extensions_supported[num_of_supported_extensions]);
extension);
failed = true;
}
else
@@ -264,40 +263,36 @@ int test_compiler_defines_for_extensions(cl_device_id device, cl_context context
log_error(
"FAIL: Extension %s is an approved embedded extension, "
"but on a non-embedded profile!\n",
extensions_supported[num_of_supported_extensions]);
extension);
failed = true;
}
}
}
else
{ // All other extensions must be of the form cl_<vendor_name>_<name>
if( extensions_supported[ num_of_supported_extensions ][0] != 'c' ||
extensions_supported[ num_of_supported_extensions ][1] != 'l' ||
extensions_supported[ num_of_supported_extensions ][2] != '_' )
if (!string_has_prefix(extension, "cl_"))
{
log_error("FAIL: Extension %s doesn't start with \"cl_\"!\n",
extensions_supported[num_of_supported_extensions]);
extension);
failed = true;
}
else if (extensions_supported[num_of_supported_extensions][3] == '_'
|| extensions_supported[num_of_supported_extensions][3]
== '\0')
else if (extension[3] == '_' || extension[3] == '\0')
{
log_error("FAIL: Vendor name is missing in extension %s!\n",
extensions_supported[num_of_supported_extensions]);
extension);
failed = true;
}
else
{
// look for the second underscore for name
char *p = extensions_supported[num_of_supported_extensions] + 4;
char *p = extension + 4;
while (*p != '\0' && *p != '_') p++;
if (*p != '_' || p[1] == '\0')
{
log_error(
"FAIL: extension name is missing in extension %s!\n",
extensions_supported[num_of_supported_extensions]);
extension);
failed = true;
}
}