Skip to content

Commit 181d861

Browse files
committed
CFI: Support function pointers for trait methods
Adds support for both CFI and KCFI for attaching concrete and abstract types to functions. KCFI does this through generation of `ReifyShim` on any function pointer that could go in a vtable, and checking the `ReifyReason` when emitting the instance. CFI does this by attaching both the concrete and abstract type to every instance. TypeID codegen tests are switched to be anchored on the left rather than the right in order to allow emission of additional type attachments. Fixes #115953
1 parent 2292393 commit 181d861

20 files changed

+272
-216
lines changed

compiler/rustc_codegen_llvm/src/declare.rs

+13-14
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use crate::llvm;
1818
use crate::llvm::AttributePlace::Function;
1919
use crate::type_::Type;
2020
use crate::value::Value;
21+
use itertools::Itertools;
2122
use rustc_codegen_ssa::traits::TypeMembershipMethods;
2223
use rustc_middle::ty::{Instance, Ty};
2324
use rustc_symbol_mangling::typeid::{
@@ -141,20 +142,18 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
141142

142143
if self.tcx.sess.is_sanitizer_cfi_enabled() {
143144
if let Some(instance) = instance {
144-
let typeid = typeid_for_instance(self.tcx, &instance, TypeIdOptions::empty());
145-
self.set_type_metadata(llfn, typeid);
146-
let typeid =
147-
typeid_for_instance(self.tcx, &instance, TypeIdOptions::GENERALIZE_POINTERS);
148-
self.add_type_metadata(llfn, typeid);
149-
let typeid =
150-
typeid_for_instance(self.tcx, &instance, TypeIdOptions::NORMALIZE_INTEGERS);
151-
self.add_type_metadata(llfn, typeid);
152-
let typeid = typeid_for_instance(
153-
self.tcx,
154-
&instance,
155-
TypeIdOptions::GENERALIZE_POINTERS | TypeIdOptions::NORMALIZE_INTEGERS,
156-
);
157-
self.add_type_metadata(llfn, typeid);
145+
for options in [
146+
TypeIdOptions::GENERALIZE_POINTERS,
147+
TypeIdOptions::NORMALIZE_INTEGERS,
148+
TypeIdOptions::CONCRETE,
149+
]
150+
.into_iter()
151+
.powerset()
152+
.map(TypeIdOptions::from_iter)
153+
{
154+
let typeid = typeid_for_instance(self.tcx, &instance, options);
155+
self.add_type_metadata(llfn, typeid);
156+
}
158157
} else {
159158
let typeid = typeid_for_fnabi(self.tcx, fn_abi, TypeIdOptions::empty());
160159
self.set_type_metadata(llfn, typeid);

compiler/rustc_middle/src/ty/instance.rs

+8
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,14 @@ impl<'tcx> Instance<'tcx> {
502502
debug!(" => fn pointer created for virtual call");
503503
resolved.def = InstanceDef::ReifyShim(def_id, reason);
504504
}
505+
// FIXME(maurer) only shim it if it is a vtable-safe function
506+
_ if tcx.sess.is_sanitizer_kcfi_enabled()
507+
&& tcx.associated_item(def_id).trait_item_def_id.is_some() =>
508+
{
509+
// If this function could also go in a vtable, we need to `ReifyShim` it with
510+
// KCFI because it can only attach one type per function.
511+
resolved.def = InstanceDef::ReifyShim(resolved.def_id(), reason)
512+
}
505513
_ => {}
506514
}
507515

compiler/rustc_symbol_mangling/src/typeid.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
/// For more information about LLVM CFI and cross-language LLVM CFI support for the Rust compiler,
55
/// see design document in the tracking issue #89653.
66
use bitflags::bitflags;
7-
use rustc_middle::ty::{Instance, Ty, TyCtxt};
7+
use rustc_middle::ty::{Instance, InstanceDef, ReifyReason, Ty, TyCtxt};
88
use rustc_target::abi::call::FnAbi;
99
use std::hash::Hasher;
1010
use twox_hash::XxHash64;
@@ -16,6 +16,8 @@ bitflags! {
1616
const GENERALIZE_POINTERS = 1;
1717
const GENERALIZE_REPR_C = 2;
1818
const NORMALIZE_INTEGERS = 4;
19+
// Only relevant for `typeid_for_instance`
20+
const CONCRETE = 8;
1921
}
2022
}
2123

@@ -56,8 +58,13 @@ pub fn kcfi_typeid_for_fnabi<'tcx>(
5658
pub fn kcfi_typeid_for_instance<'tcx>(
5759
tcx: TyCtxt<'tcx>,
5860
instance: &Instance<'tcx>,
59-
options: TypeIdOptions,
61+
mut options: TypeIdOptions,
6062
) -> u32 {
63+
// If we receive a `ReifyShim` intended to produce a function pointer, we need to remain
64+
// concrete - abstraction is for vtables.
65+
if matches!(instance.def, InstanceDef::ReifyShim(_, Some(ReifyReason::FnPtr))) {
66+
options |= TypeIdOptions::CONCRETE
67+
}
6168
// A KCFI type metadata identifier is a 32-bit constant produced by taking the lower half of the
6269
// xxHash64 of the type metadata identifier. (See llvm/llvm-project@cff5bef.)
6370
let mut hash: XxHash64 = Default::default();

compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1116,7 +1116,8 @@ pub fn typeid_for_instance<'tcx>(
11161116
instance.args = strip_receiver_auto(tcx, instance.args)
11171117
}
11181118

1119-
if let Some(impl_id) = tcx.impl_of_method(instance.def_id())
1119+
if !options.contains(TypeIdOptions::CONCRETE)
1120+
&& let Some(impl_id) = tcx.impl_of_method(instance.def_id())
11201121
&& let Some(trait_ref) = tcx.impl_trait_ref(impl_id)
11211122
{
11221123
let impl_method = tcx.associated_item(instance.def_id());

tests/codegen/sanitizer/cfi/emit-type-metadata-attr-cfi-encoding.rs

+15-15
Original file line numberDiff line numberDiff line change
@@ -26,35 +26,35 @@ pub struct Type4(i32);
2626
pub struct Type5(u32);
2727

2828
pub fn foo0(_: Type1) { }
29-
// CHECK: define{{.*}}foo0{{.*}}!type ![[TYPE0:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
29+
// CHECK: define{{.*}}foo0{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE0:[0-9]+]]
3030
pub fn foo1(_: Type1, _: Type1) { }
31-
// CHECK: define{{.*}}foo1{{.*}}!type ![[TYPE1:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
31+
// CHECK: define{{.*}}foo1{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE1:[0-9]+]]
3232
pub fn foo2(_: Type1, _: Type1, _: Type1) { }
33-
// CHECK: define{{.*}}foo2{{.*}}!type ![[TYPE2:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
33+
// CHECK: define{{.*}}foo2{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE2:[0-9]+]]
3434
pub fn foo3(_: *mut Type2) { }
35-
// CHECK: define{{.*}}foo3{{.*}}!type ![[TYPE3:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
35+
// CHECK: define{{.*}}foo3{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE3:[0-9]+]]
3636
pub fn foo4(_: *mut Type2, _: *mut Type2) { }
37-
// CHECK: define{{.*}}foo4{{.*}}!type ![[TYPE4:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
37+
// CHECK: define{{.*}}foo4{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE4:[0-9]+]]
3838
pub fn foo5(_: *mut Type2, _: *mut Type2, _: *mut Type2) { }
39-
// CHECK: define{{.*}}foo5{{.*}}!type ![[TYPE5:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
39+
// CHECK: define{{.*}}foo5{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE5:[0-9]+]]
4040
pub fn foo6(_: *mut Type3) { }
41-
// CHECK: define{{.*}}foo6{{.*}}!type ![[TYPE6:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
41+
// CHECK: define{{.*}}foo6{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE6:[0-9]+]]
4242
pub fn foo7(_: *mut Type3, _: *mut Type3) { }
43-
// CHECK: define{{.*}}foo7{{.*}}!type ![[TYPE7:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
43+
// CHECK: define{{.*}}foo7{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE7:[0-9]+]]
4444
pub fn foo8(_: *mut Type3, _: *mut Type3, _: *mut Type3) { }
45-
// CHECK: define{{.*}}foo8{{.*}}!type ![[TYPE8:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
45+
// CHECK: define{{.*}}foo8{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE8:[0-9]+]]
4646
pub fn foo9(_: Type4) { }
47-
// CHECK: define{{.*}}foo9{{.*}}!type ![[TYPE9:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
47+
// CHECK: define{{.*}}foo9{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE9:[0-9]+]]
4848
pub fn foo10(_: Type4, _: Type4) { }
49-
// CHECK: define{{.*}}foo10{{.*}}!type ![[TYPE10:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
49+
// CHECK: define{{.*}}foo10{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE10:[0-9]+]]
5050
pub fn foo11(_: Type4, _: Type4, _: Type4) { }
51-
// CHECK: define{{.*}}foo11{{.*}}!type ![[TYPE11:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
51+
// CHECK: define{{.*}}foo11{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE11:[0-9]+]]
5252
pub fn foo12(_: Type5) { }
53-
// CHECK: define{{.*}}foo12{{.*}}!type ![[TYPE12:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
53+
// CHECK: define{{.*}}foo12{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE12:[0-9]+]]
5454
pub fn foo13(_: Type5, _: Type5) { }
55-
// CHECK: define{{.*}}foo13{{.*}}!type ![[TYPE13:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
55+
// CHECK: define{{.*}}foo13{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE13:[0-9]+]]
5656
pub fn foo14(_: Type5, _: Type5, _: Type5) { }
57-
// CHECK: define{{.*}}foo14{{.*}}!type ![[TYPE14:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
57+
// CHECK: define{{.*}}foo14{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE14:[0-9]+]]
5858

5959
// CHECK: ![[TYPE0]] = !{i64 0, !"_ZTSFv3FooE"}
6060
// CHECK: ![[TYPE1]] = !{i64 0, !"_ZTSFv3FooS_E"}

tests/codegen/sanitizer/cfi/emit-type-metadata-id-itanium-cxx-abi-const-generics.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ pub fn foo() where
1919
}
2020

2121
pub fn foo1(_: Type1) { }
22-
// CHECK: define{{.*}}4foo1{{.*}}!type ![[TYPE1:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
22+
// CHECK: define{{.*}}4foo1{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE1:[0-9]+]]
2323
pub fn foo2(_: Type1, _: Type1) { }
24-
// CHECK: define{{.*}}4foo2{{.*}}!type ![[TYPE2:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
24+
// CHECK: define{{.*}}4foo2{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE2:[0-9]+]]
2525
pub fn foo3(_: Type1, _: Type1, _: Type1) { }
26-
// CHECK: define{{.*}}4foo3{{.*}}!type ![[TYPE3:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
26+
// CHECK: define{{.*}}4foo3{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE3:[0-9]+]]
2727

2828
// CHECK: ![[TYPE1]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNvC{{[[:print:]]+}}_{{[[:print:]]+}}3foo3FooIu3i32Lu5usize32EEE"}
2929
// CHECK: ![[TYPE2]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNvC{{[[:print:]]+}}_{{[[:print:]]+}}3foo3FooIu3i32Lu5usize32EES2_E"}

tests/codegen/sanitizer/cfi/emit-type-metadata-id-itanium-cxx-abi-function-types.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,29 @@
77
#![crate_type="lib"]
88

99
pub fn foo1(_: fn(i32) -> i32) { }
10-
// CHECK: define{{.*}}4foo1{{.*}}!type ![[TYPE1:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
10+
// CHECK: define{{.*}}4foo1{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE1:[0-9]+]]
1111
pub fn foo2(_: fn(i32) -> i32, _: fn(i32) -> i32) { }
12-
// CHECK: define{{.*}}4foo2{{.*}}!type ![[TYPE2:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
12+
// CHECK: define{{.*}}4foo2{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE2:[0-9]+]]
1313
pub fn foo3(_: fn(i32) -> i32, _: fn(i32) -> i32, _: fn(i32) -> i32) { }
14-
// CHECK: define{{.*}}4foo3{{.*}}!type ![[TYPE3:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
14+
// CHECK: define{{.*}}4foo3{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE3:[0-9]+]]
1515
pub fn foo4(_: &dyn Fn(i32) -> i32) { }
16-
// CHECK: define{{.*}}4foo4{{.*}}!type ![[TYPE4:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
16+
// CHECK: define{{.*}}4foo4{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE4:[0-9]+]]
1717
pub fn foo5(_: &dyn Fn(i32) -> i32, _: &dyn Fn(i32) -> i32) { }
18-
// CHECK: define{{.*}}4foo5{{.*}}!type ![[TYPE5:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
18+
// CHECK: define{{.*}}4foo5{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE5:[0-9]+]]
1919
pub fn foo6(_: &dyn Fn(i32) -> i32, _: &dyn Fn(i32) -> i32, _: &dyn Fn(i32) -> i32) { }
20-
// CHECK: define{{.*}}4foo6{{.*}}!type ![[TYPE6:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
20+
// CHECK: define{{.*}}4foo6{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE6:[0-9]+]]
2121
pub fn foo7(_: &dyn FnMut(i32) -> i32) { }
22-
// CHECK: define{{.*}}4foo7{{.*}}!type ![[TYPE7:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
22+
// CHECK: define{{.*}}4foo7{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE7:[0-9]+]]
2323
pub fn foo8(_: &dyn FnMut(i32) -> i32, _: &dyn FnMut(i32) -> i32) { }
24-
// CHECK: define{{.*}}4foo8{{.*}}!type ![[TYPE8:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
24+
// CHECK: define{{.*}}4foo8{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE8:[0-9]+]]
2525
pub fn foo9(_: &dyn FnMut(i32) -> i32, _: &dyn FnMut(i32) -> i32, _: &dyn FnMut(i32) -> i32) { }
26-
// CHECK: define{{.*}}4foo9{{.*}}!type ![[TYPE9:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
26+
// CHECK: define{{.*}}4foo9{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE9:[0-9]+]]
2727
pub fn foo10(_: &dyn FnOnce(i32) -> i32) { }
28-
// CHECK: define{{.*}}5foo10{{.*}}!type ![[TYPE10:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
28+
// CHECK: define{{.*}}5foo10{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE10:[0-9]+]]
2929
pub fn foo11(_: &dyn FnOnce(i32) -> i32, _: &dyn FnOnce(i32) -> i32) { }
30-
// CHECK: define{{.*}}5foo11{{.*}}!type ![[TYPE11:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
30+
// CHECK: define{{.*}}5foo11{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE11:[0-9]+]]
3131
pub fn foo12(_: &dyn FnOnce(i32) -> i32, _: &dyn FnOnce(i32) -> i32, _: &dyn FnOnce(i32) -> i32) {}
32-
// CHECK: define{{.*}}5foo12{{.*}}!type ![[TYPE12:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
32+
// CHECK: define{{.*}}5foo12{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE12:[0-9]+]]
3333

3434
// CHECK: ![[TYPE1]] = !{i64 0, !"_ZTSFvPFu3i32S_EE"}
3535
// CHECK: ![[TYPE2]] = !{i64 0, !"_ZTSFvPFu3i32S_ES0_E"}

tests/codegen/sanitizer/cfi/emit-type-metadata-id-itanium-cxx-abi-lifetimes.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ pub fn foo<'a>() where
2020
}
2121

2222
pub fn foo1(_: Type1) { }
23-
// CHECK: define{{.*}}4foo1{{.*}}!type ![[TYPE1:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
23+
// CHECK: define{{.*}}4foo1{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE1:[0-9]+]]
2424
pub fn foo2(_: Type1, _: Type1) { }
25-
// CHECK: define{{.*}}4foo2{{.*}}!type ![[TYPE2:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
25+
// CHECK: define{{.*}}4foo2{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE2:[0-9]+]]
2626
pub fn foo3(_: Type1, _: Type1, _: Type1) { }
27-
// CHECK: define{{.*}}4foo3{{.*}}!type ![[TYPE3:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
27+
// CHECK: define{{.*}}4foo3{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE3:[0-9]+]]

tests/codegen/sanitizer/cfi/emit-type-metadata-id-itanium-cxx-abi-paths.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -50,29 +50,29 @@ pub fn foo() where
5050
// Force arguments to be passed by using a reference. Otherwise, they may end up PassMode::Ignore
5151

5252
pub fn foo1(_: &Type1) { }
53-
// CHECK: define{{.*}}4foo1{{.*}}!type ![[TYPE1:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
53+
// CHECK: define{{.*}}4foo1{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE1:[0-9]+]]
5454
pub fn foo2(_: &Type1, _: &Type1) { }
55-
// CHECK: define{{.*}}4foo2{{.*}}!type ![[TYPE2:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
55+
// CHECK: define{{.*}}4foo2{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE2:[0-9]+]]
5656
pub fn foo3(_: &Type1, _: &Type1, _: &Type1) { }
57-
// CHECK: define{{.*}}4foo3{{.*}}!type ![[TYPE3:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
57+
// CHECK: define{{.*}}4foo3{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE3:[0-9]+]]
5858
pub fn foo4(_: &Type2) { }
59-
// CHECK: define{{.*}}4foo4{{.*}}!type ![[TYPE4:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
59+
// CHECK: define{{.*}}4foo4{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE4:[0-9]+]]
6060
pub fn foo5(_: &Type2, _: &Type2) { }
61-
// CHECK: define{{.*}}4foo5{{.*}}!type ![[TYPE5:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
61+
// CHECK: define{{.*}}4foo5{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE5:[0-9]+]]
6262
pub fn foo6(_: &Type2, _: &Type2, _: &Type2) { }
63-
// CHECK: define{{.*}}4foo6{{.*}}!type ![[TYPE6:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
63+
// CHECK: define{{.*}}4foo6{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE6:[0-9]+]]
6464
pub fn foo7(_: &Type3) { }
65-
// CHECK: define{{.*}}4foo7{{.*}}!type ![[TYPE7:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
65+
// CHECK: define{{.*}}4foo7{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE7:[0-9]+]]
6666
pub fn foo8(_: &Type3, _: &Type3) { }
67-
// CHECK: define{{.*}}4foo8{{.*}}!type ![[TYPE8:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
67+
// CHECK: define{{.*}}4foo8{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE8:[0-9]+]]
6868
pub fn foo9(_: &Type3, _: &Type3, _: &Type3) { }
69-
// CHECK: define{{.*}}4foo9{{.*}}!type ![[TYPE9:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
69+
// CHECK: define{{.*}}4foo9{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE9:[0-9]+]]
7070
pub fn foo10(_: &Type4) { }
71-
// CHECK: define{{.*}}5foo10{{.*}}!type ![[TYPE10:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
71+
// CHECK: define{{.*}}5foo10{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE10:[0-9]+]]
7272
pub fn foo11(_: &Type4, _: &Type4) { }
73-
// CHECK: define{{.*}}5foo11{{.*}}!type ![[TYPE11:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
73+
// CHECK: define{{.*}}5foo11{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE11:[0-9]+]]
7474
pub fn foo12(_: &Type4, _: &Type4, _: &Type4) { }
75-
// CHECK: define{{.*}}5foo12{{.*}}!type ![[TYPE12:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
75+
// CHECK: define{{.*}}5foo12{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE12:[0-9]+]]
7676

7777
// CHECK: ![[TYPE1]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NvNFNvC{{[[:print:]]+}}_{{[[:print:]]+}}3foo10{{[{}][{}]}}extern{{[}][}]}}3barEE"}
7878
// CHECK: ![[TYPE2]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NvNFNvC{{[[:print:]]+}}_{{[[:print:]]+}}3foo10{{[{}][{}]}}extern{{[}][}]}}3barES0_E"}

tests/codegen/sanitizer/cfi/emit-type-metadata-id-itanium-cxx-abi-pointer-types.rs

+15-15
Original file line numberDiff line numberDiff line change
@@ -7,35 +7,35 @@
77
#![crate_type="lib"]
88

99
pub fn foo1(_: &mut i32) { }
10-
// CHECK: define{{.*}}4foo1{{.*}}!type ![[TYPE1:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
10+
// CHECK: define{{.*}}4foo1{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE1:[0-9]+]]
1111
pub fn foo2(_: &mut i32, _: &i32) { }
12-
// CHECK: define{{.*}}4foo2{{.*}}!type ![[TYPE2:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
12+
// CHECK: define{{.*}}4foo2{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE2:[0-9]+]]
1313
pub fn foo3(_: &mut i32, _: &i32, _: &i32) { }
14-
// CHECK: define{{.*}}4foo3{{.*}}!type ![[TYPE3:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
14+
// CHECK: define{{.*}}4foo3{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE3:[0-9]+]]
1515
pub fn foo4(_: &i32) { }
16-
// CHECK: define{{.*}}4foo4{{.*}}!type ![[TYPE4:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
16+
// CHECK: define{{.*}}4foo4{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE4:[0-9]+]]
1717
pub fn foo5(_: &i32, _: &mut i32) { }
18-
// CHECK: define{{.*}}4foo5{{.*}}!type ![[TYPE5:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
18+
// CHECK: define{{.*}}4foo5{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE5:[0-9]+]]
1919
pub fn foo6(_: &i32, _: &mut i32, _: &mut i32) { }
20-
// CHECK: define{{.*}}4foo6{{.*}}!type ![[TYPE6:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
20+
// CHECK: define{{.*}}4foo6{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE6:[0-9]+]]
2121
pub fn foo7(_: *mut i32) { }
22-
// CHECK: define{{.*}}4foo7{{.*}}!type ![[TYPE7:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
22+
// CHECK: define{{.*}}4foo7{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE7:[0-9]+]]
2323
pub fn foo8(_: *mut i32, _: *const i32) { }
24-
// CHECK: define{{.*}}4foo8{{.*}}!type ![[TYPE8:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
24+
// CHECK: define{{.*}}4foo8{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE8:[0-9]+]]
2525
pub fn foo9(_: *mut i32, _: *const i32, _: *const i32) { }
26-
// CHECK: define{{.*}}4foo9{{.*}}!type ![[TYPE9:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
26+
// CHECK: define{{.*}}4foo9{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE9:[0-9]+]]
2727
pub fn foo10(_: *const i32) { }
28-
// CHECK: define{{.*}}5foo10{{.*}}!type ![[TYPE10:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
28+
// CHECK: define{{.*}}5foo10{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE10:[0-9]+]]
2929
pub fn foo11(_: *const i32, _: *mut i32) { }
30-
// CHECK: define{{.*}}5foo11{{.*}}!type ![[TYPE11:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
30+
// CHECK: define{{.*}}5foo11{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE11:[0-9]+]]
3131
pub fn foo12(_: *const i32, _: *mut i32, _: *mut i32) { }
32-
// CHECK: define{{.*}}5foo12{{.*}}!type ![[TYPE12:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
32+
// CHECK: define{{.*}}5foo12{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE12:[0-9]+]]
3333
pub fn foo13(_: fn(i32) -> i32) { }
34-
// CHECK: define{{.*}}5foo13{{.*}}!type ![[TYPE13:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
34+
// CHECK: define{{.*}}5foo13{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE13:[0-9]+]]
3535
pub fn foo14(_: fn(i32) -> i32, _: fn(i32) -> i32) { }
36-
// CHECK: define{{.*}}5foo14{{.*}}!type ![[TYPE14:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
36+
// CHECK: define{{.*}}5foo14{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE14:[0-9]+]]
3737
pub fn foo15(_: fn(i32) -> i32, _: fn(i32) -> i32, _: fn(i32) -> i32) { }
38-
// CHECK: define{{.*}}5foo15{{.*}}!type ![[TYPE15:[0-9]+]] !type !{{[0-9]+}} !type !{{[0-9]+}} !type !{{[0-9]+}}
38+
// CHECK: define{{.*}}5foo15{{.*}}unnamed_addr #{{[0-9]+}} !type ![[TYPE15:[0-9]+]]
3939

4040
// CHECK: ![[TYPE1]] = !{i64 0, !"_ZTSFvU3mutu3refIu3i32EE"}
4141
// CHECK: ![[TYPE2]] = !{i64 0, !"_ZTSFvU3mutu3refIu3i32ES0_E"}

0 commit comments

Comments
 (0)