@@ -1250,6 +1250,93 @@ verifyReductionVarList(Operation *op, std::optional<ArrayAttr> reductionSyms,
12501250 return success ();
12511251}
12521252
1253+ // ===----------------------------------------------------------------------===//
1254+ // Parser, printer and verifier for Allocator (Section 8.4 in OpenMP 6.0)
1255+ // ===----------------------------------------------------------------------===//
1256+
1257+ // / Parses a allocator clause. The value of allocator handle is an integer
1258+ // / which is a combination of different allocator handles from
1259+ // / `omp_allocator_handle_t`.
1260+ // /
1261+ // / allocator-clause = `allocator` `(` allocator-value `)`
1262+ static ParseResult parseAllocatorHandle (OpAsmParser &parser,
1263+ IntegerAttr &allocatorHandleAttr) {
1264+ StringRef allocatorKeyword;
1265+ int64_t allocator = 0 ;
1266+ if (succeeded (parser.parseOptionalKeyword (" none" ))) {
1267+ allocatorHandleAttr = IntegerAttr::get (parser.getBuilder ().getI64Type (), 0 );
1268+ return success ();
1269+ }
1270+ auto parseKeyword = [&]() -> ParseResult {
1271+ if (failed (parser.parseKeyword (&allocatorKeyword)))
1272+ return failure ();
1273+ if (allocatorKeyword == " omp_null_allocator" )
1274+ allocator = 0 ;
1275+ else if (allocatorKeyword == " omp_default_mem_alloc" )
1276+ allocator = 1 ;
1277+ else if (allocatorKeyword == " omp_large_cap_mem_alloc" )
1278+ allocator = 2 ;
1279+ else if (allocatorKeyword == " omp_const_mem_alloc" )
1280+ allocator = 3 ;
1281+ else if (allocatorKeyword == " omp_high_bw_mem_alloc" )
1282+ allocator = 4 ;
1283+ else if (allocatorKeyword == " omp_low_lat_mem_alloc" )
1284+ allocator = 5 ;
1285+ else if (allocatorKeyword == " omp_cgroup_mem_alloc" )
1286+ allocator = 6 ;
1287+ else if (allocatorKeyword == " omp_pteam_mem_alloc" )
1288+ allocator = 7 ;
1289+ else if (allocatorKeyword == " omp_thread_mem_alloc" )
1290+ allocator = 8 ;
1291+ else
1292+ return parser.emitError (parser.getCurrentLocation ())
1293+ << allocatorKeyword << " is not a valid allocator" ;
1294+ return success ();
1295+ };
1296+ if (parser.parseCommaSeparatedList (parseKeyword))
1297+ return failure ();
1298+ allocatorHandleAttr =
1299+ IntegerAttr::get (parser.getBuilder ().getI64Type (), allocator);
1300+ return success ();
1301+ }
1302+
1303+ // / Prints a allocator clause
1304+ static void printAllocatorHandle (OpAsmPrinter &p, Operation *op,
1305+ IntegerAttr allocatorHandleAttr) {
1306+ int64_t allocator = allocatorHandleAttr.getInt ();
1307+ StringRef allocatorHandle;
1308+ switch (allocator) {
1309+ case 0 :
1310+ allocatorHandle = " omp_null_allocator" ;
1311+ break ;
1312+ case 1 :
1313+ allocatorHandle = " omp_default_mem_alloc" ;
1314+ break ;
1315+ case 2 :
1316+ allocatorHandle = " omp_large_cap_mem_alloc" ;
1317+ break ;
1318+ case 3 :
1319+ allocatorHandle = " omp_const_mem_alloc" ;
1320+ break ;
1321+ case 4 :
1322+ allocatorHandle = " omp_high_bw_mem_alloc" ;
1323+ break ;
1324+ case 5 :
1325+ allocatorHandle = " omp_low_lat_mem_alloc" ;
1326+ break ;
1327+ case 6 :
1328+ allocatorHandle = " omp_cgroup_mem_alloc" ;
1329+ break ;
1330+ case 7 :
1331+ allocatorHandle = " omp_pteam_mem_alloc" ;
1332+ break ;
1333+ case 8 :
1334+ allocatorHandle = " omp_thread_mem_alloc" ;
1335+ break ;
1336+ }
1337+ p << allocatorHandle;
1338+ }
1339+
12531340// ===----------------------------------------------------------------------===//
12541341// Parser, printer and verifier for Copyprivate
12551342// ===----------------------------------------------------------------------===//
0 commit comments