@@ -1387,6 +1387,93 @@ def Mode : Attr {
13871387 let PragmaAttributeSupport = 0;
13881388}
13891389
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+
13901477def Naked : InheritableAttr {
13911478 let Spellings = [GCC<"naked">, Declspec<"naked">];
13921479 let Subjects = SubjectList<[Function]>;
0 commit comments