@jarkko it's just the section interleaving changing for every new feature that drives me nuts.
@jarkko another way to think of it is:
If the function isn't inlined anywhere, then it just has a DW_TAG_subprogram entry containing all of the information.
If it is inlined, then it still has a DW_TAG_subprogram entry containing variable names, source locations, etc. (the abstract instance), and it also has a DW_TAG_inlined_subroutine entry at each call site where it is inlined (the concrete instances).
1/2
@jarkko Additionally, if it is inlined anywhere AND a normal function was emitted (e.g., because it is not static or it is used via a function pointer), there is another DW_TAG_subprogram containing variable locations, call frame information, etc. (the concrete out-of-line instance).
I actually just had to fix a bug in drgn regarding out-of-line instances: https://github.com/osandov/drgn/issues/147
2/2
@jarkko I'm happy to answer questions about DWARF that you or anyone else encounter in the future!