ychen 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:
> > ychen wrote:
> > > hans wrote:
> > > > 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.
> > > There are three kinds of passes (each in a separate pipeline), in the 
> > > order of execution: IR optimization passes, IR codegen passes (some 
> > > examples are here: 
> > > https://github.com/llvm/llvm-project/blob/1d0244aed78114d5bd03ec4930d7687d6e587f99/llvm/include/llvm/CodeGen/MachinePassRegistry.def#L38-L51
> > >  and 
> > > https://github.com/llvm/llvm-project/blob/1d0244aed78114d5bd03ec4930d7687d6e587f99/llvm/include/llvm/CodeGen/MachinePassRegistry.def#L106-L121)
> > >  and MIR codegen passes. The JMC pass is an IR codegen passes. It runs 
> > > within the codegen phase, but it transforms IR and it is tested using the 
> > > `opt` tool. The llc option is for testing that the pass could be enabled 
> > > using `TargetOptions::JMCInstrument` (clang uses this), the change in 
> > > `llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp` and this option enables 
> > > LTO+JMC with `lld -mllvm -enable-jmc-instrument`. 
> > Thanks for the pointer, the IR codegen passes is something I'm not very 
> > familiar with.
> > 
> > Just looking at a few of the first ones you linked to, I see that they live 
> > under lib/Transforms/. And when I look in lib/CodeGen/ the vast majority of 
> > those work on MachineFunctions -- but not all. So I'm not really sure how 
> > we decide what should go where?
> > 
> > I think the best way is to look for a similar pass and see how that works. 
> > Maybe llvm/lib/Transforms/CFGuard/CFGuard.cpp could be a good example, 
> > since it's also inserting Windows-specific instrumentation at the IR level, 
> > similar to this pass.
> Looking into the CFGuard passes, I think they are all "IR codegen passes". I 
> have no idea why they need to stay in lib/Transform (and in their own library 
> `LLVMCFGuard`) instead of in lib/CodeGen. I would argue that they should 
> probably be in `lib/CodeGen` instead. Hi @rnk , any idea about this?
Any objection if I keep the JMC pass in CodeGen and move CFGuard pass to 
CodeGen in a separate patch?


================
Comment at: llvm/lib/CodeGen/JMCInstrumenter.cpp:145
+  LLVMContext &Ctx = M.getContext();
+  bool UseX86FastCall = Triple(M.getTargetTriple()).getArch() == Triple::x86;
+
----------------
rnk wrote:
> ychen wrote:
> > ychen wrote:
> > > hans wrote:
> > > > 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?
> > > > 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
> > > Understood. `TargetTransformInfo` is mostly for the "IR optimization 
> > > passes". The JMC pass is "IR codegen passes", it is more similar to 
> > > `CodeGenPrepare` pass than any "IR optimization passes". I think we could 
> > > move the target-specific stuff into the `TargetPassConfig` & its derived 
> > > classes, not in this patch, but the following ELF port one. WDYT?
> > > > 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
> > > Understood. `TargetTransformInfo` is mostly for the "IR optimization 
> > > passes". The JMC pass is "IR codegen passes", it is more similar to 
> > > `CodeGenPrepare` pass than any "IR optimization passes". I think we could 
> > > move the target-specific stuff into the `TargetPassConfig` & its derived 
> > > classes, not in this patch, but the following ELF port one. WDYT?
> > 
> > Scratch that. I think this is more OS/platform-specific than 
> > target-specific. For X86, MSVC COFF and ELF are likely to have different 
> > symbol mangling and section naming preferences. And this information is 
> > pretty specific to JMC, like section name '.msvcjmc'. I think only X86 COFF 
> > has this `weird` mangling happen in LLVM codegen instead of the frontend. 
> > For non-x86 COFF and ELF, the handling is pretty much the same. So it may 
> > not be worth the effort of putting small pieces of OS/platform-specific 
> > information elsewhere?
> I think the existing PGO passes do a variety of target-specific things, and 
> they live in lib/Transforms/Instrumentation. For example, they pick different 
> section names for ELF and COFF.
> 
> This seems like the function entry/exit instrumentation, and I wonder if it 
> should be added as part of the CodeGenPassBuilder.h list of passes.
 > This seems like the function entry/exit instrumentation, and I wonder if it 
 > should be added as part of the CodeGenPassBuilder.h list of passes.

Yeah, it should. CodeGenPassBuilder.h is already lagging behind 
TargetPassConfig by far. I could take care of it when making 
`CodeGenPassBuilder.h` have parity with TargetPassConfig in terms of all lit 
tests.


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