Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit c174fe5

Browse files
committed
type_info objects are not unnamed_addr: the ABI requires us to
unique them and permits the implementation of dynamic_cast (and anything else which knows it's working with a complete class type) to compare their addresses directly. rdar://16005328 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201020 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent da8b957 commit c174fe5

15 files changed

+177
-170
lines changed

lib/CodeGen/CGRTTI.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,21 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
644644
OldGV->eraseFromParent();
645645
}
646646

647+
// The Itanium ABI specifies that type_info objects must be globally
648+
// unique, with one exception: if the type is an incomplete class
649+
// type or a (possibly indirect) pointer to one. That exception
650+
// affects the general case of comparing type_info objects produced
651+
// by the typeid operator, which is why the comparison operators on
652+
// std::type_info generally use the type_info name pointers instead
653+
// of the object addresses. However, the language's built-in uses
654+
// of RTTI generally require class types to be complete, even when
655+
// manipulating pointers to those class types. This allows the
656+
// implementation of dynamic_cast to rely on address equality tests,
657+
// which is much faster.
658+
659+
// All of this is to say that it's important that both the type_info
660+
// object and the type_info name be uniqued when weakly emitted.
661+
647662
// Give the type_info object and name the formal visibility of the
648663
// type itself.
649664
Visibility formalVisibility = Ty->getVisibility();
@@ -652,14 +667,6 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
652667
TypeName->setVisibility(llvmVisibility);
653668
GV->setVisibility(llvmVisibility);
654669

655-
// Contra the Itanium ABI, we do not rely or guarantee strict
656-
// address-equivalence of type_info objects.
657-
//
658-
// The main effect of setting this flag is that LLVM will
659-
// automatically decrease the visibility of linkonce_odr type_info
660-
// objects.
661-
GV->setUnnamedAddr(true);
662-
663670
return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
664671
}
665672

test/CodeGenCXX/exceptions-no-rtti.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// RUN: %clang_cc1 -fno-rtti -fcxx-exceptions -fexceptions %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
22

3-
// CHECK: @_ZTIN5test11AE = linkonce_odr unnamed_addr constant
4-
// CHECK: @_ZTIN5test11BE = linkonce_odr unnamed_addr constant
5-
// CHECK: @_ZTIN5test11CE = linkonce_odr unnamed_addr constant
6-
// CHECK: @_ZTIN5test11DE = linkonce_odr unnamed_addr constant
7-
// CHECK: @_ZTIPN5test11DE = linkonce_odr unnamed_addr constant {{.*}} @_ZTIN5test11DE
3+
// CHECK: @_ZTIN5test11AE = linkonce_odr constant
4+
// CHECK: @_ZTIN5test11BE = linkonce_odr constant
5+
// CHECK: @_ZTIN5test11CE = linkonce_odr constant
6+
// CHECK: @_ZTIN5test11DE = linkonce_odr constant
7+
// CHECK: @_ZTIPN5test11DE = linkonce_odr constant {{.*}} @_ZTIN5test11DE
88

99
// PR6974: this shouldn't crash
1010
namespace test0 {

test/CodeGenCXX/rtti-fundamental.cpp

Lines changed: 60 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -15,102 +15,102 @@ namespace __cxxabiv1 {
1515
}
1616

1717
// void
18-
// CHECK: @_ZTIv = unnamed_addr constant
19-
// CHECK: @_ZTIPv = unnamed_addr constant
20-
// CHECK: @_ZTIPKv = unnamed_addr constant
18+
// CHECK: @_ZTIv = constant
19+
// CHECK: @_ZTIPv = constant
20+
// CHECK: @_ZTIPKv = constant
2121

2222
// std::nullptr_t
23-
// CHECK: @_ZTIDn = unnamed_addr constant
24-
// CHECK: @_ZTIPDn = unnamed_addr constant
25-
// CHECK: @_ZTIPKDn = unnamed_addr constant
23+
// CHECK: @_ZTIDn = constant
24+
// CHECK: @_ZTIPDn = constant
25+
// CHECK: @_ZTIPKDn = constant
2626

2727
// bool
28-
// CHECK: @_ZTIb = unnamed_addr constant
29-
// CHECK: @_ZTIPb = unnamed_addr constant
30-
// CHECK: @_ZTIPKb = unnamed_addr constant
28+
// CHECK: @_ZTIb = constant
29+
// CHECK: @_ZTIPb = constant
30+
// CHECK: @_ZTIPKb = constant
3131

3232
// wchar_t
33-
// CHECK: @_ZTIw = unnamed_addr constant
34-
// CHECK: @_ZTIPw = unnamed_addr constant
35-
// CHECK: @_ZTIPKw = unnamed_addr constant
33+
// CHECK: @_ZTIw = constant
34+
// CHECK: @_ZTIPw = constant
35+
// CHECK: @_ZTIPKw = constant
3636

3737
// char
38-
// CHECK: @_ZTIc = unnamed_addr constant
39-
// CHECK: @_ZTIPc = unnamed_addr constant
40-
// CHECK: @_ZTIPKc = unnamed_addr constant
38+
// CHECK: @_ZTIc = constant
39+
// CHECK: @_ZTIPc = constant
40+
// CHECK: @_ZTIPKc = constant
4141

4242
// unsigned char
43-
// CHECK: @_ZTIh = unnamed_addr constant
44-
// CHECK: @_ZTIPh = unnamed_addr constant
45-
// CHECK: @_ZTIPKh = unnamed_addr constant
43+
// CHECK: @_ZTIh = constant
44+
// CHECK: @_ZTIPh = constant
45+
// CHECK: @_ZTIPKh = constant
4646

4747
// signed char
48-
// CHECK: @_ZTIa = unnamed_addr constant
49-
// CHECK: @_ZTIPa = unnamed_addr constant
50-
// CHECK: @_ZTIPKa = unnamed_addr constant
48+
// CHECK: @_ZTIa = constant
49+
// CHECK: @_ZTIPa = constant
50+
// CHECK: @_ZTIPKa = constant
5151

5252
// short
53-
// CHECK: @_ZTIs = unnamed_addr constant
54-
// CHECK: @_ZTIPs = unnamed_addr constant
55-
// CHECK: @_ZTIPKs = unnamed_addr constant
53+
// CHECK: @_ZTIs = constant
54+
// CHECK: @_ZTIPs = constant
55+
// CHECK: @_ZTIPKs = constant
5656

5757
// unsigned short
58-
// CHECK: @_ZTIt = unnamed_addr constant
59-
// CHECK: @_ZTIPt = unnamed_addr constant
60-
// CHECK: @_ZTIPKt = unnamed_addr constant
58+
// CHECK: @_ZTIt = constant
59+
// CHECK: @_ZTIPt = constant
60+
// CHECK: @_ZTIPKt = constant
6161

6262
// int
63-
// CHECK: @_ZTIi = unnamed_addr constant
64-
// CHECK: @_ZTIPi = unnamed_addr constant
65-
// CHECK: @_ZTIPKi = unnamed_addr constant
63+
// CHECK: @_ZTIi = constant
64+
// CHECK: @_ZTIPi = constant
65+
// CHECK: @_ZTIPKi = constant
6666

6767
// unsigned int
68-
// CHECK: @_ZTIj = unnamed_addr constant
69-
// CHECK: @_ZTIPj = unnamed_addr constant
70-
// CHECK: @_ZTIPKj = unnamed_addr constant
68+
// CHECK: @_ZTIj = constant
69+
// CHECK: @_ZTIPj = constant
70+
// CHECK: @_ZTIPKj = constant
7171

7272
// long
73-
// CHECK: @_ZTIl = unnamed_addr constant
74-
// CHECK: @_ZTIPl = unnamed_addr constant
75-
// CHECK: @_ZTIPKl = unnamed_addr constant
73+
// CHECK: @_ZTIl = constant
74+
// CHECK: @_ZTIPl = constant
75+
// CHECK: @_ZTIPKl = constant
7676

7777
// unsigned long
78-
// CHECK: @_ZTIm = unnamed_addr constant
79-
// CHECK: @_ZTIPm = unnamed_addr constant
80-
// CHECK: @_ZTIPKm = unnamed_addr constant
78+
// CHECK: @_ZTIm = constant
79+
// CHECK: @_ZTIPm = constant
80+
// CHECK: @_ZTIPKm = constant
8181

8282
// long long
83-
// CHECK: @_ZTIx = unnamed_addr constant
84-
// CHECK: @_ZTIPx = unnamed_addr constant
85-
// CHECK: @_ZTIPKx = unnamed_addr constant
83+
// CHECK: @_ZTIx = constant
84+
// CHECK: @_ZTIPx = constant
85+
// CHECK: @_ZTIPKx = constant
8686

8787
// unsigned long long
88-
// CHECK: @_ZTIy = unnamed_addr constant
89-
// CHECK: @_ZTIPy = unnamed_addr constant
90-
// CHECK: @_ZTIPKy = unnamed_addr constant
88+
// CHECK: @_ZTIy = constant
89+
// CHECK: @_ZTIPy = constant
90+
// CHECK: @_ZTIPKy = constant
9191

9292
// float
93-
// CHECK: @_ZTIf = unnamed_addr constant
94-
// CHECK: @_ZTIPf = unnamed_addr constant
95-
// CHECK: @_ZTIPKf = unnamed_addr constant
93+
// CHECK: @_ZTIf = constant
94+
// CHECK: @_ZTIPf = constant
95+
// CHECK: @_ZTIPKf = constant
9696

9797
// double
98-
// CHECK: @_ZTId = unnamed_addr constant
99-
// CHECK: @_ZTIPd = unnamed_addr constant
100-
// CHECK: @_ZTIPKd = unnamed_addr constant
98+
// CHECK: @_ZTId = constant
99+
// CHECK: @_ZTIPd = constant
100+
// CHECK: @_ZTIPKd = constant
101101

102102
// long double
103-
// CHECK: @_ZTIe = unnamed_addr constant
104-
// CHECK: @_ZTIPe = unnamed_addr constant
105-
// CHECK: @_ZTIPKe = unnamed_addr constant
103+
// CHECK: @_ZTIe = constant
104+
// CHECK: @_ZTIPe = constant
105+
// CHECK: @_ZTIPKe = constant
106106

107107
// char16_t
108-
// CHECK: @_ZTIDs = unnamed_addr constant
109-
// CHECK: @_ZTIPDs = unnamed_addr constant
110-
// CHECK: @_ZTIPKDs = unnamed_addr constant
108+
// CHECK: @_ZTIDs = constant
109+
// CHECK: @_ZTIPDs = constant
110+
// CHECK: @_ZTIPKDs = constant
111111

112112
// char32_t
113-
// CHECK: @_ZTIDi = unnamed_addr constant
114-
// CHECK: @_ZTIPDi = unnamed_addr constant
115-
// CHECK: @_ZTIPKDi = unnamed_addr constant
113+
// CHECK: @_ZTIDi = constant
114+
// CHECK: @_ZTIPDi = constant
115+
// CHECK: @_ZTIPKDi = constant
116116

test/CodeGenCXX/rtti-linkage.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,50 +6,50 @@
66
// CHECK-WITH-HIDDEN: _ZTSFN12_GLOBAL__N_11DEvE = internal constant
77
// CHECK-WITH-HIDDEN: @_ZTSPK2T4 = linkonce_odr hidden constant
88
// CHECK-WITH-HIDDEN: @_ZTS2T4 = linkonce_odr hidden constant
9-
// CHECK-WITH-HIDDEN: @_ZTI2T4 = linkonce_odr hidden unnamed_addr constant
10-
// CHECK-WITH-HIDDEN: @_ZTIPK2T4 = linkonce_odr hidden unnamed_addr constant
9+
// CHECK-WITH-HIDDEN: @_ZTI2T4 = linkonce_odr hidden constant
10+
// CHECK-WITH-HIDDEN: @_ZTIPK2T4 = linkonce_odr hidden constant
1111

1212
// CHECK: _ZTSP1C = internal constant
1313
// CHECK: _ZTS1C = internal constant
14-
// CHECK: _ZTI1C = internal unnamed_addr constant
15-
// CHECK: _ZTIP1C = internal unnamed_addr constant
14+
// CHECK: _ZTI1C = internal constant
15+
// CHECK: _ZTIP1C = internal constant
1616
// CHECK: _ZTSPP1C = internal constant
17-
// CHECK: _ZTIPP1C = internal unnamed_addr constant
17+
// CHECK: _ZTIPP1C = internal constant
1818
// CHECK: _ZTSM1Ci = internal constant
19-
// CHECK: _ZTIM1Ci = internal unnamed_addr constant
19+
// CHECK: _ZTIM1Ci = internal constant
2020
// CHECK: _ZTSPM1Ci = internal constant
21-
// CHECK: _ZTIPM1Ci = internal unnamed_addr constant
21+
// CHECK: _ZTIPM1Ci = internal constant
2222
// CHECK: _ZTSM1CS_ = internal constant
23-
// CHECK: _ZTIM1CS_ = internal unnamed_addr constant
23+
// CHECK: _ZTIM1CS_ = internal constant
2424
// CHECK: _ZTSM1CPS_ = internal constant
25-
// CHECK: _ZTIM1CPS_ = internal unnamed_addr constant
25+
// CHECK: _ZTIM1CPS_ = internal constant
2626
// CHECK: _ZTSM1A1C = internal constant
2727
// CHECK: _ZTS1A = linkonce_odr constant
28-
// CHECK: _ZTI1A = linkonce_odr unnamed_addr constant
29-
// CHECK: _ZTIM1A1C = internal unnamed_addr constant
28+
// CHECK: _ZTI1A = linkonce_odr constant
29+
// CHECK: _ZTIM1A1C = internal constant
3030
// CHECK: _ZTSM1AP1C = internal constant
31-
// CHECK: _ZTIM1AP1C = internal unnamed_addr constant
31+
// CHECK: _ZTIM1AP1C = internal constant
3232
// CHECK: _ZTSN12_GLOBAL__N_11DE = internal constant
33-
// CHECK: _ZTIN12_GLOBAL__N_11DE = internal unnamed_addr constant
33+
// CHECK: _ZTIN12_GLOBAL__N_11DE = internal constant
3434
// CHECK: _ZTSPN12_GLOBAL__N_11DE = internal constant
35-
// CHECK: _ZTIPN12_GLOBAL__N_11DE = internal unnamed_addr constant
35+
// CHECK: _ZTIPN12_GLOBAL__N_11DE = internal constant
3636
// CHECK: _ZTSFN12_GLOBAL__N_11DEvE = internal constant
37-
// CHECK: _ZTIFN12_GLOBAL__N_11DEvE = internal unnamed_addr constant
37+
// CHECK: _ZTIFN12_GLOBAL__N_11DEvE = internal constant
3838
// CHECK: _ZTSFvN12_GLOBAL__N_11DEE = internal constant
39-
// CHECK: _ZTIFvN12_GLOBAL__N_11DEE = internal unnamed_addr constant
39+
// CHECK: _ZTIFvN12_GLOBAL__N_11DEE = internal constant
4040
// CHECK: _ZTSPFvvE = linkonce_odr constant
4141
// CHECK: _ZTSFvvE = linkonce_odr constant
42-
// CHECK: _ZTIFvvE = linkonce_odr unnamed_addr constant
43-
// CHECK: _ZTIPFvvE = linkonce_odr unnamed_addr constant
42+
// CHECK: _ZTIFvvE = linkonce_odr constant
43+
// CHECK: _ZTIPFvvE = linkonce_odr constant
4444
// CHECK: _ZTSN12_GLOBAL__N_11EE = internal constant
45-
// CHECK: _ZTIN12_GLOBAL__N_11EE = internal unnamed_addr constant
45+
// CHECK: _ZTIN12_GLOBAL__N_11EE = internal constant
4646
// CHECK: _ZTSA10_i = linkonce_odr constant
47-
// CHECK: _ZTIA10_i = linkonce_odr unnamed_addr constant
48-
// CHECK: _ZTI1TILj0EE = linkonce_odr unnamed_addr constant
49-
// CHECK: _ZTI1TILj1EE = weak_odr unnamed_addr constant
47+
// CHECK: _ZTIA10_i = linkonce_odr constant
48+
// CHECK: _ZTI1TILj0EE = linkonce_odr constant
49+
// CHECK: _ZTI1TILj1EE = weak_odr constant
5050
// CHECK: _ZTI1TILj2EE = external constant
5151
// CHECK: _ZTS1B = constant
52-
// CHECK: _ZTI1B = unnamed_addr constant
52+
// CHECK: _ZTI1B = constant
5353
// CHECK: _ZTS1F = linkonce_odr constant
5454

5555
// CHECK: _ZTIN12_GLOBAL__N_11DE to

test/CodeGenCXX/rtti-visibility.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
namespace Test1 {
88
// A is explicitly marked hidden, so all RTTI data should also be marked hidden.
99
// CHECK-TEST1: @_ZTSN5Test11AE = linkonce_odr hidden constant
10-
// CHECK-TEST1: @_ZTIN5Test11AE = linkonce_odr hidden unnamed_addr constant
10+
// CHECK-TEST1: @_ZTIN5Test11AE = linkonce_odr hidden constant
1111
// CHECK-TEST1: @_ZTSPN5Test11AE = linkonce_odr hidden constant
12-
// CHECK-TEST1: @_ZTIPN5Test11AE = linkonce_odr hidden unnamed_addr constant
12+
// CHECK-TEST1: @_ZTIPN5Test11AE = linkonce_odr hidden constant
1313
struct __attribute__((visibility("hidden"))) A { };
1414

1515
void f() {
@@ -21,7 +21,7 @@ namespace Test1 {
2121
namespace Test2 {
2222
// A is weak, so its linkage should be linkoce_odr, but not marked hidden.
2323
// CHECK-TEST2: @_ZTSN5Test21AE = linkonce_odr constant
24-
// CHECK-TEST2: @_ZTIN5Test21AE = linkonce_odr unnamed_addr constant
24+
// CHECK-TEST2: @_ZTIN5Test21AE = linkonce_odr constant
2525
struct A { };
2626
void f() {
2727
(void)typeid(A);

0 commit comments

Comments
 (0)