The introduction and some examples are on this page:
https://devblogs.microsoft.com/cppblog/announcing-jmc-stepping-in-visual-studio/
The /JMC flag enables these instrumentations:
- Insert at the beginning of every function immediately after the prologue with a call to void __fastcall __CheckForDebuggerJustMyCode(unsigned char *JMC_flag). The argument for __CheckForDebuggerJustMyCode is the address of a boolean global variable (the global variable is initialized to 1) with the name convention __<hash>_<filename>. All such global variables are placed in the .msvcjmc section.
- The <hash> part of __<hash>_<filename> has a one-to-one mapping with a directory path. MSVC uses some unknown hashing function. Here I used DJB.
- Add a dummy/empty COMDAT function __JustMyCode_Default.
- Add /alternatename:__CheckForDebuggerJustMyCode=__JustMyCode_Default link option via ".drectve" section. This is to prevent failure in case __CheckForDebuggerJustMyCode is not provided during linking.
Implementation:
All the instrumentations are implemented in an IR codegen pass. The pass is placed immediately before CodeGenPrepare pass. This is to not interfere with mid-end optimizations and make the instrumentation target-independent (I'm still working on an ELF port in a separate patch).
The cc1 flag is more of an implementation detail, so not sure it's worth mentioning in the release notes. Or do we want "clang -fjmc" to work?