This is an archive of the discontinued LLVM Phabricator instance.

[Clang] Allow __declspec(noalias) to access inaccessible memory
ClosedPublic

Authored by nikic on Aug 28 2023, 6:41 AM.

Details

Summary

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.

Diff Detail

Event Timeline

nikic created this revision.Aug 28 2023, 6:41 AM
nikic requested review of this revision.Aug 28 2023, 6:41 AM
rnk accepted this revision.Aug 28 2023, 2:46 PM

lgtm

This revision is now accepted and ready to land.Aug 28 2023, 2:46 PM
Herald added a project: Restricted Project. · View Herald TranscriptAug 29 2023, 2:44 AM
Herald added a subscriber: cfe-commits. · View Herald Transcript