hans added inline comments.

================
Comment at: llvm/lib/CodeGen/CommandFlags.cpp:462
+  static cl::opt<bool> EnableJMCInstrument(
+      "enable-jmc-instrument",
+      cl::desc("Instrument functions with a call to 
__CheckForDebuggerJustMyCode"),
----------------
ychen wrote:
> hans wrote:
> > Other "on/off" options don't seem to have "enable" in the name or flag 
> > spelling, e.g. "-strict-dwarf", not "-enable-strict-dwarf". Maybe this 
> > should be just "-jmc-instrument" and JMCInstrument?
> The "-jmc-instrument" is already used by the pass itself (`#define DEBUG_TYPE 
> "jmc-instrument"`). The `DEBUG_TYPE` one enables `opt -jmc-instrument`; this 
> makes `llc -enable-jmc-instrument` to run the pass in IR codegen pipeline.
> 
> Just renamed `cl::opt<bool> EnableJMCInstrument` to `cl::opt<bool> 
> JMCInstrument`.
Maybe the fact that -jmc-instrument is used by the IR pass is a hint that there 
shouldn't be an llc option for this, then? Looking at the other options here, 
they're all about codegen features, whereas the instrumentation in this patch 
really happens at a higher level.


================
Comment at: llvm/lib/CodeGen/JMCInstrumenter.cpp:111
+
+void createDefaultCheckFunction(Module &M, const char *CheckFunctionName,
+                                bool Is32Bit) {
----------------
aganea wrote:
> hans wrote:
> > What's the purpose of the default check function? Doesn't the CRT always 
> > provide one? (And if it doesn't, will JMC work at all?)
> @hans That's what MSVC does, to avoid a linker error if the CRT isn't linked 
> in:
> ```
> D:\git\llvm-project>cat main.cpp
> int main() { }
> D:\git\llvm-project>cl main.cpp /JMC /Z7 /c
> Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30139 for x64
> Copyright (C) Microsoft Corporation.  All rights reserved.
> 
> main.cpp
> 
> D:\git\llvm-project>dumpbin /disasm main.obj
> Microsoft (R) COFF/PE Dumper Version 14.29.30139.0
> Copyright (C) Microsoft Corporation.  All rights reserved.
> 
> 
> Dump of file main.obj
> 
> File Type: COFF OBJECT
> 
> main:
>   0000000000000000: 48 83 EC 28        sub         rsp,28h
>   0000000000000004: 48 8D 0D 00 00 00  lea         rcx,[__BB04C4AD_main@cpp]
>                     00
>   000000000000000B: E8 00 00 00 00     call        
> __CheckForDebuggerJustMyCode
>   0000000000000010: 33 C0              xor         eax,eax
>   0000000000000012: 48 83 C4 28        add         rsp,28h
>   0000000000000016: C3                 ret
> 
> __JustMyCode_Default:
>   0000000000000000: C2 00 00           ret         0
> 
>   Summary
> 
>           50 .chks64
>          228 .debug$S
>          3EC .debug$T
>           70 .drectve
>            1 .msvcjmc
>            C .pdata
>           1A .text$mn
>            8 .xdata
> 
> D:\git\llvm-project>dumpbin /all main.obj | grep -B12 -A5 'COMDAT; sym= 
> __JustMyCode_Default'
> SECTION HEADER #5
> .text$mn name
>        0 physical address
>        0 virtual address
>        3 size of raw data
>      438 file pointer to raw data (00000438 to 0000043A)
>        0 file pointer to relocation table
>        0 file pointer to line numbers
>        0 number of relocations
>        0 number of line numbers
> 60501020 flags
>          Code
>          COMDAT; sym= __JustMyCode_Default
>          16 byte align
>          Execute Read
> 
> RAW DATA #5
>   00000000: C2 00 00                                         □..
> ```
Thanks, I see. Doing the same as MSVC seems fine, but I'm curious why they 
chose this approach.. as far as I understand, JMC will not work for the binary 
in this scenario, so avoiding the link error is not obviously better.


================
Comment at: llvm/lib/CodeGen/JMCInstrumenter.cpp:175
+        M.getOrInsertFunction(CheckFunctionName, getCheckFunctionType(Ctx));
+    // FIXME: caching the flag name to prevent repetitive hashing?
+    std::string FlagName = getFlagName(*SP, Is32Bit);
----------------
ychen wrote:
> hans wrote:
> > Hashing is cheap, but since we're likely to use the same filename again and 
> > again, and it does take some string manipulation, maybe caching the result 
> > is a good idea. Actually, could we cache the flag Constant rather than the 
> > name?
> Yep, used `DenseMap<DISubprogram *, Constant *>`.
Nice!


================
Comment at: llvm/lib/CodeGen/JMCInstrumenter.cpp:145
+  LLVMContext &Ctx = M.getContext();
+  bool UseX86FastCall = Triple(M.getTargetTriple()).getArch() == Triple::x86;
+
----------------
I still worry a bit about the target-specific code here. Normally, IR passes 
don't have any target-specific knowledge, but ask classes such as 
TargetTransformInfo for target-specific details, or possibly take them as input 
to the pass. For example, see llvm/lib/Transforms/CFGuard/CFGuard.cpp

I'm also not sure that lib/CodeGen/ is the right place for this pass, since 
most files there seem to be machine-IR passes. Maybe the natural place for this 
would be lib/Transforms/Instrumentation/? Is there some good pass we can 
compare this with?


================
Comment at: llvm/lib/CodeGen/JMCInstrumenter.cpp:147
+
+  auto GetOrCreateCheckFunctionDecl = [&, Decl = FunctionCallee()]() mutable {
+    if (Decl)
----------------
This kind of mutable lambda feels pretty subtle to me. I think something like 
the below would be more straight-forward.

```
Function *CheckFunction = nullptr;
for (...) {
  ...
  if (!CheckFunction) {
    // Create the decl here.
  }
}
```

But if you strongly prefer the lambda, I suppose it's okay.


================
Comment at: llvm/lib/CodeGen/JMCInstrumenter.cpp:163
+
+  auto GetOrCreateFlag = [&, SavedFlags = DenseMap<DISubprogram *, Constant *>(
+                                 8)](DISubprogram &SP) mutable {
----------------
Same comment as for the lambda above. I think it would be more straight-forward 
to just keep the DenseMap outside the loop and just put the code to use/create 
the Constant in the loop.


================
Comment at: llvm/test/CodeGen/X86/jmc-instrument.ll:2
+; Check that the flag symbol is not full-qualified.
+; RUN: llc < %s -enable-jmc-instrument | FileCheck %s
+
----------------
Since it's an IR pass, I think we don't need to have an llc test at all.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D118428/new/

https://reviews.llvm.org/D118428

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to