LuoYuanke created this revision. Herald added a reviewer: aaron.ballman. LuoYuanke requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D115199 Files: clang/include/clang/Basic/Attr.td clang/lib/CodeGen/CGCall.cpp clang/lib/CodeGen/CodeGenModule.cpp clang/lib/Sema/SemaType.cpp Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -7514,6 +7514,17 @@ return true; } + if (attr.getKind() == ParsedAttr::AT_AMXPreserve) { + if (S.CheckAttrTarget(attr)) + return true; + + // Delay if this is not a function type. + if (!unwrapped.isFunctionType()) + return false; + + return true; + } + if (attr.getKind() == ParsedAttr::AT_AnyX86NoCallerSavedRegisters) { if (S.CheckAttrTarget(attr) || S.CheckAttrNoArgs(attr)) return true; Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -1858,6 +1858,8 @@ // carry an explicit noinline attribute. if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline)) B.addAttribute(llvm::Attribute::NoInline); + } else if (D->hasAttr<AMXPreserveAttr>()) { + B.addAttribute(llvm::Attribute::AMXPreserve); } else { // Otherwise, propagate the inline hint attribute and potentially use its // absence to mark things as noinline. Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -2116,6 +2116,8 @@ FuncAttrs.addAttribute(llvm::Attribute::NoCfCheck); if (TargetDecl->hasAttr<LeafAttr>()) FuncAttrs.addAttribute(llvm::Attribute::NoCallback); + if (TargetDecl->hasAttr<AMXPreserveAttr>()) + FuncAttrs.addAttribute(llvm::Attribute::AMXPreserve); HasOptnone = TargetDecl->hasAttr<OptimizeNoneAttr>(); if (auto *AllocSize = TargetDecl->getAttr<AllocSizeAttr>()) { Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -2892,6 +2892,12 @@ let SimpleHandler = 1; } +def AMXPreserve : InheritableAttr, TargetSpecificAttr<TargetAnyX86> { + let Spellings = [GCC<"amxpreserve">, Declspec<"amxpreserve">]; + let Documentation = [Undocumented]; + let SimpleHandler = 1; +} + def AnyX86Interrupt : InheritableAttr, TargetSpecificAttr<TargetAnyX86> { // NOTE: If you add any additional spellings, ARMInterrupt's, // M68kInterrupt's, MSP430Interrupt's and MipsInterrupt's spellings must match.
Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -7514,6 +7514,17 @@ return true; } + if (attr.getKind() == ParsedAttr::AT_AMXPreserve) { + if (S.CheckAttrTarget(attr)) + return true; + + // Delay if this is not a function type. + if (!unwrapped.isFunctionType()) + return false; + + return true; + } + if (attr.getKind() == ParsedAttr::AT_AnyX86NoCallerSavedRegisters) { if (S.CheckAttrTarget(attr) || S.CheckAttrNoArgs(attr)) return true; Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -1858,6 +1858,8 @@ // carry an explicit noinline attribute. if (!F->hasFnAttribute(llvm::Attribute::AlwaysInline)) B.addAttribute(llvm::Attribute::NoInline); + } else if (D->hasAttr<AMXPreserveAttr>()) { + B.addAttribute(llvm::Attribute::AMXPreserve); } else { // Otherwise, propagate the inline hint attribute and potentially use its // absence to mark things as noinline. Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -2116,6 +2116,8 @@ FuncAttrs.addAttribute(llvm::Attribute::NoCfCheck); if (TargetDecl->hasAttr<LeafAttr>()) FuncAttrs.addAttribute(llvm::Attribute::NoCallback); + if (TargetDecl->hasAttr<AMXPreserveAttr>()) + FuncAttrs.addAttribute(llvm::Attribute::AMXPreserve); HasOptnone = TargetDecl->hasAttr<OptimizeNoneAttr>(); if (auto *AllocSize = TargetDecl->getAttr<AllocSizeAttr>()) { Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -2892,6 +2892,12 @@ let SimpleHandler = 1; } +def AMXPreserve : InheritableAttr, TargetSpecificAttr<TargetAnyX86> { + let Spellings = [GCC<"amxpreserve">, Declspec<"amxpreserve">]; + let Documentation = [Undocumented]; + let SimpleHandler = 1; +} + def AnyX86Interrupt : InheritableAttr, TargetSpecificAttr<TargetAnyX86> { // NOTE: If you add any additional spellings, ARMInterrupt's, // M68kInterrupt's, MSP430Interrupt's and MipsInterrupt's spellings must match.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits