rust/compiler
bors 154ae32a55 Auto merge of #114643 - dpaoliello:inlinedebuginfo, r=wesleywiser
Use the same DISubprogram for each instance of the same inlined function within a caller

# Issue Details:
The call to `panic` within a function like `Option::unwrap` is translated to LLVM as a `tail call` (as it will never return), when multiple calls to the same function like this is inlined LLVM will notice the common `tail call` block (i.e., loading the same panic string + location info and then calling `panic`) and merge them together.

When merging these instructions together, LLVM will also attempt to merge the debug locations as well, but this fails (i.e., debug info is dropped) as Rust emits a new `DISubprogram` at each inline site thus LLVM doesn't recognize that these are actually the same function and so thinks that there isn't a common debug location.

As an example of this when building for x86_64 Windows (note the lack of `.cv_loc` before the call to `panic`, thus it will be attributed to the same line at the `addq` instruction):

```
	.cv_loc	0 1 23 0                        # src\lib.rs:23:0
	addq	$40, %rsp
	retq
	leaq	.Lalloc_f570dea0a53168780ce9a91e67646421(%rip), %rcx
	leaq	.Lalloc_629ace53b7e5b76aaa810d549cc84ea3(%rip), %r8
	movl	$43, %edx
	callq	_ZN4core9panicking5panic17h12e60b9063f6dee8E
	int3
```

# Fix Details:
Cache the `DISubprogram` emitted for each inlined function instance within a caller so that this can be reused if that instance is encountered again, this also requires caching the `DILexicalBlock` and `DIVariable` objects to avoid creating duplicates.

After this change the above assembly now looks like:

```
	.cv_loc	0 1 23 0                        # src\lib.rs:23:0
	addq	$40, %rsp
	retq
	.cv_inline_site_id 5 within 0 inlined_at 1 0 0
	.cv_inline_site_id 6 within 5 inlined_at 1 12 0
	.cv_loc	6 2 935 0                       # library\core\src\option.rs:935:0
	leaq	.Lalloc_5f55955de67e57c79064b537689facea(%rip), %rcx
	leaq	.Lalloc_e741d4de8cb5801e1fd7a6c6795c1559(%rip), %r8
	movl	$43, %edx
	callq	_ZN4core9panicking5panic17hde1558f32d5b1c04E
	int3
```
2023-08-22 20:15:29 +00:00
..
rustc inline format!() args up to and including rustc_middle 2023-07-30 13:18:33 +02:00
rustc_abi Add internal_features lint 2023-08-03 14:50:50 +02:00
rustc_arena Address comments 2023-08-14 21:29:19 +02:00
rustc_ast Fix a stack overflow with long else if chains 2023-08-19 13:11:16 +02:00
rustc_ast_lowering Move scrutinee HirId into MatchSource::TryDesugar 2023-08-14 21:43:56 +00:00
rustc_ast_passes rustc: Move features from Session to GlobalCtxt 2023-08-11 16:51:50 +08:00
rustc_ast_pretty Add helpful comments to tt_prepend_space. 2023-08-17 09:01:05 +10:00
rustc_attr rustc: Move features from Session to GlobalCtxt 2023-08-11 16:51:50 +08:00
rustc_baked_icu_data Regen baked data 2023-05-02 10:45:16 -07:00
rustc_borrowck give some unwind-related terminators a more clear name 2023-08-20 15:52:38 +02:00
rustc_builtin_macros rustc: Move features from Session to GlobalCtxt 2023-08-11 16:51:50 +08:00
rustc_codegen_cranelift give some unwind-related terminators a more clear name 2023-08-20 15:52:38 +02:00
rustc_codegen_gcc Auto merge of #114643 - dpaoliello:inlinedebuginfo, r=wesleywiser 2023-08-22 20:15:29 +00:00
rustc_codegen_llvm Auto merge of #114643 - dpaoliello:inlinedebuginfo, r=wesleywiser 2023-08-22 20:15:29 +00:00
rustc_codegen_ssa Auto merge of #114643 - dpaoliello:inlinedebuginfo, r=wesleywiser 2023-08-22 20:15:29 +00:00
rustc_const_eval avoid return in tail position 2023-08-20 15:52:40 +02:00
rustc_data_structures Auto merge of #114339 - ttsugriy:unsafe-utf8, r=davidtwco 2023-08-08 10:25:37 +00:00
rustc_driver Update rustix 2023-07-03 07:20:51 +00:00
rustc_driver_impl rustc: Move crate_types from Session to GlobalCtxt 2023-08-09 14:17:54 +08:00
rustc_error_codes Fix syntax in E0191 explanation. 2023-08-21 18:45:51 +07:00
rustc_error_messages Add internal_features lint 2023-08-03 14:50:50 +02:00
rustc_errors fix 2023-08-18 15:19:23 +08:00
rustc_expand Auto merge of #114915 - nnethercote:Nonterminal-cleanups, r=petrochenkov 2023-08-18 16:07:40 +00:00
rustc_feature Add the relocation_model to the cfg 2023-08-18 19:57:28 +02:00
rustc_fluent_macro Fix diagnostics with errors 2023-05-26 10:44:18 +00:00
rustc_fs_util Add try_canonicalize to rustc_fs_util and use it over fs::canonicalize 2023-03-16 21:50:23 +01:00
rustc_graphviz enable rust_2018_idioms for doctests 2023-05-07 00:12:29 +03:00
rustc_hir Move scrutinee HirId into MatchSource::TryDesugar 2023-08-14 21:43:56 +00:00
rustc_hir_analysis Rollup merge of #115077 - estebank:issue-115019, r=compiler-errors 2023-08-22 09:00:49 -07:00
rustc_hir_pretty Auto merge of #114545 - fee1-dead-contrib:lower-impl-effect, r=oli-obk 2023-08-08 19:23:41 +00:00
rustc_hir_typeck Auto merge of #115018 - matthiaskrgr:rollup-pxj0qdb, r=matthiaskrgr 2023-08-20 08:11:08 +00:00
rustc_incremental Ignore unexpected incr-comp session dirs 2023-08-18 19:57:41 +02:00
rustc_index Convert it into a warning 2023-08-22 09:17:46 +00:00
rustc_infer Auto merge of #114611 - nnethercote:type-system-chess, r=compiler-errors 2023-08-18 06:29:38 +00:00
rustc_interface Fix review comment 2023-08-14 16:16:51 +00:00
rustc_lexer Update lexer emoji diagnostics to Unicode 15.0 2023-07-29 08:47:21 +08:00
rustc_lint Rollup merge of #115011 - compiler-errors:warn-on-elided-assoc-ct-lt, r=cjgillot 2023-08-22 09:00:49 -07:00
rustc_lint_defs Auto merge of #115104 - compiler-errors:rollup-8235xz5, r=compiler-errors 2023-08-22 16:16:32 +00:00
rustc_llvm add a csky-unknown-linux-gnuabiv2 target 2023-08-14 23:02:36 +08:00
rustc_log inline format!() args up to and including rustc_middle 2023-07-30 13:18:33 +02:00
rustc_macros Make enum decoding errors more informative. 2023-08-18 16:50:41 +10:00
rustc_metadata Remove metadata_loader query 2023-08-13 16:38:50 +00:00
rustc_middle Auto merge of #114993 - RalfJung:panic-nounwind, r=fee1-dead 2023-08-20 22:01:18 +00:00
rustc_mir_build give some unwind-related terminators a more clear name 2023-08-20 15:52:38 +02:00
rustc_mir_dataflow give some unwind-related terminators a more clear name 2023-08-20 15:52:38 +02:00
rustc_mir_transform Auto merge of #114993 - RalfJung:panic-nounwind, r=fee1-dead 2023-08-20 22:01:18 +00:00
rustc_monomorphize give some unwind-related terminators a more clear name 2023-08-20 15:52:38 +02:00
rustc_parse Fix a stack overflow with long else if chains 2023-08-19 13:11:16 +02:00
rustc_parse_format Fix unit tests 2023-07-19 16:37:09 +00:00
rustc_passes remove redundant var rebindings 2023-08-19 14:09:30 +02:00
rustc_plugin_impl Add rustc_fluent_macro to decouple fluent from rustc_macros 2023-04-18 18:56:22 +00:00
rustc_privacy Use {Local}ModDefId in many queries 2023-08-14 07:22:48 +00:00
rustc_query_impl Add internal_features lint 2023-08-03 14:50:50 +02:00
rustc_query_system Remove conditional use of Sharded from query caches 2023-08-16 14:16:05 +02:00
rustc_resolve Rollup merge of #115011 - compiler-errors:warn-on-elided-assoc-ct-lt, r=cjgillot 2023-08-22 09:00:49 -07:00
rustc_serialize Upgrade to indexmap 2.0.0 2023-07-03 13:51:54 -07:00
rustc_session unknown unstable lint command line 2023-08-22 18:58:39 +08:00
rustc_smir stable_mir: docs clarification 2023-08-21 13:55:17 +02:00
rustc_span Auto merge of #114332 - nbdd0121:riscv, r=compiler-errors 2023-08-20 04:38:08 +00:00
rustc_symbol_mangling Auto merge of #114672 - lenawanel:master, r=compiler-errors 2023-08-11 09:30:41 +00:00
rustc_target Add the relocation_model to the cfg 2023-08-18 19:57:28 +02:00
rustc_trait_selection instantiate response: no unnecessary new universe 2023-08-18 23:55:28 +02:00
rustc_traits refactor(rustc_middle): Substs -> GenericArg 2023-07-14 13:27:35 +01:00
rustc_transmute Don't attempt to compute layout of type referencing error 2023-07-27 18:24:08 +00:00
rustc_ty_utils Rollup merge of #114670 - compiler-errors:issue-114660, r=cjgillot 2023-08-09 23:00:00 +02:00
rustc_type_ir Revert "Implement references VarDebugInfo." 2023-08-17 17:02:04 +00:00