https://github.com/luxufan updated https://github.com/llvm/llvm-project/pull/111343
>From cabe9e1ac1305d970d944183ebf10effe783f5fc Mon Sep 17 00:00:00 2001 From: luxufan <luxufan981...@gmail.com> Date: Mon, 7 Oct 2024 07:14:06 +0000 Subject: [PATCH 1/4] [ItaniumCXXABI] Mark RTTI type name as global unnamed_addr The RTTI type name global variable should be marked as global unnamed_addr since the address of RTTI type name global variable is not significant. --- clang/lib/CodeGen/ItaniumCXXABI.cpp | 1 + clang/test/CodeGen/split-lto-unit-input.cpp | 4 ++-- .../RelativeVTablesABI/parent-vtable-in-comdat.cpp | 2 +- clang/test/CodeGenCXX/anonymous-namespaces.cpp | 2 +- clang/test/CodeGenCXX/arm64.cpp | 12 ++++++------ clang/test/CodeGenCXX/armv7k.cpp | 14 ++++---------- .../test/CodeGenCXX/windows-itanium-type-info.cpp | 14 ++++---------- 7 files changed, 19 insertions(+), 30 deletions(-) diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 965e09a7a760ec..4b9cd70ce4d55d 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -3532,6 +3532,7 @@ llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName( Name, Init->getType(), Linkage, Align.getAsAlign()); GV->setInitializer(Init); + GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); return GV; } diff --git a/clang/test/CodeGen/split-lto-unit-input.cpp b/clang/test/CodeGen/split-lto-unit-input.cpp index adfc9ac3e0f446..99de0f68f84978 100644 --- a/clang/test/CodeGen/split-lto-unit-input.cpp +++ b/clang/test/CodeGen/split-lto-unit-input.cpp @@ -12,8 +12,8 @@ // CHECK-NEXT: V _ZTV1A // CHECK-NEXT: V _ZTV1B -// CHECK-IR-DAG: _ZTS1B = linkonce_odr constant -// CHECK-IR-DAG: _ZTS1A = linkonce_odr constant +// CHECK-IR-DAG: _ZTS1B = linkonce_odr unnamed_addr constant +// CHECK-IR-DAG: _ZTS1A = linkonce_odr unnamed_addr constant // CHECK-IR-DAG: _ZTV1B = linkonce_odr unnamed_addr constant // CHECK-IR-DAG: _ZTI1A = linkonce_odr constant // CHECK-IR-DAG: _ZTI1B = linkonce_odr constant diff --git a/clang/test/CodeGenCXX/RelativeVTablesABI/parent-vtable-in-comdat.cpp b/clang/test/CodeGenCXX/RelativeVTablesABI/parent-vtable-in-comdat.cpp index 341c53146d476d..6a833cf3884546 100644 --- a/clang/test/CodeGenCXX/RelativeVTablesABI/parent-vtable-in-comdat.cpp +++ b/clang/test/CodeGenCXX/RelativeVTablesABI/parent-vtable-in-comdat.cpp @@ -16,7 +16,7 @@ // The VTable for A is emitted here and in a comdat section since it has no key function, and is used in this module when creating an instance of A. // CHECK: @_ZTV1A.local = linkonce_odr hidden unnamed_addr constant { [3 x i32] } { [3 x i32] [i32 0, i32 trunc (i64 sub (i64 ptrtoint (ptr @_ZTI1A.rtti_proxy to i64), i64 ptrtoint (ptr getelementptr inbounds ({ [3 x i32] }, ptr @_ZTV1A.local, i32 0, i32 0, i32 2) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @_ZN1A3fooEv to i64), i64 ptrtoint (ptr getelementptr inbounds ({ [3 x i32] }, ptr @_ZTV1A.local, i32 0, i32 0, i32 2) to i64)) to i32)] }, comdat($_ZTV1A), align 4 // CHECK: @_ZTVN10__cxxabiv117__class_type_infoE = external global [0 x ptr] -// CHECK: @_ZTS1A = linkonce_odr constant [3 x i8] c"1A\00", comdat, align 1 +// CHECK: @_ZTS1A = linkonce_odr unnamed_addr constant [3 x i8] c"1A\00", comdat, align 1 // CHECK: @_ZTI1A = linkonce_odr constant { ptr, ptr } { ptr getelementptr inbounds (i8, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i32 8), ptr @_ZTS1A }, comdat, align 8 // CHECK: @_ZTI1A.rtti_proxy = linkonce_odr hidden unnamed_addr constant ptr @_ZTI1A, comdat // CHECK: @_ZTV1A = linkonce_odr unnamed_addr alias { [3 x i32] }, ptr @_ZTV1A.local diff --git a/clang/test/CodeGenCXX/anonymous-namespaces.cpp b/clang/test/CodeGenCXX/anonymous-namespaces.cpp index f40039c2a4f400..eb185be52c15a4 100644 --- a/clang/test/CodeGenCXX/anonymous-namespaces.cpp +++ b/clang/test/CodeGenCXX/anonymous-namespaces.cpp @@ -29,7 +29,7 @@ namespace { int D::d = f(); // Check for generation of a VTT with internal linkage - // CHECK-1: @_ZTSN12_GLOBAL__N_11X1EE = internal constant + // CHECK-1: @_ZTSN12_GLOBAL__N_11X1EE = internal unnamed_addr constant struct X { struct EBase { }; struct E : public virtual EBase { virtual ~E() {} }; diff --git a/clang/test/CodeGenCXX/arm64.cpp b/clang/test/CodeGenCXX/arm64.cpp index 338b7db9e001f2..f452cf9a8b5072 100644 --- a/clang/test/CodeGenCXX/arm64.cpp +++ b/clang/test/CodeGenCXX/arm64.cpp @@ -48,20 +48,20 @@ namespace test2 { struct __attribute__((visibility("hidden"))) B {}; const std::type_info &b0 = typeid(B); - // CHECK-GLOBALS-DAG: @_ZTSN5test21BE = linkonce_odr hidden constant + // CHECK-GLOBALS-DAG: @_ZTSN5test21BE = linkonce_odr hidden unnamed_addr constant // CHECK-GLOBALS-DAG: @_ZTIN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSN5test21BE } const std::type_info &b1 = typeid(B*); - // CHECK-GLOBALS-DAG: @_ZTSPN5test21BE = linkonce_odr hidden constant + // CHECK-GLOBALS-DAG: @_ZTSPN5test21BE = linkonce_odr hidden unnamed_addr constant // CHECK-GLOBALS-DAG: @_ZTIPN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSPN5test21BE, i32 0, ptr @_ZTIN5test21BE struct C {}; const std::type_info &c0 = typeid(C); - // CHECK-GLOBALS-DAG: @_ZTSN5test21CE = linkonce_odr hidden constant + // CHECK-GLOBALS-DAG: @_ZTSN5test21CE = linkonce_odr hidden unnamed_addr constant // CHECK-GLOBALS-DAG: @_ZTIN5test21CE = linkonce_odr hidden constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSN5test21CE to i64), i64 -9223372036854775808) to ptr) } const std::type_info &c1 = typeid(C*); - // CHECK-GLOBALS-DAG: @_ZTSPN5test21CE = linkonce_odr hidden constant + // CHECK-GLOBALS-DAG: @_ZTSPN5test21CE = linkonce_odr hidden unnamed_addr constant // CHECK-GLOBALS-DAG: @_ZTIPN5test21CE = linkonce_odr hidden constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSPN5test21CE to i64), i64 -9223372036854775808) to ptr), i32 0, ptr @_ZTIN5test21CE // This class is explicitly-instantiated, but that instantiation @@ -69,7 +69,7 @@ namespace test2 { template <class T> class D {}; template class D<int>; const std::type_info &d0 = typeid(D<int>); - // CHECK-GLOBALS-DAG: @_ZTSN5test21DIiEE = linkonce_odr hidden constant + // CHECK-GLOBALS-DAG: @_ZTSN5test21DIiEE = linkonce_odr hidden unnamed_addr constant // CHECK-GLOBALS-DAG: @_ZTIN5test21DIiEE = linkonce_odr hidden constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSN5test21DIiEE to i64), i64 -9223372036854775808) to ptr) } // This class is explicitly-instantiated and *does* guarantee to @@ -78,7 +78,7 @@ namespace test2 { virtual void foo() {} }; template class E<int>; - // CHECK-GLOBALS-DAG: @_ZTSN5test21EIiEE = weak_odr constant [14 x i8] + // CHECK-GLOBALS-DAG: @_ZTSN5test21EIiEE = weak_odr unnamed_addr constant [14 x i8] // CHECK-GLOBALS-DAG: @_ZTIN5test21EIiEE = weak_odr constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSN5test21EIiEE to i64), i64 -9223372036854775808) to ptr) } } diff --git a/clang/test/CodeGenCXX/armv7k.cpp b/clang/test/CodeGenCXX/armv7k.cpp index a4a243c162ea3f..a8496c85bc0733 100644 --- a/clang/test/CodeGenCXX/armv7k.cpp +++ b/clang/test/CodeGenCXX/armv7k.cpp @@ -1,3 +1,4 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 // RUN: %clang_cc1 %s -triple=thumbv7k-apple-watchos -emit-llvm -o - -target-abi aapcs16 | FileCheck %s // RUN: %clang_cc1 %s -triple=thumbv7k-apple-watchos -emit-llvm -o - -target-abi aapcs16 | FileCheck -check-prefix=CHECK-GLOBALS %s @@ -10,7 +11,6 @@ struct A { }; void f() { - // CHECK: call i32 @__cxa_guard_acquire(ptr static A a; } @@ -31,8 +31,6 @@ namespace test1 { int test() { return sizeof(B); } - // CHECK: define{{.*}} i32 @_ZN5test14testEv() - // CHECK: ret i32 12 } namespace std { @@ -50,20 +48,16 @@ namespace test2 { struct __attribute__((visibility("hidden"))) B {}; const std::type_info &b0 = typeid(B); - // CHECK-GLOBALS: @_ZTSN5test21BE = linkonce_odr hidden constant - // CHECK-GLOBALS: @_ZTIN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSN5test21BE } const std::type_info &b1 = typeid(B*); - // CHECK-GLOBALS: @_ZTSPN5test21BE = linkonce_odr hidden constant - // CHECK-GLOBALS: @_ZTIPN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSPN5test21BE, i32 0, ptr @_ZTIN5test21BE struct C {}; const std::type_info &c0 = typeid(C); - // CHECK-GLOBALS: @_ZTSN5test21CE = linkonce_odr constant [11 x i8] c"N5test21CE\00" - // CHECK-GLOBALS: @_ZTIN5test21CE = linkonce_odr constant { {{.*}}, ptr @_ZTSN5test21CE } } // va_list should be based on "char *" rather than "ptr". -// CHECK: define{{.*}} void @_Z11whatsVaListPc void whatsVaList(__builtin_va_list l) {} +//// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +// CHECK: {{.*}} +// CHECK-GLOBALS: {{.*}} diff --git a/clang/test/CodeGenCXX/windows-itanium-type-info.cpp b/clang/test/CodeGenCXX/windows-itanium-type-info.cpp index 20bd78df509837..709059cc7f06c6 100644 --- a/clang/test/CodeGenCXX/windows-itanium-type-info.cpp +++ b/clang/test/CodeGenCXX/windows-itanium-type-info.cpp @@ -1,3 +1,4 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 // RUN: %clang_cc1 -triple i686-windows-itanium -fdeclspec -fcxx-exceptions -emit-llvm %s -o - | FileCheck %s // RUN: %clang_cc1 -triple i686-windows-itanium -fdeclspec -fcxx-exceptions -fno-rtti -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-EH-IMPORT @@ -24,17 +25,9 @@ void f() { throw base(); } -// CHECK-DAG: @_ZTIi = dso_local dllexport constant -// CHECK-DAG: @_ZTSi = dso_local dllexport constant -// CHECK-DAG: @_ZTI7derived = dso_local dllexport constant -// CHECK-DAG: @_ZTS7derived = dso_local dllexport constant -// CHECK-DAG: @_ZTV7derived = dso_local dllexport unnamed_addr constant -// CHECK-DAG: @_ZTI4base = external dllimport constant -// CHECK-EH-IMPORT: @_ZTS4base = linkonce_odr dso_local constant -// CHECK-EH-IMPORT: @_ZTI4base = linkonce_odr dso_local constant struct __declspec(dllimport) gatekeeper {}; struct zuul : gatekeeper { @@ -42,5 +35,6 @@ struct zuul : gatekeeper { }; zuul::~zuul() {} -// CHECK-DAG: @_ZTI10gatekeeper = linkonce_odr dso_local constant -// CHECK-DAG: @_ZTS10gatekeeper = linkonce_odr dso_local constant +//// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +// CHECK: {{.*}} +// CHECK-EH-IMPORT: {{.*}} >From 08ced2b22304f3338440a180c5711cc505a1584f Mon Sep 17 00:00:00 2001 From: luxufan <luxufan981...@gmail.com> Date: Mon, 7 Oct 2024 08:08:44 +0000 Subject: [PATCH 2/4] restore test file --- clang/test/CodeGenCXX/armv7k.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/clang/test/CodeGenCXX/armv7k.cpp b/clang/test/CodeGenCXX/armv7k.cpp index a8496c85bc0733..a4a243c162ea3f 100644 --- a/clang/test/CodeGenCXX/armv7k.cpp +++ b/clang/test/CodeGenCXX/armv7k.cpp @@ -1,4 +1,3 @@ -// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 // RUN: %clang_cc1 %s -triple=thumbv7k-apple-watchos -emit-llvm -o - -target-abi aapcs16 | FileCheck %s // RUN: %clang_cc1 %s -triple=thumbv7k-apple-watchos -emit-llvm -o - -target-abi aapcs16 | FileCheck -check-prefix=CHECK-GLOBALS %s @@ -11,6 +10,7 @@ struct A { }; void f() { + // CHECK: call i32 @__cxa_guard_acquire(ptr static A a; } @@ -31,6 +31,8 @@ namespace test1 { int test() { return sizeof(B); } + // CHECK: define{{.*}} i32 @_ZN5test14testEv() + // CHECK: ret i32 12 } namespace std { @@ -48,16 +50,20 @@ namespace test2 { struct __attribute__((visibility("hidden"))) B {}; const std::type_info &b0 = typeid(B); + // CHECK-GLOBALS: @_ZTSN5test21BE = linkonce_odr hidden constant + // CHECK-GLOBALS: @_ZTIN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSN5test21BE } const std::type_info &b1 = typeid(B*); + // CHECK-GLOBALS: @_ZTSPN5test21BE = linkonce_odr hidden constant + // CHECK-GLOBALS: @_ZTIPN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSPN5test21BE, i32 0, ptr @_ZTIN5test21BE struct C {}; const std::type_info &c0 = typeid(C); + // CHECK-GLOBALS: @_ZTSN5test21CE = linkonce_odr constant [11 x i8] c"N5test21CE\00" + // CHECK-GLOBALS: @_ZTIN5test21CE = linkonce_odr constant { {{.*}}, ptr @_ZTSN5test21CE } } // va_list should be based on "char *" rather than "ptr". +// CHECK: define{{.*}} void @_Z11whatsVaListPc void whatsVaList(__builtin_va_list l) {} -//// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: -// CHECK: {{.*}} -// CHECK-GLOBALS: {{.*}} >From 8b865cc807636ba1c08290c403eaefe555c4edcd Mon Sep 17 00:00:00 2001 From: luxufan <luxufan981...@gmail.com> Date: Mon, 7 Oct 2024 08:09:56 +0000 Subject: [PATCH 3/4] restore test file --- .../test/CodeGenCXX/windows-itanium-type-info.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/clang/test/CodeGenCXX/windows-itanium-type-info.cpp b/clang/test/CodeGenCXX/windows-itanium-type-info.cpp index 709059cc7f06c6..20bd78df509837 100644 --- a/clang/test/CodeGenCXX/windows-itanium-type-info.cpp +++ b/clang/test/CodeGenCXX/windows-itanium-type-info.cpp @@ -1,4 +1,3 @@ -// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 // RUN: %clang_cc1 -triple i686-windows-itanium -fdeclspec -fcxx-exceptions -emit-llvm %s -o - | FileCheck %s // RUN: %clang_cc1 -triple i686-windows-itanium -fdeclspec -fcxx-exceptions -fno-rtti -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-EH-IMPORT @@ -25,9 +24,17 @@ void f() { throw base(); } +// CHECK-DAG: @_ZTIi = dso_local dllexport constant +// CHECK-DAG: @_ZTSi = dso_local dllexport constant +// CHECK-DAG: @_ZTI7derived = dso_local dllexport constant +// CHECK-DAG: @_ZTS7derived = dso_local dllexport constant +// CHECK-DAG: @_ZTV7derived = dso_local dllexport unnamed_addr constant +// CHECK-DAG: @_ZTI4base = external dllimport constant +// CHECK-EH-IMPORT: @_ZTS4base = linkonce_odr dso_local constant +// CHECK-EH-IMPORT: @_ZTI4base = linkonce_odr dso_local constant struct __declspec(dllimport) gatekeeper {}; struct zuul : gatekeeper { @@ -35,6 +42,5 @@ struct zuul : gatekeeper { }; zuul::~zuul() {} -//// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: -// CHECK: {{.*}} -// CHECK-EH-IMPORT: {{.*}} +// CHECK-DAG: @_ZTI10gatekeeper = linkonce_odr dso_local constant +// CHECK-DAG: @_ZTS10gatekeeper = linkonce_odr dso_local constant >From 568cc74a784708c9eb42958e500564933dd12147 Mon Sep 17 00:00:00 2001 From: Xufan Lu <luxu...@ulam.inesc-id.pt> Date: Thu, 10 Oct 2024 14:01:24 +0100 Subject: [PATCH 4/4] Mark unnamed_addr if no RTTI uniqueness otherwise local_unnamed_addr --- clang/lib/CodeGen/ItaniumCXXABI.cpp | 8 ++++++-- clang/test/CodeGen/split-lto-unit-input.cpp | 8 ++++---- .../parent-vtable-in-comdat.cpp | 6 +++--- .../test/CodeGenCXX/anonymous-namespaces.cpp | 2 +- clang/test/CodeGenCXX/arm64.cpp | 20 +++++++++---------- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 4b9cd70ce4d55d..542a50780d45af 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -3532,8 +3532,6 @@ llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName( Name, Init->getType(), Linkage, Align.getAsAlign()); GV->setInitializer(Init); - GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); - return GV; } @@ -4098,6 +4096,7 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( // And the name. llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage); llvm::Constant *TypeNameField; + llvm::GlobalValue::UnnamedAddr Scope; // If we're supposed to demote the visibility, be sure to set a flag // to use a string comparison for type_info comparisons. @@ -4112,8 +4111,10 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag); TypeNameField = llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.GlobalsInt8PtrTy); + Scope = llvm::GlobalValue::UnnamedAddr::Global; } else { TypeNameField = TypeName; + Scope = llvm::GlobalValue::UnnamedAddr::Local; } Fields.push_back(TypeNameField); @@ -4272,6 +4273,9 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( TypeName->setPartition(CGM.getCodeGenOpts().SymbolPartition); GV->setPartition(CGM.getCodeGenOpts().SymbolPartition); + TypeName->setUnnamedAddr(Scope); + GV->setUnnamedAddr(Scope); + return GV; } diff --git a/clang/test/CodeGen/split-lto-unit-input.cpp b/clang/test/CodeGen/split-lto-unit-input.cpp index 99de0f68f84978..a641f18d804262 100644 --- a/clang/test/CodeGen/split-lto-unit-input.cpp +++ b/clang/test/CodeGen/split-lto-unit-input.cpp @@ -12,11 +12,11 @@ // CHECK-NEXT: V _ZTV1A // CHECK-NEXT: V _ZTV1B -// CHECK-IR-DAG: _ZTS1B = linkonce_odr unnamed_addr constant -// CHECK-IR-DAG: _ZTS1A = linkonce_odr unnamed_addr constant +// CHECK-IR-DAG: _ZTS1B = linkonce_odr local_unnamed_addr constant +// CHECK-IR-DAG: _ZTS1A = linkonce_odr local_unnamed_addr constant // CHECK-IR-DAG: _ZTV1B = linkonce_odr unnamed_addr constant -// CHECK-IR-DAG: _ZTI1A = linkonce_odr constant -// CHECK-IR-DAG: _ZTI1B = linkonce_odr constant +// CHECK-IR-DAG: _ZTI1A = linkonce_odr local_unnamed_addr constant +// CHECK-IR-DAG: _ZTI1B = linkonce_odr local_unnamed_addr constant // CHECK-IR-DAG: _ZTV1A = linkonce_odr unnamed_addr constant struct A { diff --git a/clang/test/CodeGenCXX/RelativeVTablesABI/parent-vtable-in-comdat.cpp b/clang/test/CodeGenCXX/RelativeVTablesABI/parent-vtable-in-comdat.cpp index 6a833cf3884546..a7320b014233c0 100644 --- a/clang/test/CodeGenCXX/RelativeVTablesABI/parent-vtable-in-comdat.cpp +++ b/clang/test/CodeGenCXX/RelativeVTablesABI/parent-vtable-in-comdat.cpp @@ -1,8 +1,8 @@ // Cross comdat example // Parent VTable is in a comdat section. -// RUN: %clang_cc1 %s -triple=aarch64 -o - -emit-llvm -fexperimental-relative-c++-abi-vtables | FileCheck %s // RUN: %clang_cc1 %s -triple=x86_64 -o - -emit-llvm -fexperimental-relative-c++-abi-vtables | FileCheck %s +// RUN: %clang_cc1 %s -triple=aarch64 -o - -emit-llvm -fexperimental-relative-c++-abi-vtables | FileCheck %s // A::foo() has a comdat since it is an inline function // CHECK: $_ZN1A3fooEv = comdat any @@ -16,8 +16,8 @@ // The VTable for A is emitted here and in a comdat section since it has no key function, and is used in this module when creating an instance of A. // CHECK: @_ZTV1A.local = linkonce_odr hidden unnamed_addr constant { [3 x i32] } { [3 x i32] [i32 0, i32 trunc (i64 sub (i64 ptrtoint (ptr @_ZTI1A.rtti_proxy to i64), i64 ptrtoint (ptr getelementptr inbounds ({ [3 x i32] }, ptr @_ZTV1A.local, i32 0, i32 0, i32 2) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @_ZN1A3fooEv to i64), i64 ptrtoint (ptr getelementptr inbounds ({ [3 x i32] }, ptr @_ZTV1A.local, i32 0, i32 0, i32 2) to i64)) to i32)] }, comdat($_ZTV1A), align 4 // CHECK: @_ZTVN10__cxxabiv117__class_type_infoE = external global [0 x ptr] -// CHECK: @_ZTS1A = linkonce_odr unnamed_addr constant [3 x i8] c"1A\00", comdat, align 1 -// CHECK: @_ZTI1A = linkonce_odr constant { ptr, ptr } { ptr getelementptr inbounds (i8, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i32 8), ptr @_ZTS1A }, comdat, align 8 +// CHECK: @_ZTS1A = linkonce_odr local_unnamed_addr constant [3 x i8] c"1A\00", comdat, align 1 +// CHECK: @_ZTI1A = linkonce_odr local_unnamed_addr constant { ptr, ptr } { ptr getelementptr inbounds (i8, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i32 8), ptr @_ZTS1A }, comdat, align 8 // CHECK: @_ZTI1A.rtti_proxy = linkonce_odr hidden unnamed_addr constant ptr @_ZTI1A, comdat // CHECK: @_ZTV1A = linkonce_odr unnamed_addr alias { [3 x i32] }, ptr @_ZTV1A.local diff --git a/clang/test/CodeGenCXX/anonymous-namespaces.cpp b/clang/test/CodeGenCXX/anonymous-namespaces.cpp index eb185be52c15a4..d5cf6d9f62648e 100644 --- a/clang/test/CodeGenCXX/anonymous-namespaces.cpp +++ b/clang/test/CodeGenCXX/anonymous-namespaces.cpp @@ -29,7 +29,7 @@ namespace { int D::d = f(); // Check for generation of a VTT with internal linkage - // CHECK-1: @_ZTSN12_GLOBAL__N_11X1EE = internal unnamed_addr constant + // CHECK-1: @_ZTSN12_GLOBAL__N_11X1EE = internal local_unnamed_addr constant struct X { struct EBase { }; struct E : public virtual EBase { virtual ~E() {} }; diff --git a/clang/test/CodeGenCXX/arm64.cpp b/clang/test/CodeGenCXX/arm64.cpp index f452cf9a8b5072..17e5d52de6b7ef 100644 --- a/clang/test/CodeGenCXX/arm64.cpp +++ b/clang/test/CodeGenCXX/arm64.cpp @@ -43,26 +43,26 @@ namespace test2 { virtual void foo(); }; void A::foo() {} - // CHECK-GLOBALS-DAG: @_ZTSN5test21AE ={{.*}} constant [11 x i8] - // CHECK-GLOBALS-DAG: @_ZTIN5test21AE ={{.*}} constant { {{.*}}, ptr @_ZTSN5test21AE } + // CHECK-GLOBALS-DAG: @_ZTSN5test21AE ={{.*}} local_unnamed_addr constant [11 x i8] + // CHECK-GLOBALS-DAG: @_ZTIN5test21AE ={{.*}} local_unnamed_addr constant { {{.*}}, ptr @_ZTSN5test21AE } struct __attribute__((visibility("hidden"))) B {}; const std::type_info &b0 = typeid(B); - // CHECK-GLOBALS-DAG: @_ZTSN5test21BE = linkonce_odr hidden unnamed_addr constant - // CHECK-GLOBALS-DAG: @_ZTIN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSN5test21BE } + // CHECK-GLOBALS-DAG: @_ZTSN5test21BE = linkonce_odr hidden local_unnamed_addr constant + // CHECK-GLOBALS-DAG: @_ZTIN5test21BE = linkonce_odr hidden local_unnamed_addr constant { {{.*}}, ptr @_ZTSN5test21BE } const std::type_info &b1 = typeid(B*); - // CHECK-GLOBALS-DAG: @_ZTSPN5test21BE = linkonce_odr hidden unnamed_addr constant - // CHECK-GLOBALS-DAG: @_ZTIPN5test21BE = linkonce_odr hidden constant { {{.*}}, ptr @_ZTSPN5test21BE, i32 0, ptr @_ZTIN5test21BE + // CHECK-GLOBALS-DAG: @_ZTSPN5test21BE = linkonce_odr hidden local_unnamed_addr constant + // CHECK-GLOBALS-DAG: @_ZTIPN5test21BE = linkonce_odr hidden local_unnamed_addr constant { {{.*}}, ptr @_ZTSPN5test21BE, i32 0, ptr @_ZTIN5test21BE struct C {}; const std::type_info &c0 = typeid(C); // CHECK-GLOBALS-DAG: @_ZTSN5test21CE = linkonce_odr hidden unnamed_addr constant - // CHECK-GLOBALS-DAG: @_ZTIN5test21CE = linkonce_odr hidden constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSN5test21CE to i64), i64 -9223372036854775808) to ptr) } + // CHECK-GLOBALS-DAG: @_ZTIN5test21CE = linkonce_odr hidden unnamed_addr constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSN5test21CE to i64), i64 -9223372036854775808) to ptr) } const std::type_info &c1 = typeid(C*); // CHECK-GLOBALS-DAG: @_ZTSPN5test21CE = linkonce_odr hidden unnamed_addr constant - // CHECK-GLOBALS-DAG: @_ZTIPN5test21CE = linkonce_odr hidden constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSPN5test21CE to i64), i64 -9223372036854775808) to ptr), i32 0, ptr @_ZTIN5test21CE + // CHECK-GLOBALS-DAG: @_ZTIPN5test21CE = linkonce_odr hidden unnamed_addr constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSPN5test21CE to i64), i64 -9223372036854775808) to ptr), i32 0, ptr @_ZTIN5test21CE // This class is explicitly-instantiated, but that instantiation // doesn't guarantee to emit RTTI, so we can still demote the visibility. @@ -70,7 +70,7 @@ namespace test2 { template class D<int>; const std::type_info &d0 = typeid(D<int>); // CHECK-GLOBALS-DAG: @_ZTSN5test21DIiEE = linkonce_odr hidden unnamed_addr constant - // CHECK-GLOBALS-DAG: @_ZTIN5test21DIiEE = linkonce_odr hidden constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSN5test21DIiEE to i64), i64 -9223372036854775808) to ptr) } + // CHECK-GLOBALS-DAG: @_ZTIN5test21DIiEE = linkonce_odr hidden unnamed_addr constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSN5test21DIiEE to i64), i64 -9223372036854775808) to ptr) } // This class is explicitly-instantiated and *does* guarantee to // emit RTTI, so we're stuck with having to use default visibility. @@ -79,7 +79,7 @@ namespace test2 { }; template class E<int>; // CHECK-GLOBALS-DAG: @_ZTSN5test21EIiEE = weak_odr unnamed_addr constant [14 x i8] - // CHECK-GLOBALS-DAG: @_ZTIN5test21EIiEE = weak_odr constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSN5test21EIiEE to i64), i64 -9223372036854775808) to ptr) } + // CHECK-GLOBALS-DAG: @_ZTIN5test21EIiEE = weak_odr unnamed_addr constant { {{.*}}, ptr inttoptr (i64 add (i64 ptrtoint (ptr @_ZTSN5test21EIiEE to i64), i64 -9223372036854775808) to ptr) } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits