[PATCH] D64169: ARM MTE stack sanitizer.
This revision was automatically updated to reflect the committed changes. Closed by commit rL366123: ARM MTE stack sanitizer. (authored by eugenis, committed by ). Changed prior to commit: https://reviews.llvm.org/D64169?vs=209578=209936#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64169/new/ https://reviews.llvm.org/D64169 Files: cfe/trunk/include/clang/Basic/Features.def cfe/trunk/include/clang/Basic/Sanitizers.def cfe/trunk/lib/CodeGen/CGDeclCXX.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.cpp cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/lib/Driver/ToolChains/Linux.cpp cfe/trunk/test/CodeGen/memtag-attr.cpp cfe/trunk/test/Driver/fsanitize.c cfe/trunk/test/Lexer/has_feature_memtag_sanitizer.cpp cfe/trunk/test/SemaCXX/attr-no-sanitize.cpp llvm/trunk/docs/BitCodeFormat.rst llvm/trunk/docs/LangRef.rst llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h llvm/trunk/include/llvm/IR/Attributes.td llvm/trunk/lib/AsmParser/LLLexer.cpp llvm/trunk/lib/AsmParser/LLParser.cpp llvm/trunk/lib/AsmParser/LLToken.h llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp llvm/trunk/lib/IR/Attributes.cpp llvm/trunk/lib/IR/Verifier.cpp llvm/trunk/lib/Transforms/IPO/ForceFunctionAttrs.cpp llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp llvm/trunk/test/Bitcode/attributes.ll llvm/trunk/test/Transforms/Inline/attributes.ll llvm/trunk/utils/emacs/llvm-mode.el Index: llvm/trunk/lib/AsmParser/LLLexer.cpp === --- llvm/trunk/lib/AsmParser/LLLexer.cpp +++ llvm/trunk/lib/AsmParser/LLLexer.cpp @@ -679,6 +679,7 @@ KEYWORD(shadowcallstack); KEYWORD(sanitize_address); KEYWORD(sanitize_hwaddress); + KEYWORD(sanitize_memtag); KEYWORD(sanitize_thread); KEYWORD(sanitize_memory); KEYWORD(speculative_load_hardening); Index: llvm/trunk/lib/AsmParser/LLParser.cpp === --- llvm/trunk/lib/AsmParser/LLParser.cpp +++ llvm/trunk/lib/AsmParser/LLParser.cpp @@ -1311,6 +1311,8 @@ B.addAttribute(Attribute::SanitizeAddress); break; case lltok::kw_sanitize_hwaddress: B.addAttribute(Attribute::SanitizeHWAddress); break; +case lltok::kw_sanitize_memtag: + B.addAttribute(Attribute::SanitizeMemTag); break; case lltok::kw_sanitize_thread: B.addAttribute(Attribute::SanitizeThread); break; case lltok::kw_sanitize_memory: @@ -1668,6 +1670,7 @@ case lltok::kw_returns_twice: case lltok::kw_sanitize_address: case lltok::kw_sanitize_hwaddress: +case lltok::kw_sanitize_memtag: case lltok::kw_sanitize_memory: case lltok::kw_sanitize_thread: case lltok::kw_speculative_load_hardening: @@ -1766,6 +1769,7 @@ case lltok::kw_returns_twice: case lltok::kw_sanitize_address: case lltok::kw_sanitize_hwaddress: +case lltok::kw_sanitize_memtag: case lltok::kw_sanitize_memory: case lltok::kw_sanitize_thread: case lltok::kw_speculative_load_hardening: Index: llvm/trunk/lib/AsmParser/LLToken.h === --- llvm/trunk/lib/AsmParser/LLToken.h +++ llvm/trunk/lib/AsmParser/LLToken.h @@ -176,6 +176,7 @@ kw_argmemonly, kw_sanitize_address, kw_sanitize_hwaddress, + kw_sanitize_memtag, kw_builtin, kw_byval, kw_inalloca, Index: llvm/trunk/lib/IR/Attributes.cpp === --- llvm/trunk/lib/IR/Attributes.cpp +++ llvm/trunk/lib/IR/Attributes.cpp @@ -283,6 +283,8 @@ return "sanitize_address"; if (hasAttribute(Attribute::SanitizeHWAddress)) return "sanitize_hwaddress"; + if (hasAttribute(Attribute::SanitizeMemTag)) +return "sanitize_memtag"; if (hasAttribute(Attribute::AlwaysInline)) return "alwaysinline"; if (hasAttribute(Attribute::ArgMemOnly)) Index: llvm/trunk/lib/IR/Verifier.cpp === --- llvm/trunk/lib/IR/Verifier.cpp +++ llvm/trunk/lib/IR/Verifier.cpp @@ -1516,6 +1516,7 @@ case Attribute::ReturnsTwice: case Attribute::SanitizeAddress: case Attribute::SanitizeHWAddress: + case Attribute::SanitizeMemTag: case Attribute::SanitizeThread: case Attribute::SanitizeMemory: case Attribute::MinSize: Index: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp === --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1296,6 +1296,9 @@ case Attribute::AllocSize: llvm_unreachable("allocsize not supported in raw format"); break; + case Attribute::SanitizeMemTag: +llvm_unreachable("sanitize_memtag attribute not supported in raw format"); +break; }
[PATCH] D64169: ARM MTE stack sanitizer.
eugenis added inline comments. Comment at: clang/lib/CodeGen/SanitizerMetadata.cpp:28 + if (!CGM.getLangOpts().Sanitize.hasOneOf( + SanitizerKind::Address | SanitizerKind::KernelAddress | + SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress | vitalybuka wrote: > maybe shared constant or function for : > SanitizerKind::Address | SanitizerKind::KernelAddress | > SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress | > SanitizerKind::MemTag added a helper function Comment at: llvm/docs/BitCodeFormat.rst:1060 * code 58: ``shadowcallstack`` +* code 62: ``sanitize_memtag`` vitalybuka wrote: > why it's 62 and not e.g. 59? Because people forget to update this file. And it's 64 already. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64169/new/ https://reviews.llvm.org/D64169 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D64169: ARM MTE stack sanitizer.
eugenis updated this revision to Diff 209578. eugenis marked 4 inline comments as done. eugenis added a comment. addressed review comments Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64169/new/ https://reviews.llvm.org/D64169 Files: clang/include/clang/Basic/Features.def clang/include/clang/Basic/Sanitizers.def clang/lib/CodeGen/CGDeclCXX.cpp clang/lib/CodeGen/CodeGenFunction.cpp clang/lib/CodeGen/CodeGenModule.cpp clang/lib/CodeGen/SanitizerMetadata.cpp clang/lib/Driver/SanitizerArgs.cpp clang/lib/Driver/ToolChains/Linux.cpp clang/test/CodeGen/memtag-attr.cpp clang/test/Driver/fsanitize.c clang/test/Lexer/has_feature_memtag_sanitizer.cpp clang/test/SemaCXX/attr-no-sanitize.cpp llvm/docs/BitCodeFormat.rst llvm/docs/LangRef.rst llvm/include/llvm/Bitcode/LLVMBitCodes.h llvm/include/llvm/IR/Attributes.td llvm/lib/AsmParser/LLLexer.cpp llvm/lib/AsmParser/LLParser.cpp llvm/lib/AsmParser/LLToken.h llvm/lib/Bitcode/Reader/BitcodeReader.cpp llvm/lib/Bitcode/Writer/BitcodeWriter.cpp llvm/lib/IR/Attributes.cpp llvm/lib/IR/Verifier.cpp llvm/lib/Transforms/IPO/ForceFunctionAttrs.cpp llvm/lib/Transforms/Utils/CodeExtractor.cpp llvm/test/Bitcode/attributes.ll llvm/test/Transforms/Inline/attributes.ll llvm/utils/emacs/llvm-mode.el Index: llvm/utils/emacs/llvm-mode.el === --- llvm/utils/emacs/llvm-mode.el +++ llvm/utils/emacs/llvm-mode.el @@ -26,7 +26,7 @@ "inaccessiblemem_or_argmemonly" "inlinehint" "jumptable" "minsize" "naked" "nobuiltin" "noduplicate" "noimplicitfloat" "noinline" "nonlazybind" "noredzone" "noreturn" "norecurse" "nounwind" "optnone" "optsize" "readnone" "readonly" "returns_twice" - "speculatable" "ssp" "sspreq" "sspstrong" "safestack" "sanitize_address" "sanitize_hwaddress" + "speculatable" "ssp" "sspreq" "sspstrong" "safestack" "sanitize_address" "sanitize_hwaddress" "sanitize_memtag" "sanitize_thread" "sanitize_memory" "strictfp" "uwtable" "writeonly" "immarg") 'symbols) . font-lock-constant-face) ;; Variables '("%[-a-zA-Z$._][-a-zA-Z$._0-9]*" . font-lock-variable-name-face) Index: llvm/test/Transforms/Inline/attributes.ll === --- llvm/test/Transforms/Inline/attributes.ll +++ llvm/test/Transforms/Inline/attributes.ll @@ -22,6 +22,10 @@ ret i32 %i } +define i32 @sanitize_memtag_callee(i32 %i) sanitize_memtag { + ret i32 %i +} + define i32 @safestack_callee(i32 %i) safestack { ret i32 %i } @@ -50,6 +54,10 @@ ret i32 %i } +define i32 @alwaysinline_sanitize_memtag_callee(i32 %i) alwaysinline sanitize_memtag { + ret i32 %i +} + define i32 @alwaysinline_safestack_callee(i32 %i) alwaysinline safestack { ret i32 %i } @@ -104,6 +112,17 @@ ; CHECK-NEXT: ret i32 } +define i32 @test_no_sanitize_memtag(i32 %arg) { + %x1 = call i32 @noattr_callee(i32 %arg) + %x2 = call i32 @sanitize_memtag_callee(i32 %x1) + %x3 = call i32 @alwaysinline_callee(i32 %x2) + %x4 = call i32 @alwaysinline_sanitize_memtag_callee(i32 %x3) + ret i32 %x4 +; CHECK-LABEL: @test_no_sanitize_memtag( +; CHECK-NEXT: @sanitize_memtag_callee +; CHECK-NEXT: ret i32 +} + ; Check that: ; * noattr callee is not inlined into sanitize_(address|memory|thread) caller, @@ -154,6 +173,17 @@ ; CHECK-NEXT: ret i32 } +define i32 @test_sanitize_memtag(i32 %arg) sanitize_memtag { + %x1 = call i32 @noattr_callee(i32 %arg) + %x2 = call i32 @sanitize_memtag_callee(i32 %x1) + %x3 = call i32 @alwaysinline_callee(i32 %x2) + %x4 = call i32 @alwaysinline_sanitize_memtag_callee(i32 %x3) + ret i32 %x4 +; CHECK-LABEL: @test_sanitize_memtag( +; CHECK-NEXT: @noattr_callee +; CHECK-NEXT: ret i32 +} + define i32 @test_safestack(i32 %arg) safestack { %x1 = call i32 @noattr_callee(i32 %arg) %x2 = call i32 @safestack_callee(i32 %x1) Index: llvm/test/Bitcode/attributes.ll === --- llvm/test/Bitcode/attributes.ll +++ llvm/test/Bitcode/attributes.ll @@ -204,7 +204,7 @@ ; CHECK: define void @f34() { call void @nobuiltin() nobuiltin -; CHECK: call void @nobuiltin() #39 +; CHECK: call void @nobuiltin() #40 ret void; } @@ -368,6 +368,12 @@ ret void } +; CHECK: define void @f63() #39 +define void @f63() sanitize_memtag +{ + ret void; +} + ; CHECK: attributes #0 = { noreturn } ; CHECK: attributes #1 = { nounwind } ; CHECK: attributes #2 = { readnone } @@ -407,4 +413,5 @@ ; CHECK: attributes #36 = { willreturn } ; CHECK: attributes #37 = { nofree } ; CHECK: attributes #38 = { nosync } -; CHECK: attributes #39 = { nobuiltin } +; CHECK: attributes #39 = { sanitize_memtag } +; CHECK: attributes #40 = { nobuiltin } Index: llvm/lib/Transforms/Utils/CodeExtractor.cpp === ---
[PATCH] D64169: ARM MTE stack sanitizer.
vitalybuka accepted this revision. vitalybuka added inline comments. Comment at: clang/lib/CodeGen/SanitizerMetadata.cpp:28 + if (!CGM.getLangOpts().Sanitize.hasOneOf( + SanitizerKind::Address | SanitizerKind::KernelAddress | + SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress | maybe shared constant or function for : SanitizerKind::Address | SanitizerKind::KernelAddress | SanitizerKind::HWAddress | SanitizerKind::KernelHWAddress | SanitizerKind::MemTag Comment at: llvm/docs/BitCodeFormat.rst:1060 * code 58: ``shadowcallstack`` +* code 62: ``sanitize_memtag`` why it's 62 and not e.g. 59? Comment at: llvm/test/Bitcode/attributes.ll:363 +{ +ret void; +} indentation is inconsistent Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64169/new/ https://reviews.llvm.org/D64169 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D64169: ARM MTE stack sanitizer.
ostannard accepted this revision. ostannard added a comment. This revision is now accepted and ready to land. LGTM with one minor nit. Comment at: llvm/include/llvm/Bitcode/LLVMBitCodes.h:632 ATTR_KIND_WILLRETURN = 61, + ATTR_KIND_SANITIZE_MEMTAG = 62 }; Please leave the trailing comma on, to keep the git-blame clean. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64169/new/ https://reviews.llvm.org/D64169 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D64169: ARM MTE stack sanitizer.
eugenis updated this revision to Diff 207920. eugenis added a comment. fix bitcode docs Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64169/new/ https://reviews.llvm.org/D64169 Files: clang/include/clang/Basic/Features.def clang/include/clang/Basic/Sanitizers.def clang/lib/CodeGen/CGDeclCXX.cpp clang/lib/CodeGen/CodeGenFunction.cpp clang/lib/CodeGen/CodeGenModule.cpp clang/lib/CodeGen/SanitizerMetadata.cpp clang/lib/Driver/SanitizerArgs.cpp clang/lib/Driver/ToolChains/Linux.cpp clang/test/CodeGen/memtag-attr.cpp clang/test/Driver/fsanitize.c clang/test/Lexer/has_feature_memtag_sanitizer.cpp clang/test/SemaCXX/attr-no-sanitize.cpp llvm/docs/BitCodeFormat.rst llvm/docs/LangRef.rst llvm/include/llvm/Bitcode/LLVMBitCodes.h llvm/include/llvm/IR/Attributes.td llvm/lib/AsmParser/LLLexer.cpp llvm/lib/AsmParser/LLParser.cpp llvm/lib/AsmParser/LLToken.h llvm/lib/Bitcode/Reader/BitcodeReader.cpp llvm/lib/Bitcode/Writer/BitcodeWriter.cpp llvm/lib/IR/Attributes.cpp llvm/lib/IR/Verifier.cpp llvm/lib/Transforms/IPO/ForceFunctionAttrs.cpp llvm/lib/Transforms/Utils/CodeExtractor.cpp llvm/test/Bitcode/attributes.ll llvm/test/Transforms/Inline/attributes.ll llvm/utils/emacs/llvm-mode.el Index: llvm/utils/emacs/llvm-mode.el === --- llvm/utils/emacs/llvm-mode.el +++ llvm/utils/emacs/llvm-mode.el @@ -26,7 +26,7 @@ "inaccessiblemem_or_argmemonly" "inlinehint" "jumptable" "minsize" "naked" "nobuiltin" "noduplicate" "noimplicitfloat" "noinline" "nonlazybind" "noredzone" "noreturn" "norecurse" "nounwind" "optnone" "optsize" "readnone" "readonly" "returns_twice" - "speculatable" "ssp" "sspreq" "sspstrong" "safestack" "sanitize_address" "sanitize_hwaddress" + "speculatable" "ssp" "sspreq" "sspstrong" "safestack" "sanitize_address" "sanitize_hwaddress" "sanitize_memtag" "sanitize_thread" "sanitize_memory" "strictfp" "uwtable" "writeonly" "immarg") 'symbols) . font-lock-constant-face) ;; Variables '("%[-a-zA-Z$._][-a-zA-Z$._0-9]*" . font-lock-variable-name-face) Index: llvm/test/Transforms/Inline/attributes.ll === --- llvm/test/Transforms/Inline/attributes.ll +++ llvm/test/Transforms/Inline/attributes.ll @@ -22,6 +22,10 @@ ret i32 %i } +define i32 @sanitize_memtag_callee(i32 %i) sanitize_memtag { + ret i32 %i +} + define i32 @safestack_callee(i32 %i) safestack { ret i32 %i } @@ -50,6 +54,10 @@ ret i32 %i } +define i32 @alwaysinline_sanitize_memtag_callee(i32 %i) alwaysinline sanitize_memtag { + ret i32 %i +} + define i32 @alwaysinline_safestack_callee(i32 %i) alwaysinline safestack { ret i32 %i } @@ -104,6 +112,17 @@ ; CHECK-NEXT: ret i32 } +define i32 @test_no_sanitize_memtag(i32 %arg) { + %x1 = call i32 @noattr_callee(i32 %arg) + %x2 = call i32 @sanitize_memtag_callee(i32 %x1) + %x3 = call i32 @alwaysinline_callee(i32 %x2) + %x4 = call i32 @alwaysinline_sanitize_memtag_callee(i32 %x3) + ret i32 %x4 +; CHECK-LABEL: @test_no_sanitize_memtag( +; CHECK-NEXT: @sanitize_memtag_callee +; CHECK-NEXT: ret i32 +} + ; Check that: ; * noattr callee is not inlined into sanitize_(address|memory|thread) caller, @@ -154,6 +173,17 @@ ; CHECK-NEXT: ret i32 } +define i32 @test_sanitize_memtag(i32 %arg) sanitize_memtag { + %x1 = call i32 @noattr_callee(i32 %arg) + %x2 = call i32 @sanitize_memtag_callee(i32 %x1) + %x3 = call i32 @alwaysinline_callee(i32 %x2) + %x4 = call i32 @alwaysinline_sanitize_memtag_callee(i32 %x3) + ret i32 %x4 +; CHECK-LABEL: @test_sanitize_memtag( +; CHECK-NEXT: @noattr_callee +; CHECK-NEXT: ret i32 +} + define i32 @test_safestack(i32 %arg) safestack { %x1 = call i32 @noattr_callee(i32 %arg) %x2 = call i32 @safestack_callee(i32 %x1) Index: llvm/test/Bitcode/attributes.ll === --- llvm/test/Bitcode/attributes.ll +++ llvm/test/Bitcode/attributes.ll @@ -204,7 +204,7 @@ ; CHECK: define void @f34() { call void @nobuiltin() nobuiltin -; CHECK: call void @nobuiltin() #37 +; CHECK: call void @nobuiltin() #38 ret void; } @@ -357,6 +357,12 @@ ret void } +; CHECK: define void @f61() #37 +define void @f61() sanitize_memtag +{ +ret void; +} + ; CHECK: attributes #0 = { noreturn } ; CHECK: attributes #1 = { nounwind } ; CHECK: attributes #2 = { readnone } @@ -394,4 +400,5 @@ ; CHECK: attributes #34 = { sanitize_hwaddress } ; CHECK: attributes #35 = { shadowcallstack } ; CHECK: attributes #36 = { willreturn } -; CHECK: attributes #37 = { nobuiltin } +; CHECK: attributes #37 = { sanitize_memtag } +; CHECK: attributes #38 = { nobuiltin } Index: llvm/lib/Transforms/Utils/CodeExtractor.cpp === ---
[PATCH] D64169: ARM MTE stack sanitizer.
eugenis created this revision. eugenis added reviewers: pcc, hctim, vitalybuka, ostannard. Herald added subscribers: dexonsmith, steven_wu, cryptoad, hiraditya, kristof.beyls, javed.absar, mehdi_amini, srhines. Herald added projects: clang, LLVM. Add "memtag" sanitizer that detects and mitigates stack memory issues using armv8.5 Memory Tagging Extension. It is similar in principle to HWASan, which is a software implementation of the same idea, but there are enough differencies to warrant a new sanitizer type IMHO. It is also expected to have very different performance properties. The new sanitizer does not have a runtime library (it may grow one later, along with a "debugging" mode). Similar to SafeStack and StackProtector, the instrumentation pass (in a follow up change) will be inserted in all cases, but will only affect functions marked with the new sanitize_memtag attribute. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D64169 Files: clang/include/clang/Basic/Features.def clang/include/clang/Basic/Sanitizers.def clang/lib/CodeGen/CGDeclCXX.cpp clang/lib/CodeGen/CodeGenFunction.cpp clang/lib/CodeGen/CodeGenModule.cpp clang/lib/CodeGen/SanitizerMetadata.cpp clang/lib/Driver/SanitizerArgs.cpp clang/lib/Driver/ToolChains/Linux.cpp clang/test/CodeGen/memtag-attr.cpp clang/test/Driver/fsanitize.c clang/test/Lexer/has_feature_memtag_sanitizer.cpp clang/test/SemaCXX/attr-no-sanitize.cpp llvm/docs/BitCodeFormat.rst llvm/docs/LangRef.rst llvm/include/llvm/Bitcode/LLVMBitCodes.h llvm/include/llvm/IR/Attributes.td llvm/lib/AsmParser/LLLexer.cpp llvm/lib/AsmParser/LLParser.cpp llvm/lib/AsmParser/LLToken.h llvm/lib/Bitcode/Reader/BitcodeReader.cpp llvm/lib/Bitcode/Writer/BitcodeWriter.cpp llvm/lib/IR/Attributes.cpp llvm/lib/IR/Verifier.cpp llvm/lib/Transforms/IPO/ForceFunctionAttrs.cpp llvm/lib/Transforms/Utils/CodeExtractor.cpp llvm/test/Bitcode/attributes.ll llvm/test/Transforms/Inline/attributes.ll llvm/utils/emacs/llvm-mode.el Index: llvm/utils/emacs/llvm-mode.el === --- llvm/utils/emacs/llvm-mode.el +++ llvm/utils/emacs/llvm-mode.el @@ -26,7 +26,7 @@ "inaccessiblemem_or_argmemonly" "inlinehint" "jumptable" "minsize" "naked" "nobuiltin" "noduplicate" "noimplicitfloat" "noinline" "nonlazybind" "noredzone" "noreturn" "norecurse" "nounwind" "optnone" "optsize" "readnone" "readonly" "returns_twice" - "speculatable" "ssp" "sspreq" "sspstrong" "safestack" "sanitize_address" "sanitize_hwaddress" + "speculatable" "ssp" "sspreq" "sspstrong" "safestack" "sanitize_address" "sanitize_hwaddress" "sanitize_memtag" "sanitize_thread" "sanitize_memory" "strictfp" "uwtable" "writeonly" "immarg") 'symbols) . font-lock-constant-face) ;; Variables '("%[-a-zA-Z$._][-a-zA-Z$._0-9]*" . font-lock-variable-name-face) Index: llvm/test/Transforms/Inline/attributes.ll === --- llvm/test/Transforms/Inline/attributes.ll +++ llvm/test/Transforms/Inline/attributes.ll @@ -22,6 +22,10 @@ ret i32 %i } +define i32 @sanitize_memtag_callee(i32 %i) sanitize_memtag { + ret i32 %i +} + define i32 @safestack_callee(i32 %i) safestack { ret i32 %i } @@ -50,6 +54,10 @@ ret i32 %i } +define i32 @alwaysinline_sanitize_memtag_callee(i32 %i) alwaysinline sanitize_memtag { + ret i32 %i +} + define i32 @alwaysinline_safestack_callee(i32 %i) alwaysinline safestack { ret i32 %i } @@ -104,6 +112,17 @@ ; CHECK-NEXT: ret i32 } +define i32 @test_no_sanitize_memtag(i32 %arg) { + %x1 = call i32 @noattr_callee(i32 %arg) + %x2 = call i32 @sanitize_memtag_callee(i32 %x1) + %x3 = call i32 @alwaysinline_callee(i32 %x2) + %x4 = call i32 @alwaysinline_sanitize_memtag_callee(i32 %x3) + ret i32 %x4 +; CHECK-LABEL: @test_no_sanitize_memtag( +; CHECK-NEXT: @sanitize_memtag_callee +; CHECK-NEXT: ret i32 +} + ; Check that: ; * noattr callee is not inlined into sanitize_(address|memory|thread) caller, @@ -154,6 +173,17 @@ ; CHECK-NEXT: ret i32 } +define i32 @test_sanitize_memtag(i32 %arg) sanitize_memtag { + %x1 = call i32 @noattr_callee(i32 %arg) + %x2 = call i32 @sanitize_memtag_callee(i32 %x1) + %x3 = call i32 @alwaysinline_callee(i32 %x2) + %x4 = call i32 @alwaysinline_sanitize_memtag_callee(i32 %x3) + ret i32 %x4 +; CHECK-LABEL: @test_sanitize_memtag( +; CHECK-NEXT: @noattr_callee +; CHECK-NEXT: ret i32 +} + define i32 @test_safestack(i32 %arg) safestack { %x1 = call i32 @noattr_callee(i32 %arg) %x2 = call i32 @safestack_callee(i32 %x1) Index: llvm/test/Bitcode/attributes.ll === --- llvm/test/Bitcode/attributes.ll +++ llvm/test/Bitcode/attributes.ll @@ -204,7 +204,7 @@ ; CHECK: define void @f34() { call void @nobuiltin() nobuiltin -; CHECK: call void @nobuiltin() #37 +; CHECK: call