commit:     54a252cdb1c7b70683f017d12297352b95e8b8ec
Author:     orbea <orbea <AT> riseup <DOT> net>
AuthorDate: Tue Dec 10 16:48:04 2024 +0000
Commit:     orbea <orbea <AT> riseup <DOT> net>
CommitDate: Tue Dec 10 17:14:30 2024 +0000
URL:        https://gitweb.gentoo.org/repo/proj/libressl.git/commit/?id=54a252cd

dev-lang/rust: add 1.82.0-r101, 1.83.0-r1, drop 1.83.0

Signed-off-by: orbea <orbea <AT> riseup.net>

 .../rust/files/1.82.0-dwarf-llvm-assertion.patch   | 247 +++++++++++++++++++++
 .../rust/files/1.83.0-dwarf-llvm-assertion.patch   | 242 ++++++++++++++++++++
 ...{rust-1.83.0.ebuild => rust-1.82.0-r101.ebuild} |  51 +++--
 .../{rust-1.83.0.ebuild => rust-1.83.0-r1.ebuild}  |   1 +
 4 files changed, 524 insertions(+), 17 deletions(-)

diff --git a/dev-lang/rust/files/1.82.0-dwarf-llvm-assertion.patch 
b/dev-lang/rust/files/1.82.0-dwarf-llvm-assertion.patch
new file mode 100644
index 0000000..8c99c9a
--- /dev/null
+++ b/dev-lang/rust/files/1.82.0-dwarf-llvm-assertion.patch
@@ -0,0 +1,247 @@
+https://bugs.gentoo.org/942013
+https://bugs.gentoo.org/942884
+https://github.com/rust-lang/rust/issues/131944
+https://github.com/rust-lang/rust/pull/132613
+
+From 1dc106121b62562ead6e7d612fa136dc4b35cd5d Mon Sep 17 00:00:00 2001
+From: Kyle Huey <[email protected]>
+Date: Mon, 4 Nov 2024 11:38:14 -0800
+Subject: [PATCH] Add discriminators to DILocations when multiple functions are
+ inlined into a single point.
+
+LLVM does not expect to ever see multiple dbg_declares for the same variable 
at the same
+location with different values. proc-macros make it possible for arbitrary 
code,
+including multiple calls that get inlined, to happen at any given location in 
the source
+code. Add discriminators when that happens so these locations are different to 
LLVM.
+
+This may interfere with the AddDiscriminators pass in LLVM, which is added by 
the
+unstable flag -Zdebug-info-for-profiling.
+
+Fixes #131944
+---
+ .../src/debuginfo/create_scope_map.rs         | 60 ++++++++++++++++++-
+ compiler/rustc_codegen_llvm/src/llvm/ffi.rs   |  4 ++
+ .../rustc_llvm/llvm-wrapper/RustWrapper.cpp   |  8 +++
+ .../auxiliary/macro_def.rs                    | 11 ++++
+ .../mir_inlined_twice_var_locs.rs             | 53 ++++++++++++++++
+ 5 files changed, 133 insertions(+), 3 deletions(-)
+ create mode 100644 tests/codegen/debuginfo-proc-macro/auxiliary/macro_def.rs
+ create mode 100644 
tests/codegen/debuginfo-proc-macro/mir_inlined_twice_var_locs.rs
+
+diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs 
b/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs
+index ac6c2fb1b83a6..0f1909486ec7e 100644
+--- a/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs
++++ b/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs
+@@ -1,11 +1,15 @@
++use std::collections::hash_map::Entry;
++
+ use rustc_codegen_ssa::mir::debuginfo::{DebugScope, FunctionDebugContext};
+ use rustc_codegen_ssa::traits::*;
++use rustc_data_structures::fx::FxHashMap;
+ use rustc_index::bit_set::BitSet;
+ use rustc_index::Idx;
+ use rustc_middle::mir::{Body, SourceScope};
+ use rustc_middle::ty::layout::FnAbiOf;
+ use rustc_middle::ty::{self, Instance};
+ use rustc_session::config::DebugInfo;
++use rustc_span::BytePos;
+ 
+ use super::metadata::file_metadata;
+ use super::utils::DIB;
+@@ -37,10 +41,20 @@ pub(crate) fn compute_mir_scopes<'ll, 'tcx>(
+         None
+     };
+     let mut instantiated = BitSet::new_empty(mir.source_scopes.len());
++    let mut discriminators = FxHashMap::default();
+     // Instantiate all scopes.
+     for idx in 0..mir.source_scopes.len() {
+         let scope = SourceScope::new(idx);
+-        make_mir_scope(cx, instance, mir, &variables, debug_context, &mut 
instantiated, scope);
++        make_mir_scope(
++            cx,
++            instance,
++            mir,
++            &variables,
++            debug_context,
++            &mut instantiated,
++            &mut discriminators,
++            scope,
++        );
+     }
+     assert!(instantiated.count() == mir.source_scopes.len());
+ }
+@@ -52,6 +66,7 @@ fn make_mir_scope<'ll, 'tcx>(
+     variables: &Option<BitSet<SourceScope>>,
+     debug_context: &mut FunctionDebugContext<'tcx, &'ll DIScope, &'ll 
DILocation>,
+     instantiated: &mut BitSet<SourceScope>,
++    discriminators: &mut FxHashMap<BytePos, u32>,
+     scope: SourceScope,
+ ) {
+     if instantiated.contains(scope) {
+@@ -60,7 +75,16 @@ fn make_mir_scope<'ll, 'tcx>(
+ 
+     let scope_data = &mir.source_scopes[scope];
+     let parent_scope = if let Some(parent) = scope_data.parent_scope {
+-        make_mir_scope(cx, instance, mir, variables, debug_context, 
instantiated, parent);
++        make_mir_scope(
++            cx,
++            instance,
++            mir,
++            variables,
++            debug_context,
++            instantiated,
++            discriminators,
++            parent,
++        );
+         debug_context.scopes[parent]
+     } else {
+         // The root is the function itself.
+@@ -117,7 +141,37 @@ fn make_mir_scope<'ll, 'tcx>(
+         // FIXME(eddyb) this doesn't account for the macro-related
+         // `Span` fixups that `rustc_codegen_ssa::mir::debuginfo` does.
+         let callsite_scope = parent_scope.adjust_dbg_scope_for_span(cx, 
callsite_span);
+-        cx.dbg_loc(callsite_scope, parent_scope.inlined_at, callsite_span)
++        let loc = cx.dbg_loc(callsite_scope, parent_scope.inlined_at, 
callsite_span);
++
++        // NB: In order to produce proper debug info for variables 
(particularly
++        // arguments) in multiply-inline functions, LLVM expects to see a 
single
++        // DILocalVariable with multiple different DILocations in the IR. 
While
++        // the source information for each DILocation would be identical, 
their
++        // inlinedAt attributes will be unique to the particular callsite.
++        //
++        // We generate DILocations here based on the callsite's location in 
the
++        // source code. A single location in the source code usually can't
++        // produce multiple distinct calls so this mostly works, until
++        // proc-macros get involved. A proc-macro can generate multiple calls
++        // at the same span, which breaks the assumption that we're going to
++        // produce a unique DILocation for every scope we process here. We
++        // have to explicitly add discriminators if we see inlines into the
++        // same source code location.
++        //
++        // Note further that we can't key this hashtable on the span itself,
++        // because these spans could have distinct SyntaxContexts. We have
++        // to key on exactly what we're giving to LLVM.
++        match discriminators.entry(callsite_span.lo()) {
++            Entry::Occupied(mut o) => {
++                *o.get_mut() += 1;
++                unsafe { 
llvm::LLVMRustDILocationCloneWithBaseDiscriminator(loc, *o.get()) }
++                    .expect("Failed to encode discriminator in DILocation")
++            }
++            Entry::Vacant(v) => {
++                v.insert(0);
++                loc
++            }
++        }
+     });
+ 
+     debug_context.scopes[scope] = DebugScope {
+diff --git a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs 
b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
+index 3d2e270a3868e..75a5ec44c2285 100644
+--- a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
++++ b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
+@@ -2174,6 +2174,10 @@ unsafe extern "C" {
+         Scope: &'a DIScope,
+         InlinedAt: Option<&'a DILocation>,
+     ) -> &'a DILocation;
++    pub fn LLVMRustDILocationCloneWithBaseDiscriminator<'a>(
++        Location: &'a DILocation,
++        BD: c_uint,
++    ) -> Option<&'a DILocation>;
+     pub fn LLVMRustDIBuilderCreateOpDeref() -> u64;
+     pub fn LLVMRustDIBuilderCreateOpPlusUconst() -> u64;
+     pub fn LLVMRustDIBuilderCreateOpLLVMFragment() -> u64;
+diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp 
b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
+index 9330c83b7f230..cd70c3f266920 100644
+--- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
++++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
+@@ -1305,6 +1305,14 @@ LLVMRustDIBuilderCreateDebugLocation(unsigned Line, 
unsigned Column,
+   return wrap(Loc);
+ }
+ 
++extern "C" LLVMMetadataRef
++LLVMRustDILocationCloneWithBaseDiscriminator(LLVMMetadataRef Location,
++                                             unsigned BD) {
++  DILocation *Loc = unwrapDIPtr<DILocation>(Location);
++  auto NewLoc = Loc->cloneWithBaseDiscriminator(BD);
++  return wrap(NewLoc.has_value() ? NewLoc.value() : nullptr);
++}
++
+ extern "C" uint64_t LLVMRustDIBuilderCreateOpDeref() {
+   return dwarf::DW_OP_deref;
+ }
+diff --git a/tests/codegen/debuginfo-proc-macro/auxiliary/macro_def.rs 
b/tests/codegen/debuginfo-proc-macro/auxiliary/macro_def.rs
+new file mode 100644
+index 0000000000000..159ecfd09743d
+--- /dev/null
++++ b/tests/codegen/debuginfo-proc-macro/auxiliary/macro_def.rs
+@@ -0,0 +1,11 @@
++//@ force-host
++//@ no-prefer-dynamic
++#![crate_type = "proc-macro"]
++
++extern crate proc_macro;
++use proc_macro::*;
++
++#[proc_macro]
++pub fn square_twice(_item: TokenStream) -> TokenStream {
++    "(square(env::vars().count() as i32), square(env::vars().count() as 
i32))".parse().unwrap()
++}
+diff --git a/tests/codegen/debuginfo-proc-macro/mir_inlined_twice_var_locs.rs 
b/tests/codegen/debuginfo-proc-macro/mir_inlined_twice_var_locs.rs
+new file mode 100644
+index 0000000000000..c3858044c0c9f
+--- /dev/null
++++ b/tests/codegen/debuginfo-proc-macro/mir_inlined_twice_var_locs.rs
+@@ -0,0 +1,53 @@
++//@ min-llvm-version: 19
++//@ compile-flags: -Cdebuginfo=2 -Copt-level=0 -Zmir-enable-passes=+Inline
++// MSVC is different because of the individual allocas.
++//@ ignore-msvc
++
++//@ aux-build:macro_def.rs
++
++// Find the variable.
++// CHECK-DAG: ![[#var_dbg:]] = !DILocalVariable(name: "n",{{( arg: 1,)?}} 
scope: ![[#var_scope:]]
++
++// Find both dbg_declares. These will proceed the variable metadata, of 
course, so we're looking
++// backwards.
++// CHECK-DAG: dbg_declare(ptr %n.dbg.spill{{[0-9]}}, ![[#var_dbg]], 
!DIExpression(), ![[#var_loc2:]])
++// CHECK-DAG: dbg_declare(ptr %n.dbg.spill, ![[#var_dbg]], !DIExpression(), 
![[#var_loc1:]])
++
++// Find the first location definition, looking forwards again.
++// CHECK: ![[#var_loc1]] = !DILocation
++// CHECK-SAME: scope: ![[#var_scope:]], inlinedAt: ![[#var_inlinedAt1:]]
++
++// Find the first location's inlinedAt
++// NB: If we fail here it's *probably* because we failed to produce two
++// different locations and ended up reusing an earlier one.
++// CHECK: ![[#var_inlinedAt1]] = !DILocation
++// CHECK-SAME: scope: ![[var_inlinedAt1_scope:]]
++
++// Find the second location definition, still looking forwards.
++// NB: If we failed to produce two different locations, the test will
++// definitely fail by this point (if it hasn't already) because we won't
++// be able to find the same line again.
++// CHECK: ![[#var_loc2]] = !DILocation
++// CHECK-SAME: scope: ![[#var_scope]], inlinedAt: ![[#var_inlinedAt2:]]
++
++// Find the second location's inlinedAt.
++// CHECK: ![[#var_inlinedAt2]] = !DILocation
++// CHECK-SAME: scope: ![[#var_inlinedAt2_scope:]]
++
++// Finally, check that a discriminator was emitted for the second scope.
++// FIXMEkhuey ideally we would check that *either* scope has a discriminator
++// but I don't know that it's possible to check that with FileCheck.
++// CHECK: ![[#var_inlinedAt2_scope]] = !DILexicalBlockFile
++// CHECK-SAME: discriminator: [[#]]
++extern crate macro_def;
++
++use std::env;
++
++fn square(n: i32) -> i32 {
++    n * n
++}
++
++fn main() {
++    let (z1, z2) = macro_def::square_twice!();
++    println!("{z1} == {z2}");
++}

diff --git a/dev-lang/rust/files/1.83.0-dwarf-llvm-assertion.patch 
b/dev-lang/rust/files/1.83.0-dwarf-llvm-assertion.patch
new file mode 100644
index 0000000..64d00ac
--- /dev/null
+++ b/dev-lang/rust/files/1.83.0-dwarf-llvm-assertion.patch
@@ -0,0 +1,242 @@
+From 1dc106121b62562ead6e7d612fa136dc4b35cd5d Mon Sep 17 00:00:00 2001
+From: Kyle Huey <[email protected]>
+Date: Mon, 4 Nov 2024 11:38:14 -0800
+Subject: [PATCH] Add discriminators to DILocations when multiple functions are
+ inlined into a single point.
+
+LLVM does not expect to ever see multiple dbg_declares for the same variable 
at the same
+location with different values. proc-macros make it possible for arbitrary 
code,
+including multiple calls that get inlined, to happen at any given location in 
the source
+code. Add discriminators when that happens so these locations are different to 
LLVM.
+
+This may interfere with the AddDiscriminators pass in LLVM, which is added by 
the
+unstable flag -Zdebug-info-for-profiling.
+
+Fixes #131944
+---
+ .../src/debuginfo/create_scope_map.rs         | 60 ++++++++++++++++++-
+ compiler/rustc_codegen_llvm/src/llvm/ffi.rs   |  4 ++
+ .../rustc_llvm/llvm-wrapper/RustWrapper.cpp   |  8 +++
+ .../auxiliary/macro_def.rs                    | 11 ++++
+ .../mir_inlined_twice_var_locs.rs             | 53 ++++++++++++++++
+ 5 files changed, 133 insertions(+), 3 deletions(-)
+ create mode 100644 tests/codegen/debuginfo-proc-macro/auxiliary/macro_def.rs
+ create mode 100644 
tests/codegen/debuginfo-proc-macro/mir_inlined_twice_var_locs.rs
+
+diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs 
b/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs
+index ac6c2fb1b83a6..0f1909486ec7e 100644
+--- a/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs
++++ b/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs
+@@ -1,11 +1,15 @@
++use std::collections::hash_map::Entry;
++
+ use rustc_codegen_ssa::mir::debuginfo::{DebugScope, FunctionDebugContext};
+ use rustc_codegen_ssa::traits::*;
++use rustc_data_structures::fx::FxHashMap;
+ use rustc_index::Idx;
+ use rustc_index::bit_set::BitSet;
+ use rustc_middle::mir::{Body, SourceScope};
+ use rustc_middle::ty::layout::FnAbiOf;
+ use rustc_middle::ty::{self, Instance};
+ use rustc_session::config::DebugInfo;
++use rustc_span::BytePos;
+ 
+ use super::metadata::file_metadata;
+ use super::utils::DIB;
+@@ -37,10 +41,20 @@ pub(crate) fn compute_mir_scopes<'ll, 'tcx>(
+         None
+     };
+     let mut instantiated = BitSet::new_empty(mir.source_scopes.len());
++    let mut discriminators = FxHashMap::default();
+     // Instantiate all scopes.
+     for idx in 0..mir.source_scopes.len() {
+         let scope = SourceScope::new(idx);
+-        make_mir_scope(cx, instance, mir, &variables, debug_context, &mut 
instantiated, scope);
++        make_mir_scope(
++            cx,
++            instance,
++            mir,
++            &variables,
++            debug_context,
++            &mut instantiated,
++            &mut discriminators,
++            scope,
++        );
+     }
+     assert!(instantiated.count() == mir.source_scopes.len());
+ }
+@@ -52,6 +66,7 @@ fn make_mir_scope<'ll, 'tcx>(
+     variables: &Option<BitSet<SourceScope>>,
+     debug_context: &mut FunctionDebugContext<'tcx, &'ll DIScope, &'ll 
DILocation>,
+     instantiated: &mut BitSet<SourceScope>,
++    discriminators: &mut FxHashMap<BytePos, u32>,
+     scope: SourceScope,
+ ) {
+     if instantiated.contains(scope) {
+@@ -60,7 +75,16 @@ fn make_mir_scope<'ll, 'tcx>(
+ 
+     let scope_data = &mir.source_scopes[scope];
+     let parent_scope = if let Some(parent) = scope_data.parent_scope {
+-        make_mir_scope(cx, instance, mir, variables, debug_context, 
instantiated, parent);
++        make_mir_scope(
++            cx,
++            instance,
++            mir,
++            variables,
++            debug_context,
++            instantiated,
++            discriminators,
++            parent,
++        );
+         debug_context.scopes[parent]
+     } else {
+         // The root is the function itself.
+@@ -117,7 +141,37 @@ fn make_mir_scope<'ll, 'tcx>(
+         // FIXME(eddyb) this doesn't account for the macro-related
+         // `Span` fixups that `rustc_codegen_ssa::mir::debuginfo` does.
+         let callsite_scope = parent_scope.adjust_dbg_scope_for_span(cx, 
callsite_span);
+-        cx.dbg_loc(callsite_scope, parent_scope.inlined_at, callsite_span)
++        let loc = cx.dbg_loc(callsite_scope, parent_scope.inlined_at, 
callsite_span);
++
++        // NB: In order to produce proper debug info for variables 
(particularly
++        // arguments) in multiply-inline functions, LLVM expects to see a 
single
++        // DILocalVariable with multiple different DILocations in the IR. 
While
++        // the source information for each DILocation would be identical, 
their
++        // inlinedAt attributes will be unique to the particular callsite.
++        //
++        // We generate DILocations here based on the callsite's location in 
the
++        // source code. A single location in the source code usually can't
++        // produce multiple distinct calls so this mostly works, until
++        // proc-macros get involved. A proc-macro can generate multiple calls
++        // at the same span, which breaks the assumption that we're going to
++        // produce a unique DILocation for every scope we process here. We
++        // have to explicitly add discriminators if we see inlines into the
++        // same source code location.
++        //
++        // Note further that we can't key this hashtable on the span itself,
++        // because these spans could have distinct SyntaxContexts. We have
++        // to key on exactly what we're giving to LLVM.
++        match discriminators.entry(callsite_span.lo()) {
++            Entry::Occupied(mut o) => {
++                *o.get_mut() += 1;
++                unsafe { 
llvm::LLVMRustDILocationCloneWithBaseDiscriminator(loc, *o.get()) }
++                    .expect("Failed to encode discriminator in DILocation")
++            }
++            Entry::Vacant(v) => {
++                v.insert(0);
++                loc
++            }
++        }
+     });
+ 
+     debug_context.scopes[scope] = DebugScope {
+diff --git a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs 
b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
+index 3d2e270a3868e..75a5ec44c2285 100644
+--- a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
++++ b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
+@@ -2174,6 +2174,10 @@ unsafe extern "C" {
+         Scope: &'a DIScope,
+         InlinedAt: Option<&'a DILocation>,
+     ) -> &'a DILocation;
++    pub fn LLVMRustDILocationCloneWithBaseDiscriminator<'a>(
++        Location: &'a DILocation,
++        BD: c_uint,
++    ) -> Option<&'a DILocation>;
+     pub fn LLVMRustDIBuilderCreateOpDeref() -> u64;
+     pub fn LLVMRustDIBuilderCreateOpPlusUconst() -> u64;
+     pub fn LLVMRustDIBuilderCreateOpLLVMFragment() -> u64;
+diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp 
b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
+index 9330c83b7f230..cd70c3f266920 100644
+--- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
++++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
+@@ -1305,6 +1305,14 @@ LLVMRustDIBuilderCreateDebugLocation(unsigned Line, 
unsigned Column,
+   return wrap(Loc);
+ }
+ 
++extern "C" LLVMMetadataRef
++LLVMRustDILocationCloneWithBaseDiscriminator(LLVMMetadataRef Location,
++                                             unsigned BD) {
++  DILocation *Loc = unwrapDIPtr<DILocation>(Location);
++  auto NewLoc = Loc->cloneWithBaseDiscriminator(BD);
++  return wrap(NewLoc.has_value() ? NewLoc.value() : nullptr);
++}
++
+ extern "C" uint64_t LLVMRustDIBuilderCreateOpDeref() {
+   return dwarf::DW_OP_deref;
+ }
+diff --git a/tests/codegen/debuginfo-proc-macro/auxiliary/macro_def.rs 
b/tests/codegen/debuginfo-proc-macro/auxiliary/macro_def.rs
+new file mode 100644
+index 0000000000000..159ecfd09743d
+--- /dev/null
++++ b/tests/codegen/debuginfo-proc-macro/auxiliary/macro_def.rs
+@@ -0,0 +1,11 @@
++//@ force-host
++//@ no-prefer-dynamic
++#![crate_type = "proc-macro"]
++
++extern crate proc_macro;
++use proc_macro::*;
++
++#[proc_macro]
++pub fn square_twice(_item: TokenStream) -> TokenStream {
++    "(square(env::vars().count() as i32), square(env::vars().count() as 
i32))".parse().unwrap()
++}
+diff --git a/tests/codegen/debuginfo-proc-macro/mir_inlined_twice_var_locs.rs 
b/tests/codegen/debuginfo-proc-macro/mir_inlined_twice_var_locs.rs
+new file mode 100644
+index 0000000000000..c3858044c0c9f
+--- /dev/null
++++ b/tests/codegen/debuginfo-proc-macro/mir_inlined_twice_var_locs.rs
+@@ -0,0 +1,53 @@
++//@ min-llvm-version: 19
++//@ compile-flags: -Cdebuginfo=2 -Copt-level=0 -Zmir-enable-passes=+Inline
++// MSVC is different because of the individual allocas.
++//@ ignore-msvc
++
++//@ aux-build:macro_def.rs
++
++// Find the variable.
++// CHECK-DAG: ![[#var_dbg:]] = !DILocalVariable(name: "n",{{( arg: 1,)?}} 
scope: ![[#var_scope:]]
++
++// Find both dbg_declares. These will proceed the variable metadata, of 
course, so we're looking
++// backwards.
++// CHECK-DAG: dbg_declare(ptr %n.dbg.spill{{[0-9]}}, ![[#var_dbg]], 
!DIExpression(), ![[#var_loc2:]])
++// CHECK-DAG: dbg_declare(ptr %n.dbg.spill, ![[#var_dbg]], !DIExpression(), 
![[#var_loc1:]])
++
++// Find the first location definition, looking forwards again.
++// CHECK: ![[#var_loc1]] = !DILocation
++// CHECK-SAME: scope: ![[#var_scope:]], inlinedAt: ![[#var_inlinedAt1:]]
++
++// Find the first location's inlinedAt
++// NB: If we fail here it's *probably* because we failed to produce two
++// different locations and ended up reusing an earlier one.
++// CHECK: ![[#var_inlinedAt1]] = !DILocation
++// CHECK-SAME: scope: ![[var_inlinedAt1_scope:]]
++
++// Find the second location definition, still looking forwards.
++// NB: If we failed to produce two different locations, the test will
++// definitely fail by this point (if it hasn't already) because we won't
++// be able to find the same line again.
++// CHECK: ![[#var_loc2]] = !DILocation
++// CHECK-SAME: scope: ![[#var_scope]], inlinedAt: ![[#var_inlinedAt2:]]
++
++// Find the second location's inlinedAt.
++// CHECK: ![[#var_inlinedAt2]] = !DILocation
++// CHECK-SAME: scope: ![[#var_inlinedAt2_scope:]]
++
++// Finally, check that a discriminator was emitted for the second scope.
++// FIXMEkhuey ideally we would check that *either* scope has a discriminator
++// but I don't know that it's possible to check that with FileCheck.
++// CHECK: ![[#var_inlinedAt2_scope]] = !DILexicalBlockFile
++// CHECK-SAME: discriminator: [[#]]
++extern crate macro_def;
++
++use std::env;
++
++fn square(n: i32) -> i32 {
++    n * n
++}
++
++fn main() {
++    let (z1, z2) = macro_def::square_twice!();
++    println!("{z1} == {z2}");
++}

diff --git a/dev-lang/rust/rust-1.83.0.ebuild 
b/dev-lang/rust/rust-1.82.0-r101.ebuild
similarity index 94%
copy from dev-lang/rust/rust-1.83.0.ebuild
copy to dev-lang/rust/rust-1.82.0-r101.ebuild
index e3401e7..b76816a 100644
--- a/dev-lang/rust/rust-1.83.0.ebuild
+++ b/dev-lang/rust/rust-1.82.0-r101.ebuild
@@ -20,7 +20,7 @@ if [[ ${PV} = *beta* ]]; then
 else
        MY_P="rustc-${PV}"
        SRC="${MY_P}-src.tar.xz"
-       KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~sparc 
~x86"
+       KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86"
 fi
 
 DESCRIPTION="Systems programming language from Mozilla"
@@ -132,9 +132,10 @@ 
VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc
 
 PATCHES=(
        "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch
-       "${FILESDIR}"/1.83.0-cross-compile-libz.patch
+       "${FILESDIR}"/1.74.1-cross-compile-libz.patch
        #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch  # pending refresh
        "${FILESDIR}"/1.67.0-doc-wasm.patch
+       "${FILESDIR}"/1.82.0-dwarf-llvm-assertion.patch
 )
 
 clear_vendor_checksums() {
@@ -223,10 +224,8 @@ pkg_setup() {
 }
 
 src_prepare() {
-       eapply_crate openssl-sys-0.9.72 
"${FILESDIR}"/1.83.0-libressl-openssl-sys-0.9.72.patch
        eapply_crate openssl-sys-0.9.92 
"${FILESDIR}"/1.72.0-libressl-openssl-sys.patch
        eapply_crate openssl-sys-0.9.102 
"${FILESDIR}"/1.79.0-libressl-openssl-sys.patch
-       eapply_crate openssl-sys-0.9.103 
"${FILESDIR}"/1.79.0-libressl-openssl-sys.patch
 
        # Rust baselines to Pentium4 on x86, this patch lowers the baseline to 
i586 when sse2 is not set.
        if use x86; then
@@ -703,20 +702,43 @@ pkg_preinst() {
 
 pkg_postinst() {
 
-       if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then
+       local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)"
+       if has_version -b ${old_rust}; then
                # Be _extra_ careful here as we're removing files from the live 
filesystem
                local f
+               local only_one_file=()
+               einfo "Tidying up libraries files from non-slotted 
\`${old_rust}\`."
                for f in "${old_rust_libs[@]}"; do
                        [[ -f ${f} ]] || die "old_rust_libs array contains 
non-existent file"
                        local base_name="${f%-*}"
                        local ext="${f##*.}"
                        local matching_files=("${base_name}"-*.${ext})
-                       if [[ ${#matching_files[@]} -ne 2 ]]; then
-                               die "Expected exactly two files matching 
${base_name}-\*.rlib, but found ${#matching_files[@]}"
-                       fi
-                       einfo "Removing old .rlib file ${f}"
-                       rm "${f}" || die
+                       case ${#matching_files[@]} in
+                               2)
+                                       einfo "Removing old .${ext}: ${f}"
+                                       rm "${f}" || die
+                                       ;;
+                               1)
+                                       # Turns out fingerprints are not as 
unique as we'd thought, _sometimes_ they collide,
+                                       # so we may have already installed over 
the old file.
+                                       # We'll warn about this just in case, 
but it's probably fine.
+                                       only_one_file+=( "${matching_files[0]}" 
)
+                                       ;;
+                               *)
+                                       die "Expected one or two files matching 
${base_name}-\*.rlib, but found ${#matching_files[@]}"
+                                       ;;
+                       esac
                done
+               if [[ ${#only_one_file} -gt 0 ]]; then
+                       einfo "While tidying up non-slotted rust libraries for 
\`${old_rust}\`,"
+                       einfo "the following file(s) did not have a duplicate 
where one was expected:"
+                       for f in "${only_one_file[@]}"; do
+                               einfo " * ${f}"
+                       done
+                       einfo ""
+                       einfo "This is unlikely to cause problems; the 
fingerprint for the library ended up being the same."
+                       einfo "However, if you encounter any issues please 
report them to the Gentoo Rust Team."
+               fi
        fi
 
        eselect rust update
@@ -726,13 +748,8 @@ pkg_postinst() {
                elog "for convenience they are installed under 
/usr/bin/rust-{gdb,lldb}-${PV}."
        fi
 
-       if has_version app-editors/emacs; then
-               optfeature "emacs support for rust" app-emacs/rust-mode
-       fi
-
-       if has_version app-editors/gvim || has_version app-editors/vim; then
-               optfeature "vim support for rust" app-vim/rust-vim
-       fi
+       optfeature "Emacs support" "app-emacs/rust-mode"
+       optfeature "Vim support" "app-vim/rust-vim"
 }
 
 pkg_postrm() {

diff --git a/dev-lang/rust/rust-1.83.0.ebuild 
b/dev-lang/rust/rust-1.83.0-r1.ebuild
similarity index 99%
rename from dev-lang/rust/rust-1.83.0.ebuild
rename to dev-lang/rust/rust-1.83.0-r1.ebuild
index e3401e7..dd35ed9 100644
--- a/dev-lang/rust/rust-1.83.0.ebuild
+++ b/dev-lang/rust/rust-1.83.0-r1.ebuild
@@ -135,6 +135,7 @@ PATCHES=(
        "${FILESDIR}"/1.83.0-cross-compile-libz.patch
        #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch  # pending refresh
        "${FILESDIR}"/1.67.0-doc-wasm.patch
+       "${FILESDIR}"/1.83.0-dwarf-llvm-assertion.patch
 )
 
 clear_vendor_checksums() {

Reply via email to