]> granicus.if.org Git - clang/commitdiff
Fix function type RTTI linkage and add tests.
authorAnders Carlsson <andersca@mac.com>
Tue, 29 Dec 2009 20:20:19 +0000 (20:20 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 29 Dec 2009 20:20:19 +0000 (20:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92266 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGRTTI.cpp
test/CodeGenCXX/rtti-linkage.cpp

index 937a4420ef7daf800ed8914bd8f2916e6a2a6f3b..fc1098c98589ea3b79f4d9360c2b84aaf7e8d399 100644 (file)
@@ -365,11 +365,10 @@ public:
 
     case Type::Pointer:
     case Type::MemberPointer:
-      return BuildTypeInfo(Ty);
-
     case Type::FunctionProto:
     case Type::FunctionNoProto:
-      return BuildSimpleType(Ty, "_ZTVN10__cxxabiv120__function_type_infoE");
+      return BuildTypeInfo(Ty);
+
     case Type::ConstantArray:
     case Type::IncompleteArray:
     case Type::VariableArray:
@@ -681,8 +680,13 @@ void RTTIBuilder::BuildVtablePointer(const Type *Ty) {
     break;
   case Type::MemberPointer:
     // abi::__pointer_to_member_type_info
-    VtableName =  "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
+    VtableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
     break;
+  
+  case Type::FunctionNoProto:
+  case Type::FunctionProto:
+    // abi::__function_type_info
+    VtableName = "_ZTVN10__cxxabiv120__function_type_infoE";
   }
 
   llvm::Constant *Vtable = 
@@ -730,6 +734,12 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty) {
     assert(false && "Builtin type info must be in the standard library!");
     break;
 
+  case Type::FunctionNoProto:
+  case Type::FunctionProto:
+    // Itanium C++ ABI 2.9.5p4:
+    // abi::__function_type_info adds no data members to std::type_info;
+    break;
+
   case Type::Record: {
     const CXXRecordDecl *RD = 
       cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
index 11f328a1e48eb619bee2b1122262ed8269cb69a9..b4caa8622907815da1a3c82a865554c57a75756a 100644 (file)
 // CHECK: _ZTIN12_GLOBAL__N_11DE = internal constant
 // CHECK: _ZTSPN12_GLOBAL__N_11DE = internal constant
 // CHECK: _ZTIPN12_GLOBAL__N_11DE = internal constant
+// CHECK: _ZTSFN12_GLOBAL__N_11DEvE = internal constant
+// CHECK: _ZTIFN12_GLOBAL__N_11DEvE = internal constant
+// CHECK: _ZTSFvN12_GLOBAL__N_11DEE = internal constant
+// CHECK: _ZTIFvN12_GLOBAL__N_11DEE = internal constant
+
+// CHECK: _ZTSPFvvE = weak_odr constant
+// CHECK: _ZTSFvvE = weak_odr constant
+// CHECK: _ZTIFvvE = weak_odr
+// CHECK: _ZTIPFvvE = weak_odr constant
 
 // A has no key function, so its RTTI data should be weak_odr.
 struct A { };
@@ -64,7 +73,13 @@ const D getD();
 
 const std::type_info &t2() {
   (void)typeid(const D);
-  (void)typeid(D *);  
+  (void)typeid(D *);
+  (void)typeid(D (*)());
+  (void)typeid(void (*)(D));
+  // The exception specification is not part of the RTTI descriptor, so it should not have
+  // internal linkage.
+  (void)typeid(void (*)() throw (D));
+  
   // CHECK: _ZTIN12_GLOBAL__N_11DE to
   return typeid(getD());  
 }