Files
swift-mirror/test/embedded/classes-no-stdlib.swift
Arnold Schwaighofer 3dd5286d48 [embedded] [IRGen] Avoid creating "aliases" for type metadata address points in client modules
We don't need to export the type metadata address point alias in clients that
lazily emit other module's type metadata. There will be an exported
metadata symbol in the originating module for that purpose.

Instead, satisfy any local uses of the metadata address point uses by its
underlying address computation.

This is to workaround a bug where LLVM generates the wrong assembly for
weak aliases that point to an offset of another symbol.

```
@"$e1C7MyClassCySiGN" = weak_odr hidden alias %swift.type, getelementptr
inbounds (<{ ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }>,
ptr @"$e1C7MyClassCySiGMf", i32 0, i32 1)
```

Generates:

```
.weak_reference _$e1C7MyClassCySiGN
.private_extern _$e1C7MyClassCySiGN
.alt_entry  _$e1C7MyClassCySiGN
  _$e1C7MyClassCySiGN = _$e1C7MyClassCySiGMf+8
```

Instead of

```
.weak_definition _$e1C7MyClassCySiGN
.private_extern _$e1C7MyClassCySiGN
.alt_entry  _$e1C7MyClassCySiGN
  _$e1C7MyClassCySiGN = _$e1C7MyClassCySiGMf+8
```

Leading for "weak"ness to be ignored and duplicate type medata symbol linkage
errors.

rdar://169573918
2026-02-06 12:24:08 -08:00

57 lines
2.6 KiB
Swift

// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo -disable-experimental-feature EmbeddedExistentials | %FileCheck %s
// RUN: %target-swift-emit-ir %s -parse-stdlib -enable-experimental-feature Embedded -target arm64e-apple-none -wmo | %FileCheck %s --check-prefix=EXIST
// REQUIRES: swift_in_compiler
// REQUIRES: swift_feature_Embedded
public class MyClass {}
// CHECK-DAG: @"$e4main7MyClassCN" = {{.*}}<{ ptr, ptr, ptr, ptr }> <{ ptr null, ptr @"$e4main7MyClassCfD", ptr null, ptr @"$e4main7MyClassCACycfC" }>
// CHECK-DAG: define {{.*}}ptr @"$e4main7MyClassCfd"
// CHECK-DAG: define {{.*}}void @"$e4main7MyClassCfD"
// CHECK-DAG: define {{.*}}ptr @"$e4main7MyClassCACycfC"
// CHECK-DAG: define {{.*}}ptr @"$e4main7MyClassCACycfc"
public func foo() -> MyClass {
return MyClass()
}
// CHECK-DAG: define {{.*}}ptr @"$e4main3fooAA7MyClassCyF"
public class MySubClass: MyClass {}
// CHECK-DAG: @"$e4main10MySubClassCN" = {{.*}}<{ ptr, ptr, ptr, ptr }> <{ ptr @"$e4main7MyClassCN", ptr @"$e4main10MySubClassCfD", ptr null, ptr @"$e4main10MySubClassCACycfC" }>
// CHECK-DAG: define {{.*}}ptr @"$e4main10MySubClassCACycfC"
// CHECK-DAG: define {{.*}}ptr @"$e4main10MySubClassCACycfc"
// CHECK-DAG: define {{.*}}ptr @"$e4main10MySubClassCfd"
// CHECK-DAG: define {{.*}}void @"$e4main10MySubClassCfD"
public func bar() -> MyClass {
return MySubClass()
}
// CHECK-DAG: define {{.*}}ptr @"$e4main3barAA7MyClassCyF"
// EXIST-DAG: @"$e4main10MySubClassCMf" = {{.*}} <{ ptr @"$eBoWV", ptr getelementptr inbounds ({{.*}}, ptr @"$e4main7MyClassCMf", i32 0, i32 1), ptr @"$e4main10MySubClassCfD", ptr null, ptr @"$e4main10MySubClassCACycfC" }>
// EXIST-DAG: @"$e4main7MyClassCMf" = {{.*}} <{ ptr @"$eBoWV", ptr null, ptr @"$e4main7MyClassCfD", ptr null, ptr @"$e4main7MyClassCACycfC" }>
// EXIST-DAG: @"$e4main10MySubClassCN" = {{.*}} ptr @"$e4main10MySubClassCMf", i32 0, i32 1)
// EXIST-DAG: @"$e4main7MyClassCN" = {{.*}} ptr @"$e4main7MyClassCMf", i32 0, i32 1)
// EXIST-DAG: define {{.*}}ptr @"$e4main3barAA7MyClassCyF"
// EXIST-DAG: define {{.*}}ptr @"$e4main7MyClassCfd"
// EXIST-DAG: define {{.*}}void @"$e4main7MyClassCfD"
// EXIST-DAG: define {{.*}}ptr @"$e4main7MyClassCACycfC"
// EXIST-DAG: define {{.*}}ptr @"$e4main7MyClassCACycfc"
// EXIST-DAG: define {{.*}}ptr @"$e4main3fooAA7MyClassCyF"
// EXIST-DAG: define {{.*}}ptr @"$e4main10MySubClassCACycfC"
// EXIST-DAG: define {{.*}}ptr @"$e4main10MySubClassCACycfc"
// EXIST-DAG: define {{.*}}ptr @"$e4main10MySubClassCfd"
// EXIST-DAG: define {{.*}}void @"$e4main10MySubClassCfD"