Skip to content

Commit c531b01

Browse files
authored
Rollup merge of #94359 - tmiasko:legacy-verbose-const, r=petrochenkov
Fix inconsistent symbol mangling of integers constants with -Zverbose The `PrettyPrinter` changes formatting of array size and integer constants based on `-Zverbose`, so its implementation cannot be used in legacy symbol mangling. Example symbol demangling before changes: ```console $ cat a.rs pub struct A<T>(T); impl A<[u8; 128]> { pub fn f() {} } $ rustc --crate-type=lib a.rs -Zverbose=n && nm -C ./liba.rlib 00000000 T a::A<[u8; 128]>::f $ rustc --crate-type=lib a.rs -Zverbose=y && nm -C ./liba.rlib 00000000 T a::A<[u8; Const { ty. usize, val. Value(Scalar(0x0000000000000080)) }]>::f ```
2 parents 6e5a6ff + 99a7779 commit c531b01

8 files changed

+1337
-101
lines changed

compiler/rustc_symbol_mangling/src/legacy.rs

+33-5
Original file line numberDiff line numberDiff line change
@@ -216,14 +216,32 @@ impl<'tcx> Printer<'tcx> for &mut SymbolPrinter<'tcx> {
216216
Ok(self)
217217
}
218218

219-
fn print_type(self, ty: Ty<'tcx>) -> Result<Self::Type, Self::Error> {
219+
fn print_type(mut self, ty: Ty<'tcx>) -> Result<Self::Type, Self::Error> {
220220
match *ty.kind() {
221221
// Print all nominal types as paths (unlike `pretty_print_type`).
222222
ty::FnDef(def_id, substs)
223223
| ty::Opaque(def_id, substs)
224224
| ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs })
225225
| ty::Closure(def_id, substs)
226226
| ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs),
227+
228+
// The `pretty_print_type` formatting of array size depends on
229+
// -Zverbose flag, so we cannot reuse it here.
230+
ty::Array(ty, size) => {
231+
self.write_str("[")?;
232+
self = self.print_type(ty)?;
233+
self.write_str("; ")?;
234+
if let Some(size) = size.val().try_to_bits(self.tcx().data_layout.pointer_size) {
235+
write!(self, "{}", size)?
236+
} else if let ty::ConstKind::Param(param) = size.val() {
237+
self = param.print(self)?
238+
} else {
239+
self.write_str("_")?
240+
}
241+
self.write_str("]")?;
242+
Ok(self)
243+
}
244+
227245
_ => self.pretty_print_type(ty),
228246
}
229247
}
@@ -245,12 +263,22 @@ impl<'tcx> Printer<'tcx> for &mut SymbolPrinter<'tcx> {
245263

246264
fn print_const(self, ct: ty::Const<'tcx>) -> Result<Self::Const, Self::Error> {
247265
// only print integers
248-
if let ty::ConstKind::Value(ConstValue::Scalar(Scalar::Int { .. })) = ct.val() {
249-
if ct.ty().is_integral() {
250-
return self.pretty_print_const(ct, true);
266+
match (ct.val(), ct.ty().kind()) {
267+
(
268+
ty::ConstKind::Value(ConstValue::Scalar(Scalar::Int(scalar))),
269+
ty::Int(_) | ty::Uint(_),
270+
) => {
271+
// The `pretty_print_const` formatting depends on -Zverbose
272+
// flag, so we cannot reuse it here.
273+
let signed = matches!(ct.ty().kind(), ty::Int(_));
274+
write!(
275+
self,
276+
"{:#?}",
277+
ty::ConstInt::new(scalar, signed, ct.ty().is_ptr_sized_integral())
278+
)?;
251279
}
280+
_ => self.write_str("_")?,
252281
}
253-
self.write_str("_")?;
254282
Ok(self)
255283
}
256284

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
error: symbol-name(_ZN1c21Unsigned$LT$11_u8$GT$1f17h[HASH]E)
2+
--> $DIR/const-generics-demangling.rs:13:5
3+
|
4+
LL | #[rustc_symbol_name]
5+
| ^^^^^^^^^^^^^^^^^^^^
6+
7+
error: demangling(c::Unsigned<11_u8>::f::h[HASH])
8+
--> $DIR/const-generics-demangling.rs:13:5
9+
|
10+
LL | #[rustc_symbol_name]
11+
| ^^^^^^^^^^^^^^^^^^^^
12+
13+
error: demangling-alt(c::Unsigned<11_u8>::f)
14+
--> $DIR/const-generics-demangling.rs:13:5
15+
|
16+
LL | #[rustc_symbol_name]
17+
| ^^^^^^^^^^^^^^^^^^^^
18+
19+
error: symbol-name(_ZN1c22Signed$LT$.152_i16$GT$1f17h[HASH]E)
20+
--> $DIR/const-generics-demangling.rs:26:5
21+
|
22+
LL | #[rustc_symbol_name]
23+
| ^^^^^^^^^^^^^^^^^^^^
24+
25+
error: demangling(c::Signed<.152_i16>::f::h[HASH])
26+
--> $DIR/const-generics-demangling.rs:26:5
27+
|
28+
LL | #[rustc_symbol_name]
29+
| ^^^^^^^^^^^^^^^^^^^^
30+
31+
error: demangling-alt(c::Signed<.152_i16>::f)
32+
--> $DIR/const-generics-demangling.rs:26:5
33+
|
34+
LL | #[rustc_symbol_name]
35+
| ^^^^^^^^^^^^^^^^^^^^
36+
37+
error: symbol-name(_ZN1c13Bool$LT$_$GT$1f17h[HASH]E)
38+
--> $DIR/const-generics-demangling.rs:39:5
39+
|
40+
LL | #[rustc_symbol_name]
41+
| ^^^^^^^^^^^^^^^^^^^^
42+
43+
error: demangling(c::Bool<_>::f::h[HASH])
44+
--> $DIR/const-generics-demangling.rs:39:5
45+
|
46+
LL | #[rustc_symbol_name]
47+
| ^^^^^^^^^^^^^^^^^^^^
48+
49+
error: demangling-alt(c::Bool<_>::f)
50+
--> $DIR/const-generics-demangling.rs:39:5
51+
|
52+
LL | #[rustc_symbol_name]
53+
| ^^^^^^^^^^^^^^^^^^^^
54+
55+
error: symbol-name(_ZN1c13Char$LT$_$GT$1f17h[HASH]E)
56+
--> $DIR/const-generics-demangling.rs:52:5
57+
|
58+
LL | #[rustc_symbol_name]
59+
| ^^^^^^^^^^^^^^^^^^^^
60+
61+
error: demangling(c::Char<_>::f::h[HASH])
62+
--> $DIR/const-generics-demangling.rs:52:5
63+
|
64+
LL | #[rustc_symbol_name]
65+
| ^^^^^^^^^^^^^^^^^^^^
66+
67+
error: demangling-alt(c::Char<_>::f)
68+
--> $DIR/const-generics-demangling.rs:52:5
69+
|
70+
LL | #[rustc_symbol_name]
71+
| ^^^^^^^^^^^^^^^^^^^^
72+
73+
error: aborting due to 12 previous errors
74+
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,62 @@
11
// build-fail
2-
// compile-flags: -C symbol-mangling-version=v0 --crate-name=c
3-
// normalize-stderr-test: "c\[.*?\]" -> "c[HASH]"
2+
// revisions: legacy v0
3+
// compile-flags: --crate-name=c
4+
//[legacy]compile-flags: -C symbol-mangling-version=legacy -Z unstable-options
5+
// [v0]compile-flags: -C symbol-mangling-version=v0
6+
//[legacy]normalize-stderr-test: "h[[:xdigit:]]{16}" -> "h[HASH]"
7+
// [v0]normalize-stderr-test: "c\[.*?\]" -> "c[HASH]"
48
#![feature(rustc_attrs)]
59

610
pub struct Unsigned<const F: u8>;
711

8-
#[rustc_symbol_name]
9-
//~^ ERROR symbol-name(_RMCs
10-
//~| ERROR demangling(<c[
11-
//~| ERROR demangling-alt(<c::Unsigned<11>>)
12-
impl Unsigned<11> {}
12+
impl Unsigned<11> {
13+
#[rustc_symbol_name]
14+
//[v0]~^ ERROR symbol-name(_RNvMCs
15+
//[v0]~| ERROR demangling(<c[
16+
//[v0]~| ERROR demangling-alt(<c::Unsigned<11>>::f)
17+
//[legacy]~^^^^ ERROR symbol-name(_ZN1c21Unsigned$LT$11_u8$GT$
18+
//[legacy]~| ERROR demangling(c::Unsigned<11_u8>::f::
19+
//[legacy]~| ERROR demangling-alt(c::Unsigned<11_u8>::f)
20+
fn f() {}
21+
}
1322

1423
pub struct Signed<const F: i16>;
1524

16-
#[rustc_symbol_name]
17-
//~^ ERROR symbol-name(_RMs_Cs
18-
//~| ERROR demangling(<c[
19-
//~| ERROR demangling-alt(<c::Signed<-152>>)
20-
impl Signed<-152> {}
25+
impl Signed<-152> {
26+
#[rustc_symbol_name]
27+
//[v0]~^ ERROR symbol-name(_RNvMs_Cs
28+
//[v0]~| ERROR demangling(<c[
29+
//[v0]~| ERROR demangling-alt(<c::Signed<-152>>::f)
30+
//[legacy]~^^^^ ERROR symbol-name(_ZN1c22Signed$LT$.152_i16$GT$
31+
//[legacy]~| ERROR demangling(c::Signed<.152_i16>::f::
32+
//[legacy]~| ERROR demangling-alt(c::Signed<.152_i16>::f)
33+
fn f() {}
34+
}
2135

2236
pub struct Bool<const F: bool>;
2337

24-
#[rustc_symbol_name]
25-
//~^ ERROR symbol-name(_RMs0_Cs
26-
//~| ERROR demangling(<c[
27-
//~| ERROR demangling-alt(<c::Bool<true>>)
28-
impl Bool<true> {}
38+
impl Bool<true> {
39+
#[rustc_symbol_name]
40+
//[v0]~^ ERROR symbol-name(_RNvMs0_Cs
41+
//[v0]~| ERROR demangling(<c[
42+
//[v0]~| ERROR demangling-alt(<c::Bool<true>>::f)
43+
//[legacy]~^^^^ ERROR symbol-name(_ZN1c13Bool$LT$_$GT$
44+
//[legacy]~| ERROR demangling(c::Bool<_>::f::
45+
//[legacy]~| ERROR demangling-alt(c::Bool<_>::f)
46+
fn f() {}
47+
}
2948

3049
pub struct Char<const F: char>;
3150

32-
#[rustc_symbol_name]
33-
//~^ ERROR symbol-name(_RMs1_Cs
34-
//~| ERROR demangling(<c[
35-
//~| ERROR demangling-alt(<c::Char<'∂'>>)
36-
impl Char<'∂'> {}
51+
impl Char<'∂'> {
52+
#[rustc_symbol_name]
53+
//[v0]~^ ERROR symbol-name(_RNvMs1_Cs
54+
//[v0]~| ERROR demangling(<c[
55+
//[v0]~| ERROR demangling-alt(<c::Char<'∂'>>::f)
56+
//[legacy]~^^^^ ERROR symbol-name(_ZN1c13Char$LT$_$GT$
57+
//[legacy]~| ERROR demangling(c::Char<_>::f::
58+
//[legacy]~| ERROR demangling-alt(c::Char<_>::f)
59+
fn f() {}
60+
}
3761

3862
fn main() {}

src/test/ui/symbol-names/const-generics-demangling.stderr

-74
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
error: symbol-name(_RNvMCsCRATE_HASH_1cINtB<REF>_8UnsignedKhb_E1f)
2+
--> $DIR/const-generics-demangling.rs:13:5
3+
|
4+
LL | #[rustc_symbol_name]
5+
| ^^^^^^^^^^^^^^^^^^^^
6+
7+
error: demangling(<c[HASH]::Unsigned<11u8>>::f)
8+
--> $DIR/const-generics-demangling.rs:13:5
9+
|
10+
LL | #[rustc_symbol_name]
11+
| ^^^^^^^^^^^^^^^^^^^^
12+
13+
error: demangling-alt(<c::Unsigned<11>>::f)
14+
--> $DIR/const-generics-demangling.rs:13:5
15+
|
16+
LL | #[rustc_symbol_name]
17+
| ^^^^^^^^^^^^^^^^^^^^
18+
19+
error: symbol-name(_RNvMs_CsCRATE_HASH_1cINtB<REF>_6SignedKsn98_E1f)
20+
--> $DIR/const-generics-demangling.rs:26:5
21+
|
22+
LL | #[rustc_symbol_name]
23+
| ^^^^^^^^^^^^^^^^^^^^
24+
25+
error: demangling(<c[HASH]::Signed<-152i16>>::f)
26+
--> $DIR/const-generics-demangling.rs:26:5
27+
|
28+
LL | #[rustc_symbol_name]
29+
| ^^^^^^^^^^^^^^^^^^^^
30+
31+
error: demangling-alt(<c::Signed<-152>>::f)
32+
--> $DIR/const-generics-demangling.rs:26:5
33+
|
34+
LL | #[rustc_symbol_name]
35+
| ^^^^^^^^^^^^^^^^^^^^
36+
37+
error: symbol-name(_RNvMs0_CsCRATE_HASH_1cINtB<REF>_4BoolKb1_E1f)
38+
--> $DIR/const-generics-demangling.rs:39:5
39+
|
40+
LL | #[rustc_symbol_name]
41+
| ^^^^^^^^^^^^^^^^^^^^
42+
43+
error: demangling(<c[HASH]::Bool<true>>::f)
44+
--> $DIR/const-generics-demangling.rs:39:5
45+
|
46+
LL | #[rustc_symbol_name]
47+
| ^^^^^^^^^^^^^^^^^^^^
48+
49+
error: demangling-alt(<c::Bool<true>>::f)
50+
--> $DIR/const-generics-demangling.rs:39:5
51+
|
52+
LL | #[rustc_symbol_name]
53+
| ^^^^^^^^^^^^^^^^^^^^
54+
55+
error: symbol-name(_RNvMs1_CsCRATE_HASH_1cINtB<REF>_4CharKc2202_E1f)
56+
--> $DIR/const-generics-demangling.rs:52:5
57+
|
58+
LL | #[rustc_symbol_name]
59+
| ^^^^^^^^^^^^^^^^^^^^
60+
61+
error: demangling(<c[HASH]::Char<'∂'>>::f)
62+
--> $DIR/const-generics-demangling.rs:52:5
63+
|
64+
LL | #[rustc_symbol_name]
65+
| ^^^^^^^^^^^^^^^^^^^^
66+
67+
error: demangling-alt(<c::Char<'∂'>>::f)
68+
--> $DIR/const-generics-demangling.rs:52:5
69+
|
70+
LL | #[rustc_symbol_name]
71+
| ^^^^^^^^^^^^^^^^^^^^
72+
73+
error: aborting due to 12 previous errors
74+

0 commit comments

Comments
 (0)