[PATCH] D118428: [clang-cl] Support the /JMC flag
Yuanfang Chen via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 27 19:59:18 PST 2022
ychen created this revision.
ychen added reviewers: rnk, aganea, hans.
Herald added subscribers: ormris, dexonsmith, dang, pengfei, hiraditya, mgorny.
ychen requested review of this revision.
Herald added projects: clang, LLVM.
Herald added subscribers: llvm-commits, cfe-commits.
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 a 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 a ELF port in a separate patch).
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D118428
Files:
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/CodeGenOptions.def
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/include/clang/Driver/Options.td
clang/lib/CodeGen/BackendUtil.cpp
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/Driver/cl-options.c
llvm/include/llvm/CodeGen/CommandFlags.h
llvm/include/llvm/CodeGen/Passes.h
llvm/include/llvm/InitializePasses.h
llvm/include/llvm/LinkAllPasses.h
llvm/include/llvm/Target/TargetOptions.h
llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
llvm/lib/CodeGen/CMakeLists.txt
llvm/lib/CodeGen/CodeGen.cpp
llvm/lib/CodeGen/CommandFlags.cpp
llvm/lib/CodeGen/JMCInstrumenter.cpp
llvm/lib/CodeGen/TargetInstrInfo.cpp
llvm/lib/CodeGen/TargetPassConfig.cpp
llvm/test/CodeGen/X86/jmc-instrument-32bit.ll
llvm/test/CodeGen/X86/jmc-instrument.ll
llvm/tools/opt/opt.cpp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118428.403866.patch
Type: text/x-patch
Size: 34739 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220128/a869db4f/attachment-0001.bin>
More information about the cfe-commits
mailing list