[llvm-dev] How can I get the opcode length of an IR instruction in LLVM?

Tim Northover via llvm-dev llvm-dev at lists.llvm.org
Mon Feb 27 07:55:10 PST 2017


On 27 February 2017 at 07:24, Mohsen Ahmadvand via llvm-dev <llvm->
> Is this in general possible?

Definitely not. Just about every pathology you can imagine could happen:

  * Multiple IR instructions can be combined into a single target
instruction (without any information tracking which instructions it
came from).
  * A single IR instruction can produce multiple target instructions.
  * Some target instructions don't correspond to any IR instruction
(ABI handling, register spills to the stack).
  * Some IR instructions produce no target instructions (unreachable
for example). This might be the easiest to handle.

> How to hack the backend to dump the required informations? Is there a
> generic way to do so, or do I need to hack all backends?

The size is only really known at the very end of the compilation
pipeline (low-level optimizations like compressing branches can affect
the size and happen last). The functions where it happens are
MCObjectStreamer::EmitInstruction and friends.

So bearing in mind that you'll only ever get an approximation, you
could attach debug-info to the IR pointing back at itself (i.e. debug
info for LLVM IR instead of a higher-level language). You could hack a
check for that during emission and count the bytes that came from any
particular line/inst.

There used to be a pass to add this kind of debug info to IR, but it
bit-rotted and got removed a while back. Should still be in the git
history somewhere though.

Cheers.

Tim.


More information about the llvm-dev mailing list