Author: Nikita Popov Date: 2023-08-29T11:43:57+02:00 New Revision: 14cc7a07727555102c52e711f476ec7671317d6a
URL: https://github.com/llvm/llvm-project/commit/14cc7a07727555102c52e711f476ec7671317d6a DIFF: https://github.com/llvm/llvm-project/commit/14cc7a07727555102c52e711f476ec7671317d6a.diff LOG: [Clang] Allow __declspec(noalias) to access inaccessible memory MSVC defines __declspec(noalias) as follows (https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/k649tyc7(v=vs.110)?redirectedfrom=MSDN): > noalias means that a function call does not modify or reference > visible global state and only modifies the memory pointed to > directly by pointer parameters (first-level indirections). > If a function is annotated as noalias, the optimizer can assume > that, in addition to the parameters themselves, only first-level > indirections of pointer parameters are referenced or modified > inside the function. The visible global state is the set of all > data that is not defined or referenced outside of the compilation > scope, and their address is not taken. The compilation scope is > all source files (/LTCG (Link-time Code Generation) builds) or a > single source file (non-/LTCG build). The wording is not super clear to me, but I believe this is saying that __declspec(noalias) functions may access inaccessible memory (i.e. non-visible global state in their words). Indeed, the Windows CRT applies this attribute to malloc, which does access inaccessible memory under LLVM's memory model. As such, change the attribute to emit memory(argmem: readwrite, inaccessiblemem: readwrite) instead of memory(argmem: readwrite). Fixes https://github.com/llvm/llvm-project/issues/64827. Differential Revision: https://reviews.llvm.org/D158984 Added: Modified: clang/lib/CodeGen/CGCall.cpp clang/test/CodeGen/ms-declspecs.c Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index e323ddf8bedae9..ca31675ca4f3b8 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -2375,7 +2375,7 @@ void CodeGenModule::ConstructAttributeList(StringRef Name, // gcc specifies that 'pure' functions cannot have infinite loops. FuncAttrs.addAttribute(llvm::Attribute::WillReturn); } else if (TargetDecl->hasAttr<NoAliasAttr>()) { - FuncAttrs.addMemoryAttr(llvm::MemoryEffects::argMemOnly()); + FuncAttrs.addMemoryAttr(llvm::MemoryEffects::inaccessibleOrArgMemOnly()); FuncAttrs.addAttribute(llvm::Attribute::NoUnwind); } if (TargetDecl->hasAttr<RestrictAttr>()) diff --git a/clang/test/CodeGen/ms-declspecs.c b/clang/test/CodeGen/ms-declspecs.c index e390dddbe2b476..3029559942f12b 100644 --- a/clang/test/CodeGen/ms-declspecs.c +++ b/clang/test/CodeGen/ms-declspecs.c @@ -41,4 +41,4 @@ void noalias_caller(int *x) { noalias_callee(x); } // CHECK: attributes [[NUW]] = { nounwind{{.*}} } // CHECK: attributes [[NI]] = { noinline nounwind{{.*}} } // CHECK: attributes [[NR]] = { noreturn } -// CHECK: attributes [[NA]] = { nounwind memory(argmem: readwrite){{.*}} } +// CHECK: attributes [[NA]] = { nounwind memory(argmem: readwrite, inaccessiblemem: readwrite){{.*}} } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits