@@ -1387,6 +1387,93 @@ def Mode : Attr {
1387
1387
let PragmaAttributeSupport = 0;
1388
1388
}
1389
1389
1390
+ def IntelFPGAConstVar : SubsetSubject<Var,
1391
+ [{S->getKind() != Decl::ImplicitParam &&
1392
+ S->getKind() != Decl::ParmVar &&
1393
+ S->getKind() != Decl::NonTypeTemplateParm &&
1394
+ (S->getType().isConstQualified() ||
1395
+ S->getType().getAddressSpace() ==
1396
+ LangAS::opencl_constant)}],
1397
+ "constant variables">;
1398
+
1399
+ def IntelFPGALocalStaticSlaveMemVar : SubsetSubject<Var,
1400
+ [{S->getKind() != Decl::ImplicitParam &&
1401
+ S->getKind() != Decl::NonTypeTemplateParm &&
1402
+ (S->getStorageClass() == SC_Static ||
1403
+ S->hasLocalStorage())}],
1404
+ "local variables, static variables, slave memory arguments">;
1405
+
1406
+ def IntelFPGALocalOrStaticVar : SubsetSubject<Var,
1407
+ [{S->getKind() != Decl::ImplicitParam &&
1408
+ S->getKind() != Decl::ParmVar &&
1409
+ S->getKind() != Decl::NonTypeTemplateParm &&
1410
+ (S->getStorageClass() == SC_Static ||
1411
+ S->hasLocalStorage())}],
1412
+ "local variables, static variables">;
1413
+
1414
+ def IntelFPGAMemory : Attr {
1415
+ let Spellings = [GNU<"memory">, CXX11<"intelfpga", "memory">];
1416
+ let Args = [EnumArgument<"Kind", "MemoryKind",
1417
+ ["MLAB", "BLOCK_RAM", ""],
1418
+ ["MLAB", "BlockRAM", "Default"], 1>];
1419
+ let AdditionalMembers = [{
1420
+ static void generateValidStrings(SmallString<256> &Str) {
1421
+ auto Last = BlockRAM;
1422
+ for (int I = 0; I <= Last; ++I) {
1423
+ Str += ConvertMemoryKindToStr(static_cast<MemoryKind>(I));
1424
+ if (I != Last) Str += " ";
1425
+ }
1426
+ }
1427
+ }];
1428
+ let Subjects = SubjectList<[IntelFPGAConstVar, IntelFPGALocalStaticSlaveMemVar,
1429
+ Field], ErrorDiag>;
1430
+ let LangOpts = [SYCL];
1431
+ let Documentation = [IntelFPGAMemoryAttrDocs];
1432
+ }
1433
+
1434
+ def IntelFPGARegister : Attr {
1435
+ let Spellings = [GNU<"register">, CXX11<"intelfpga", "register">];
1436
+ let Subjects = SubjectList<[IntelFPGAConstVar, IntelFPGALocalOrStaticVar,
1437
+ Field], ErrorDiag>;
1438
+ let LangOpts = [SYCL];
1439
+ let Documentation = [IntelFPGARegisterAttrDocs];
1440
+ }
1441
+
1442
+ // One integral argument.
1443
+ def IntelFPGABankWidth : Attr {
1444
+ let Spellings = [GNU<"bankwidth">, CXX11<"intelfpga","bankwidth">];
1445
+ let Args = [ExprArgument<"Value">];
1446
+ let Subjects = SubjectList<[IntelFPGAConstVar, IntelFPGALocalStaticSlaveMemVar,
1447
+ Field], ErrorDiag>;
1448
+ let LangOpts = [SYCL];
1449
+ let Documentation = [IntelFPGABankWidthAttrDocs];
1450
+ let AdditionalMembers = [{
1451
+ static unsigned getMinValue() {
1452
+ return 1;
1453
+ }
1454
+ static unsigned getMaxValue() {
1455
+ return 1024*1024;
1456
+ }
1457
+ }];
1458
+ }
1459
+
1460
+ def IntelFPGANumBanks : Attr {
1461
+ let Spellings = [GNU<"numbanks">, CXX11<"intelfpga","numbanks">];
1462
+ let Args = [ExprArgument<"Value">];
1463
+ let Subjects = SubjectList<[IntelFPGAConstVar, IntelFPGALocalStaticSlaveMemVar,
1464
+ Field], ErrorDiag>;
1465
+ let LangOpts = [SYCL];
1466
+ let Documentation = [IntelFPGANumBanksAttrDocs];
1467
+ let AdditionalMembers = [{
1468
+ static unsigned getMinValue() {
1469
+ return 1;
1470
+ }
1471
+ static unsigned getMaxValue() {
1472
+ return 1024*1024;
1473
+ }
1474
+ }];
1475
+ }
1476
+
1390
1477
def Naked : InheritableAttr {
1391
1478
let Spellings = [GCC<"naked">, Declspec<"naked">];
1392
1479
let Subjects = SubjectList<[Function]>;
0 commit comments