@@ -1037,6 +1037,43 @@ namespace TC
1037
1037
return internalDefines;
1038
1038
}
1039
1039
1040
+ // The expected extensions input string is in a form:
1041
+ // -cl-ext=-all,+supported_ext_name,+second_supported_ext_name
1042
+ std::string GetCDefinesForExtensions (llvm::StringRef extensions, unsigned int oclStd) {
1043
+
1044
+ std::string extDefines;
1045
+
1046
+ // check for the last occurence of -all, as it invalidates previous occurances.
1047
+ const StringRef clExtPrefix = " -cl-ext=-all," ;
1048
+ size_t pos = extensions.rfind (clExtPrefix);
1049
+ if (pos == llvm::StringRef::npos) {
1050
+ // If this string does not exist the input string does not contain valid extension list
1051
+ // or it has all extensions disabled (-all without colon afterwards).
1052
+ return extDefines;
1053
+ }
1054
+
1055
+ extensions = extensions.substr (pos+clExtPrefix.size ());
1056
+
1057
+ // string with defines should be similar in size, ",+" will change to "-D".
1058
+ extDefines.reserve (extensions.size ());
1059
+
1060
+ llvm::SmallVector<StringRef, 0 > v;
1061
+ extensions.split (v, ' ,' );
1062
+
1063
+ for (auto ext : v) {
1064
+ if (ext.consume_front (" +" )) {
1065
+ if (ext.equals (" cl_intel_device_side_avc_motion_estimation" )) {
1066
+ // If the user provided -cl-std option we need to add the define only if it's 1.2 and above.
1067
+ // This is because clang will not allow declarations of extension's functions which use avc types otherwise.
1068
+ if (!(oclStd >= 120 || oclStd == 0 )) continue ;
1069
+ }
1070
+ extDefines.append (" -D" ).append (ext);
1071
+ }
1072
+ }
1073
+
1074
+ return extDefines;
1075
+ }
1076
+
1040
1077
/* ****************************************************************************\
1041
1078
1042
1079
Function:
@@ -1407,47 +1444,10 @@ namespace TC
1407
1444
1408
1445
optionsEx += " " + extensions;
1409
1446
1447
+ unsigned int oclStd = GetOclCVersionFromOptions (pInputArgs->options .data (), nullptr , pInputArgs->oclVersion , exceptString);
1410
1448
// get additional -D flags from internal options
1411
1449
optionsEx += " " + GetCDefinesFromInternalOptions (pInternalOptions);
1412
-
1413
- if (extensions.find (" cl_intel_subgroups_short" ) != std::string::npos)
1414
- {
1415
- optionsEx += " -Dcl_intel_subgroups_short" ;
1416
- }
1417
- if (extensions.find (" cl_intel_subgroups_char" ) != std::string::npos)
1418
- {
1419
- optionsEx += " -Dcl_intel_subgroups_char" ;
1420
- }
1421
- if (extensions.find (" cl_intel_subgroups_long" ) != std::string::npos)
1422
- {
1423
- optionsEx += " -Dcl_intel_subgroups_long" ;
1424
- }
1425
- if (extensions.find (" cl_intel_media_block_io" ) != std::string::npos)
1426
- {
1427
- optionsEx += " -Dcl_intel_media_block_io" ;
1428
- }
1429
- if (extensions.find (" cl_intel_device_side_avc_motion_estimation" ) != std::string::npos)
1430
- {
1431
- // If the user provided -cl-std option we need to add the define only if it's 1.2 and above.
1432
- // This is because clang will not allow declarations of extension's functions which use avc types otherwise.
1433
- unsigned int oclStd = GetOclCVersionFromOptions (pInputArgs->options .data (), nullptr , pInputArgs->oclVersion , exceptString);
1434
- if (oclStd >= 120 || oclStd == 0 ) {
1435
- optionsEx += " -Dcl_intel_device_side_avc_motion_estimation" ;
1436
- }
1437
- }
1438
- if (extensions.find (" cl_intel_64bit_global_atomics_placeholder" ) != std::string::npos)
1439
- {
1440
- optionsEx += " -Dcl_intel_64bit_global_atomics_placeholder" ;
1441
- }
1442
- if (extensions.find (" cl_khr_int64_base_atomics" ) != std::string::npos)
1443
- {
1444
- optionsEx += " -Dcl_khr_int64_base_atomics" ;
1445
- }
1446
- if (extensions.find (" cl_khr_int64_extended_atomics" ) != std::string::npos)
1447
- {
1448
- optionsEx += " -Dcl_khr_int64_extended_atomics" ;
1449
- }
1450
-
1450
+ optionsEx += " " + GetCDefinesForExtensions (extensions, oclStd);
1451
1451
optionsEx += " -D__IMAGE_SUPPORT__ -D__ENDIAN_LITTLE__" ;
1452
1452
1453
1453
IOCLFEBinaryResult *pResultPtr = NULL ;
0 commit comments